API operations

Endpoints

MethodPathDescription
GET/data/downloadRequest or download consumer deletion request data as a ZIP archive
POST/data/uploadUpload new status response files
POST/data/amendCorrect or update previously submitted status responses

Base URL: https://api.drop.privacy.ca.gov

Download

GET /data/download

Request the current ZIP archive. If the ZIP is ready, the response returns the ZIP file. If the ZIP is still being prepared, the response returns a JSON message and the data broker should call GET /data/download again later.

Request headers:

X-API-KEY: your-api-key-here
Accept: application/zip, application/json

Curl example:

 curl -X GET "https://api.drop.privacy.ca.gov/data/download" \
  -H "accept: application/zip, application/json" \
  -H "X-API-KEY: your-api-key-here" \
  --output download.zip

PowerShell example:

$apiKey = "your-api-key-here"
$url = "https://api.drop.privacy.ca.gov/data/download"
$headers = @{
    "X-API-KEY" = $apiKey
    "Accept" = "application/zip, application/json"
}
Invoke-WebRequest -Uri $url -Headers $headers -OutFile "download.zip"

Response codes:

CodeMeaningAction
200 ZIPZIP is ready and returned in the responseDownload and process the ZIP
200 No dataNo new consumer request data is availableNo action needed. Try again later based on your processing schedule
202 PreparingThe request was received and the download is being preparedCall GET /data/download again later
401 UnauthorizedAPI key is missing or invalidFix or regenerate the API key and try again
403 ForbiddenBroker is not eligible to download dataResolve account, registration, payment, or access issue and try again
403 No selected listsBroker has not selected any list typesNo identifier list preferences are enabled. Select+ at least one list and try again.
404 Not FoundEndpoint URL is wrong or resource path does not existCorrect the URL/path and retry
429 Too Many RequestsToo many requestsWait 30 seconds and retry
500 Server ErrorTemporary system errorRetry later

ZIP response:

HTTP/1.1 200 OK 
Content-Type: application/zip 
Content-Disposition: attachment; filename="20260312_4821_DROP.zip"

JSON responses:

{"message":"Complete the current batch or contact DROP support if a re-download is needed."} 

ZIP contents:

The ZIP contains one CSV per selected list type. If a selected list has no new records, the CSV contains only the header row. If any previously delivered identifiers were removed, the ZIP also includes one Removed CSV file.

File exampleList
20260312_4821_Email.csvEmail
20260312_4821_NDZ.csv First Name + Last Name + DOB + ZIP
20260312_4821_Removed.csvRemoved identifiers across all selected list types

Upload

There are two upload endpoints. Both accept the same multipart/form-data request. Only the purpose differs.

POST /data/upload

Upload new status responses.

POST /data/amend

Upload a correction or update to responses submitted previously.

Request format

Both endpoints use multipart/form-data with the field name files.

Request headers:

X-API-KEY: your-api-key-here
Content-Type: multipart/form-data
Accept: application/json

Curl example (new):

 curl -X POST "https://api.drop.privacy.ca.gov/data/upload" \
  -H "accept: application/json" \
  -H "X-API-KEY: your-api-key-here" \
  -F "files=@20260312_4821_Email.csv;type=text/csv"

Curl example (amend):

curl -X POST "https://api.drop.privacy.ca.gov/data/amend" \
  -H "accept: application/json" \
  -H "X-API-KEY: your-api-key-here" \
  -F "files=@20260312_4821_Email.csv;type=text/csv"

Response format

Both endpoints return JSON showing which files were accepted for processing and which files were rejected.

Accepted files are queued for validation. Full row-level validation may continue after the response is returned.

FieldTypeDescription
messagestringSummary of the upload result
acceptedCountintegerNumber of files accepted for validation
rejectedCountintegerNumber of files rejected before validation
acceptedarrayFiles accepted for validation, each with file name and file size bytes
rejectedarrayFiles rejected before validation, each with file name and message

JSON responses:

Example response with accepted files:

{
   { 
  "message": "Upload received. Accepted files were queued for validation.", 
  "acceptedCount": 1, 
  "rejectedCount": 0, 
  "accepted": [ 
    { 
      "fileName": "20260312_4821_Email.csv", 
      "fileSizeBytes": 2849112 
    } 
  ], 
  "rejected": [] 
} 

Example response with accepted and rejected files:

{
   { 
  "message": "Upload received. Accepted files were queued for validation. Rejected files were not accepted.", 
  "acceptedCount": 1, 
  "rejectedCount": 1, 
  "accepted": [ 
    { 
      "fileName": "20260312_4821_Email.csv", 
      "fileSizeBytes": 2849112 
    } 
  ], 
  "rejected": [ 
    { 
      "fileName": "notes.txt", 
      "message": "Only CSV files are accepted." 
    } 
  ] 
} 

Common rejection messages

MessageMeaning
No CSV file was providedThe request did not include a CSV file
Only CSV files are acceptedThe uploaded file is not a CSV file
Invalid CSV header. Expected: Id,Status.The first row is not exactly Id,Status
A file with this name was already uploaded for the current download. Use a unique suffix and try againThe file name was already used for this download
File could not be read as UTF-8 CSVThe file is unreadable or not UTF-8 encoded

Retry guidance

ScenarioRetry?Notes
429 Too Many RequestsYesWait 30 seconds and try again
500 Server ErrorYesRetry later
401 UnauthorizedNoCorrect or regenerate the API key before trying again
403 ForbiddenNoResolve the account, registration, payment, or access issues, and select at least one list type before trying again
404 Not FoundNoFix the URL or path before trying again
400 Bad RequestNoFix the request, file, or CSV format before retrying
409 ConflictNoComplete the required action before trying
Duplicate file name rejectionNoUse a unique optional suffix in the file name and upload again
Invalid CSV header rejectionNoFix the header to Id,Status and upload again
Wrong file type rejection NoUpload a CSV file
File unreadable rejectionNoSave the file as UTF-8 CSV and upload again