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 used in the examples below: https://api.drop.privacy.ca.gov

Download

GET /data/download

Requests 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 OK - ZIPZIP is ready and returned in the responseDownload and process the ZIP
200 OK - No dataNo new consumer request data is availableNo action needed. Try again later based on your processing schedule
202 Accepted -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 Forbidden - 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 response example:

{"message”:”No identifier list preferences are enabled. Select at least one list and try again."} 

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 codes

CodeMeaningAction
202 AcceptedAt least one file was accepted and queued for validationReview accepted and rejected (if any) file results
400 Bad RequestRequest is malformed or no files were acceptedFix the request or rejected files and try again
401 UnauthorizedAPI key is missing or invalidFix or regenerate the API key and try again
403 ForbiddenBroker is not eligible to upload responsesResolve account, registration, payment, or access issue and try again
404 Not FoundEndpoint URL is wrong or resource path does not existCorrect the URL/path and retry
403 Forbidden - No selected listsNo upload expected as no records outstandingUse GET /data/download to request or download a new ZIP file.
429 Too Many RequestsToo many requestsWait 30 seconds and retry
503 Server ErrorTemporary system errorRetry later

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.

File rejection messages

RejectionMessage
No CSV file providedNo CSV file was provided
Wrong file typeOnly CSV files are accepted
Invalid headerInvalid CSV header. Expected: Id,Status
Duplicate file nameA file with this name was already uploaded for the current download. Use a unique suffix and try again
File unreadableFile could not be read as UTF-8 CSV

Response format

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." 
    } 
  ] 
} 

Error handling

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 provided in the message 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