DROP Technical and API Reference Documentation
The information below will assist you with building your integration, whether API-based or manual, with DROP for purposes of deletion request processing. These documents are provided for guidance only. You are responsible for ensuring your own compliance and accuracy.
Please be aware that this document is not exhaustive and that your business is responsible for ensuring compliance with all applicable statutory and regulatory requirements. Read the full text of the regulations at cppa.ca.gov/regulations.
Getting Started
Getting Started
You may build your integration using the DROP Data Broker API or by using the manual download/upload option. For either option, you need to complete the steps below.
- Download hashed consumer deletion list(s) from DROP.
- Match the hashed identifiers in those list(s) against your own records.
- Upload a status file indicating whether each record was deleted, opted out, exempted, or not found.
This guide provides information about the integration workflow, working with the data in DROP, and more. If you elect to build your integration via API, you can use the information in this document to confirm account setup, authentication, and processing via API.
Who this documentation is for
- Data Brokers
- Engineering Teams building automated download-and-upload integrations
- Quality Assurance, operations, and compliance staff supporting the integration lifecycle
Prerequisites for integration
Before you begin, ensure you have an account in DROP and have registered (if applicable) and paid any required fees.
If you elect to integrate via API, please also ensure you have the following:
| Requirement | Details |
|---|---|
| API key | Generated after selecting your consumer deletion list(s) |
| HTTPS client | Ability to make GET and POST requests over TLS 1.2+ (for example, curl, PowerShell, or any HTTP library) |
| CSV handling | Ability to read and write CSV files following the required naming convention |
| Secret storage | Secure storage for API keys |
| Logging | Ability to log request timestamps and upload/download outcomes |
API base URL
| Environment | URL |
|---|---|
| Production | https://api.drop.privacy.ca.gov |
| Sandbox | https://api.drop.privacy.ca.gov/sandbox |
Authentication
All API requests require an API key passed in the X-API-KEY header:
X-API-KEY: your-api-key-here
Your API key is scoped to the consumer deletion list(s) you select. Only the selected list(s) will appear in your downloads.
API key security
- Store keys securely using environment variables or secret management systems
- Regenerate keys if compromised or if list selection changes
Obtain an API key
- Sign in to the Data Broker Portal.
- For production integration, navigate to Home -> Consumer Deletion Lists.
- Select the list(s) your organization will process.
- Click Save.
- Open the API Key tab.
- Click Get a new API key.
Your key is now ready to use.
During sandbox testing, navigate to Sandbox Environment -> Issue Sandbox API Key.
API Quick start
- Obtain an API key and confirm your selected consumer deletion list(s).
- Verify connectivity with an authenticated request.
- Download the current ZIP archive.
- Extract and process the CSV files.
- Upload response CSV(s) using the original file name.
- Inspect the JSON response for accepted and rejected files.
Step 1 - Verify connectivity
Send a request to confirm your API key works:
curl -X GET "https://api.drop.privacy.ca.gov/data/download" \
-H "accept: */*" \
-H "X-API-KEY: your-api-key-here" \
-I
A 200 OK response confirms authentication.
401 Unauthorizedindicates that an incorrect API key was entered. Correct the key or generate a new one and try again.403 Forbiddenindicates that registration, if applicable, and payment of required fees is incomplete. Confirm account status in the data broker portal and try again.
Step 2 - Download consumer data
curl -X GET "https://api.drop.privacy.ca.gov/data/download" \
-H "accept: */*" \
-H "X-API-KEY: your-api-key-here" \
--output download.zip
PowerShell alternative:
$apiKey = "your-api-key-here"
$url = "https://api.drop.privacy.ca.gov/data/download"
$headers = @{
"X-API-KEY" = $apiKey
"Accept" = "text/zip"
}
Invoke-WebRequest -Uri $url -Headers $headers -OutFile "download.zip"
The response is a ZIP archive containing one CSV file per selected consumer deletion list. See Working With the Data - Downloaded File Schema and Working With the Data - File Naming Convention.
Step 3 - Process records
Extract the ZIP and read each CSV. Match the hashed identifiers against your records and determine the appropriate action. See Workflow for basic information about the deletion request processing lifecycle.
Step 4 - Upload your response
Respond by uploading one or more CSV files (not the ZIP archive) that contain the Id and Status columns. Each response CSV must use the same file name as the corresponding file from your download.
If you need to upload multiple response files for the same downloaded list, add a suffix to the file name using an underscore followed by up to 10 alphanumeric characters. For example: 20260312_4821_Email_01.csv. Uploading the same file name again without a suffix will result in an error.
You may upload a full or partial response in each file. If you upload only a partial response, you can provide the remaining records later by uploading additional files with the same base file name and different suffixes.
curl -X POST "https://api.drop.privacy.ca.gov/data/upload" \
-H "accept: */*" \
-H "X-API-KEY: your-api-key-here" \
-H "Content-Type: multipart/form-data" \
-F "files=@20260312_4821_Email_retry01.csv;type=text/csv" \
-F "files=@20260312_4821_Phone.csv;type=text/csv" \
-F "files=@20260312_4821_NDZ.csv;type=text/csv"
A successful response:
{
"mode": "new",
"acceptedCount": 3,
"rejectedCount": 0,
"accepted": [
{
"fileName": "20260312_4821_Email_retry01.csv",
"message": "Accepted. NEW file queued for processing."
},
{
"fileName": "20260312_4821_Phone.csv",
"message": "Accepted. NEW file queued for processing."
},
{
"fileName": "20260312_4821_NDZ.csv",
"message": "Accepted. NEW file queued for processing."
}
],
"rejected": []
}
If you need to correct a previous submission, use the /data/amend endpoint. See Operations for details.
Step 5 - Confirm successful integration
A successful integration via API indicates you are able to:
- Authenticate against the API
- Download and extract a ZIP archive
- Read CSV files and understand the schema
- Produce a correctly named response CSV with
Id,Statuscolumns - Upload the response and receive confirmation
Confirm that you can complete all of the steps above prior to automating the end-to-end processing workflow.
Integration Workflow
Integration Workflow
Deletion request processing is an ongoing pull-process-respond cycle, not a one-time integration. The steps below summarize that cycle.
For more information on the legal requirements related to deletion request processing, including relevant timelines for ongoing processing, see California Civil Code section 1798.99.80 et seq. and California Code of Regulations CCR), title 11, section 7600 et seq.
┌──────────────────────────────────────────────────────────┐
│ 1. Set up account and register, if applicable (one-time)│
│ 2. Generate API key (one-time or as needed) │
│ 3. Download ZIP archive ──────────────────┐ │
│ 4. Extract and read CSV(s) │ │
│ 5. Match against your records │ Repeat │
│ 6. Take required action for each match │ │
│ 7. Upload status CSV(s) ───────────────────┘ │
└─────────────────────────────────────────────────────────-┘
Step by step
1. Set up your account (one-time)
Create an account in DROP, complete registration, if applicable, and pay required fees, and select the consumer deletion list(s) you will process. See Getting Started.
2. Generate your API key (if integrating via API)
Generate an API key in the portal. The key is scoped to your selected consumer deletion list(s). See Getting Started - Obtain an API Key.
NOTE: Integration via API is not required. You may use the manual download/upload option instead.
3. Download data
Call GET /data/download to retrieve a ZIP archive containing one CSV file per selected consumer deletion list. Each CSV contains hashed consumer identifiers included in deletion requests.
4. Extract and read
Unzip the archive and read each CSV file. Files use the naming convention described in Working With the Data - File Naming Convention. Preserve the exact file name - for the CSV file, you will need it when uploading your response.
5. Match records
Compare each hashed identifier against your own records. The hashing and standardization rules are documented in Working With the Data - Hashing and Standardization.
6. Process records based on match outcomes
Use the following status codes when reporting match outcomes:
| Code | Label | Meaning |
|---|---|---|
| 2 | Exempted | Match found and personal information is exempt |
| 3 | Deleted | Match found and non-exempt personal information was deleted |
| 4 | Opted out | Multiple consumers are linked to the same identifier and all were opted out of sale or sharing |
| 5 | Not found | No match found after completing the matching process |
For more information on the legal requirements based on match outcomes, see California Civil Code section 1798.99.80 et seq. and CCR, title 11, section 7600 et seq.
NOTE: You must direct all service providers or contractors to process deletions and opt outs based on the match outcomes above.
7. Upload status response
Create a CSV with Id,Status columns, using the exact file name from the download. Upload it using:
POST /data/uploadfor a first-time submission for a given runPOST /data/amendfor corrections to a previous submission
See Operations - Upload for details.
Validation
DROP validates the following for every upload:
- API key must be present and valid
- Uploads must use
multipart/form-datawith the field namefiles - File name must match the downloaded file exactly
- CSV header must be
Id,Status - Status values must be
2,3,4, or5
If validation fails, the API returns an HTTP error or a file-level rejection message. See Error Handling in API operations section.
NOTE: We will send an email to the primary and secondary contact email addresses listed on your account if there are errors with your upload. Carefully review the error details in the email, correct them, and resubmit.
Schedules and retries
Daily maintenance window
DROP closes push and pull requests between 1:00 AM and 3:00 AM Pacific Time daily to batch the most current data.
- During this window: Requests may fail. Do not treat these as permanent errors.
- Outside this window: Normal download and upload operations are available.
Ensure any automation schedules account for the daily maintenance window.
Confirmation
After uploading, check the response body:
{
"mode": "new",
"acceptedCount": 1,
"rejectedCount": 0,
"accepted": [
{
"fileName": "20260312_4821_Email.csv",
"message": "Accepted. NEW file queued for processing."
}
],
"rejected": []
}
acceptedCount > 0means your file is queued for processing.rejectedCount > 0means you should review therejectedarray for error messages and correct the file before resubmitting.
Retry strategy
| Scenario | Action |
|---|---|
| Request during the daily maintenance window | Wait until after 3:00 AM PT, then retry |
429 Too Many Requests |
Wait 30 seconds and try again |
500 Server Error |
Retry later |
401 Unauthorized |
Fix or regenerate the API key and try again |
403 Forbidden |
Complete registration if applicable and pay all fees, then try again. |
| Invalid file name or CSV header | Fix the file and resubmit. Resubmitting the same invalid file will fail again. |
API Failure
If you are unable to use the API for any reason, you must use the manual upload and/or download option in the portal.
Working With the Data
Working With the Data
Understanding the Data
Each downloaded file contains consumer deletion request data. Every row includes an ID column that identifies a single work item. The corresponding Hash or ConcatenatedHash column contains the hashed consumer identifier you will compare against your own records.
Your response file should include that same work item identifier in the Id column alongside the status you assign.
Consumer Deletion Lists
DROP delivers consumer deletion request data organized by list type. There are six list types, and each list includes one or more consumer identifiers. When you generate your API key, you select which list(s) you will process. The download will contain one CSV file per selected list.
Data brokers must select every consumer deletion list containing a consumer identifier corresponding to personal information about that consumer within the data broker’s own records.
However, a data broker may select fewer lists if the consumer identifiers used across multiple lists would lead to matches with the exact same set of consumers in the data broker’s records.
| Code | Identifier | Type |
|---|---|---|
NDZ |
First Name + Last Name + Date of Birth + ZIP | Concatenated hash |
Email |
Email address | Single-field hash |
Phone |
Phone number | Single-field hash |
MAID |
Mobile advertising ID | Single-field hash |
NameVIN |
First Name + Last Name + VIN | Concatenated hash |
CTVID |
Connected TV identifier | Single-field hash |
Consumer Data Properties
| Property | Format | Details |
|---|---|---|
| Name | Separate first name and last name fields | Names are collected, standardized, and hashed separately |
| Date of Birth | YYYYMMDD |
Eight digits, four-digit year |
| ZIP Code | Up to 5 alphanumeric characters | First five characters after stripping non-alphanumeric characters |
| String | Validated as a valid email address | |
| Phone | Last 10 digits only | Strip non-numeric characters, then keep the last 10 digits |
| MAID | 32 hexadecimal characters | Mobile Advertising ID |
| VIN | 17 alphanumeric characters | Vehicle Identification Number |
| CTVID | 8 to 32 alphanumeric characters | Unique device identifier for smart TVs, streaming players, and gaming consoles |
Endpoints
GET /data/downloadPOST /data/uploadPOST /data/amend
File Naming Convention
Downloaded and uploaded CSV files share the same naming convention. You must use the exact file name from the download when uploading your response. Optionally, you may append an underscore followed by up to 10 alphanumeric characters to differentiate multiple uploads.
<YYYYMMDD>_<DataBrokerId>_<DataType>[_<OptionalSuffix>].csv
| Field | Description |
|---|---|
YYYYMMDD |
File date |
DataBrokerId |
Your short broker identifier, currently 4 digits. This ID is provided in the file name you download |
DataType |
List type code: NDZ, Email, Phone, MAID, NameVIN, or CTVID |
OptionalSuffix |
Optional. Up to 10 alphanumeric characters to differentiate uploads |
Example file names:
20260312_4821_NDZ.csv
20260312_4821_Email.csv
20260312_4821_NameVIN.csv
20260312_4821_Email_part01.csv
File encoding and formats
- CSV encoding: UTF-8
- Hash input encoding: UTF-8
- Hash output format: Base64
The download response is a ZIP archive containing CSV files. Uploads are individual CSV files sent via multipart/form-data.
Downloaded File Schema
The CSV schema depends on the list type.
Single-field lists (Email, Phone, MAID, CTVID)
| Column | Description |
|---|---|
ID |
Work item identifier |
Hash |
SHA-256 Base64 hash of the consumer identifier |
Example (Email):
ID,Hash
679,KA18MT/ph6IHYjzT9zwETySDQyvSh87YuoSBpOQtkhE=
Concatenated-hash lists (NDZ, NameVIN)
| Column | Description |
|---|---|
ID |
Work item identifier |
ConcatenatedHash |
SHA-256 Base64 hash of the concatenated fields |
Example (NDZ):
ID,ConcatenatedHash
679,PQOfn1RffEKmqMmNAzDKKaoZCwxWbQZkQzPWmQo9REA=
Upload File Schema
Your response file must use the header Id,Status and the exact file name from the download.
| Column | Description |
|---|---|
Id |
Work item identifier from the downloaded file |
Status |
Numeric status code |
Example:
Id,Status
679,2
680,5
681,4
Status Codes
| Code | Label | Meaning |
|---|---|---|
| 2 | Exempted | Match found and all personal information is exempt |
| 3 | Deleted | Match found and non-exempt personal information was deleted |
| 4 | Opted out | Multiple consumers are linked to the same identifier and all were opted out of sale or sharing |
| 5 | Not found | No match found after completing the matching process |
For more information on the legal requirements based on match outcomes, see California Civil Code section 1798.99.80 et seq. and CCR, title 11, section 7600 et seq.
Hashing and Standardization
All consumer identifiers in DROP are SHA-256 hashed. Before hashing, you must standardize each value according to the rules below.
General rules
- Apply the identifier-specific standardization described below.
- Hash with SHA-256 using UTF-8 input encoding.
- Output as Base64.
Tip: A SHA-256 Base64 hash is typically 44 characters and commonly ends with =.
Name standardization
Names are stored as separate first name and last name values.
- Replace accented Latin characters with plain ASCII equivalents
- Transliterate Greek and Cyrillic characters to Latin equivalents
- Leave Chinese, Japanese, Korean, Arabic, and Hebrew characters unchanged
- Treat compound first names as a single unit, for example
Juan Pablobecomesjuanpablo - Remove hyphens, apostrophes, and spaces
- Use lowercase values
Hashing example:
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
| Juan Pablo | juanpablo |
91hIbrbzNeqHs3o81O5yNrXUj7wDd2shvZ6THKi9qz8= |
| Martinez | martinez |
2wRPGbwBNxhShjRczx8GfS2c4cjvs4NJskeWloUNtp8= |
Date of Birth standardization
Convert to YYYYMMDD format. Use a four-digit year.
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
| July 4, 1776 | 17760704 |
skXYXxBER6HQTZ3rXSZH1wVGLQ054mS5rbR/bwvzy4I= |
ZIP Code standardization
Keep alphanumeric only, use only lowercase values, remove leading zeros, take first 5 characters.
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
91790-3771 |
91790 |
2FPZucR4x7U8KlM+SFAX4LPGhwNz/PIZUCSUdDh0o/s= |
M1B 1A1 |
m1b1a |
n8L9q8mVeT6Xt9/EeUNiTukGDrkbPJ3DvOEx14uElxk= |
712345 |
71234 |
aeNUYKh7Xw5sqpxSbSP9eOHsj6iXewbUyavv89DIuhQ= |
Email standardization
Only trim whitespace and convert to lowercase. Do not remove dots, plus signs, or other characters.
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
[email protected] |
[email protected] |
KA18MT/ph6IHYjzT9zwETySDQyvSh87YuoSBpOQtkhE= |
[email protected] |
[email protected] |
mKDnDvwF2inxrKcK1hJN2TRkxPfL6kzNNTtU12eH8Bw= |
Phone standardization
Strip all non-numeric characters. Use the last 10 digits, or all digits if fewer than 10 are present.
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
+1(415)555-9317 |
4155559317 |
vGM7y5n+hBXRSEAklhHDPCbysyNgYTmXdMcagGUOY8E= |
+84(90)123 4567 |
4901234567 |
ptzVkgbv9DonwvPCHmXmJ2SEOaolSh37z3ZzY/Gmm+U= |
+354(123)4567 |
3541234567 |
Btrzydf5K6ALAKKXJGFHSx7u5bDzHC9WlVYtpq1n2rY= |
5551273811 |
5551273811 |
jr/RAWYVN+ODBf2vRxwBASPwiO4x27OGI1y3IDhcwLo= |
VIN standardization
Keep only alphanumeric characters and convert to lowercase.
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
1HGCM82633A004352 |
1hgcm82633a004352 |
iNswy1m+0VSt8jAfFrvaiQ1R/0HAbgSwNGkwqo6QBss= |
MAID standardization
Keep only hexadecimal characters (0-9, a-f) and convert to lowercase.
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
a3f1c2d4-5678-90ab-cdef-1234567890ab |
a3f1c2d4567890abcdef1234567890ab |
250KY6lOgzYUB3EHrkbDCE2kMEZQE69SF38muhoDudI= |
CTVID standardization
Keep only alphanumeric characters and convert to lowercase.
Length constraints after standardization:
- Minimum length:
8 - Maximum length:
32
| Input | Standardized | SHA-256 Base64 |
|---|---|---|
B7e4f9a1-2345-6789-ABCD-ef0123456789 |
b7e4f9a123456789abcdef0123456789 |
MyXj2jIgpIH1LGsXl/fzPSswwbsIl2rKPct7GOYbnIY= |
Composite Hashing
The NDZ and NameVIN list types use composite hashing - a multi-step process that hashes individual fields first, then hashes the concatenated result.
NDZ: Name + Date of Birth + ZIP
- Standardize and hash each field separately (
SHA-256, UTF-8, Base64). - Concatenate the four Base64 hashes in this order:
FirstName + LastName + DOB + ZIP. - Hash the concatenated string using the same method.
Example: Danielle Johnson, DOB July 4, 1985, ZIP 91790.
| Field | Standardized | SHA-256 Base64 |
|---|---|---|
| First Name | danielle |
5dUD1FgiKcTJq+JQ5JZUdlyIXrSbtJ338YYbt5/HNG4= |
| Last Name | johnson |
K+TjOqPiH2/3rRRPj9WCKKHM47UDQLSAX/DGNIDuxIg= |
| DOB | 19850704 |
IWi7qxOAbBJe0fNciDj76Eg84gmj40rB7aNMK/VnFOI= |
| ZIP | 91790 |
2FPZucR4x7U8KlM+SFAX4LPGhwNz/PIZUCSUdDh0o/s= |
Concatenated string:
5dUD1FgiKcTJq+JQ5JZUdlyIXrSbtJ338YYbt5/HNG4=K+TjOqPiH2/3rRRPj9WCKKHM47UDQLSAX/DGNIDuxIg=IWi7qxOAbBJe0fNciDj76Eg84gmj40rB7aNMK/VnFOI=2FPZucR4x7U8KlM+SFAX4LPGhwNz/PIZUCSUdDh0o/s=
Final hash: PQOfn1RffEKmqMmNAzDKKaoZCwxWbQZkQzPWmQo9REA=
NameVIN: Name + VIN
- Standardize and hash each field separately (
SHA-256, UTF-8, Base64). - Concatenate the three Base64 hashes in this order:
FirstName + LastName + VIN. - Hash the concatenated string using the same method.
For consumers with multiple VINs, generate all Name x VIN combinations.
Example: Eve Genesis, VIN 1HGCM82633A004352.
| Field | Standardized | SHA-256 Base64 |
|---|---|---|
| First Name | eve |
hSYq33RRi7twx8uUzWFZ2RZp5age3x7+vVQ+rb2p+is= |
| Last Name | genesis |
ruutSnlvzC4V3ExgYbRe2bNz8mrfx5jKfS2MxYGCcY4= |
| VIN | 1hgcm82633a004352 |
iNswy1m+0VSt8jAfFrvaiQ1R/0HAbgSwNGkwqo6QBss= |
Final hash: rtnDuXIe63jXYQQXW5r07GJ7lSsrib8+46QuKFwkOmk=
API Operations
API Operations
The canonical machine-readable reference is openapi.yaml. Load it in Postman, Swagger or any OpenAPI-compatible tool for an interactive view.
Endpoints
| Method | Path | Description |
|---|---|---|
GET |
/data/download |
Download consumer deletion request data as a ZIP archive |
POST |
/data/upload |
Upload a new status response file |
POST |
/data/amend |
Amend a previously uploaded response file |
Base URL used in the examples below: https://api.drop.privacy.ca.gov
Download
GET /data/download
Retrieves a ZIP archive containing one CSV file per selected consumer deletion list.
Request headers:
X-API-KEY: your-api-key-here
Accept: text/zip
curl example:
curl -X GET "https://api.drop.privacy.ca.gov/data/download" \
-H "accept: */*" \
-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" = "text/zip"
}
Invoke-WebRequest -Uri $url -Headers $headers -OutFile "download.zip"
Response: binary ZIP file containing CSV files such as:
20260312_4821_NDZ.csv
20260312_4821_Email.csv
Upload
There are two upload endpoints. Both accept the same multipart/form-data request. Only the mode differs.
POST /data/upload
Upload a response file for the first time for a given downloaded file.
POST /data/amend
Upload a correction or update to a previously submitted response.
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: */*
curl example (new):
curl -X POST "https://api.drop.privacy.ca.gov/data/upload" \
-H "accept: */*" \
-H "X-API-KEY: your-api-key-here" \
-H "Content-Type: multipart/form-data" \
-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: */*" \
-H "X-API-KEY: your-api-key-here" \
-H "Content-Type: multipart/form-data" \
-F "files=@20260312_4821_Email.csv;type=text/csv"
Response format
Both endpoints return JSON:
{
"mode": "new",
"acceptedCount": 1,
"rejectedCount": 0,
"accepted": [
{
"fileName": "20260312_4821_Email.csv",
"message": "Accepted. NEW file queued for processing."
}
],
"rejected": []
}
| Field | Type | Description |
|---|---|---|
mode |
string | "new" or "amend" |
acceptedCount |
integer | Number of files accepted |
rejectedCount |
integer | Number of files rejected |
accepted |
array | Files successfully queued, each with fileName and message |
rejected |
array | Files rejected, each with fileName and message describing the error |
Rejection messages
| Message | Cause | Fix |
|---|---|---|
Invalid CSV header. Expected: Id,Status |
CSV header row does not match schema | Make the first row exactly Id,Status |
You already uploaded a file with the same filename for this run. |
A file with the same name was already submitted for this run | Use a unique optional suffix in the file name and upload again, for example _retry01 |
Example rejected response:
{
"mode": "new",
"acceptedCount": 0,
"rejectedCount": 1,
"accepted": [],
"rejected": [
{
"fileName": "20260312_4821_Email.csv",
"message": "Invalid CSV header. Expected: Id,Status"
}
]
}
Error Handling
HTTP Response Codes
| Code | Meaning | Remediation steps |
|---|---|---|
200 |
Success | API request submitted successfully |
400 |
Bad request | Check file formatting, file name, and CSV columns. Fix before retrying |
401 |
Unauthorized | Incorrect API key. Correct or regenerate it in the Data Broker Portal before trying again |
403 |
Forbidden | Complete registration if applicable and pay all fees, then try again |
404 |
Not found | The endpoint URL cannot be found. Correct the path and try again |
429 |
Too many requests | Wait 30 seconds before sending another API call |
500 |
Server error | Server may be unavailable or in a maintenance window. Retry later |
Retry guidance
| Scenario | Retry? | Notes |
|---|---|---|
429 Too Many Requests |
Yes | Wait 30 seconds and try again. |
500 Server Error |
Yes | Retry later |
| Request during maintenance window | Yes | Retry after 3:00 AM PT |
401 Unauthorized |
No | Regenerate or correct the API key first |
403 Forbidden |
No | Complete registration if applicable and pay all fees, then try again. |
404 Not Found |
No | Fix the URL and try again |
400 Bad Request |
No | Fix the file or request and try again |
| Duplicate file name rejection | No | Use a unique optional suffix in the file name and upload again |
| Invalid CSV header rejection | No | Fix the header to Id,Status |
Rate Limits and Schedules
- Push and pull requests are closed between
1:00 AMand3:00 AMPacific Time daily. - Rate limits may be adjusted automatically based on system load.
You need to schedule automated jobs outside the maintenance window and use exponential backoff for 429 Too Many Requests. 429 Too Many Requests.
Reference
Reference
Glossary
| Term | Definition |
|---|---|
| DROP | Delete Request and Opt-out Platform — the platform created by the California Privacy Protection Agency (CalPrivacy) for consumers to submit deletion and opt-out requests and for data brokers to retrieve and respond to them |
| Delete Act | California law requiring data brokers to process consumer deletion requests through DROP (see Civil Code section 1798.99.80 et seq.) |
| CPPA or “CalPrivacy” | The California Privacy Protection Agency — the state agency that responsible for the DROP |
| API key | The credential sent in the X-API-KEY header to authenticate API requests |
| Data broker ID | The unique identifier assigned to your organization, used in file naming |
| Consumer deletion list | A list containing one or more hashed consumer identifiers, for example Email, Phone, or NDZ, that consumers provided as part of a deletion request |
| Work item | A single consumer deletion request record identified by its ID in a CSV file |
| NDZ | Name + Date of Birth + ZIP - a concatenated-hash list type |
| MAID | Mobile Advertising Identifier |
| VIN | Vehicle Identification Number |
| CTVID | Connected TV Identifier - covers smart TVs, streaming players, and gaming consoles |
| NameVIN | Name + VIN - a concatenated-hash list type |
| New upload | The first submission of a response file for a given download run |
| Amend upload | A correction or update to a previously submitted response file |
| Composite hash | A multi-step hash where individual fields are hashed first, concatenated, then hashed again |
| Maintenance window | Daily 1:00 AM to 3:00 AM Pacific Time period when push and pull requests are closed |
Status Code Reference
| Code | Label | Meaning |
|---|---|---|
| 2 | Exempted | Match found and all personal information is exempt |
| 3 | Deleted | Match found and non-exempt personal information was deleted |
| 4 | Opted out | Multiple consumers are linked to the same identifier and all were opted out of sale or sharing |
| 5 | Not found | No match found after completing the matching process |
For more information on the legal requirements based on match outcomes, see California Civil Code section 1798.99.80 et seq. and CCR, title 11, section 7600 et seq.
HTTP Response Codes
| Code | Meaning | Remediation steps |
|---|---|---|
200 |
Success | API request submitted successfully |
400 |
Bad request | Check file formatting, file name, and CSV columns. Fix before retrying |
401 |
Unauthorized | Incorrect API key. Correct or regenerate it in the Data Broker Portal before trying again |
403 |
Forbidden | Complete registration if applicable and pay all fees, then try again. |
404 |
Not found | The endpoint URL cannot be found. Correct the path and try again |
429 |
Too many requests | Wait 30 seconds and try again. |
500 |
Server error | Server may be down for maintenance. Retry later |
File Naming Pattern
<YYYYMMDD>_<DataBrokerId>_<DataType>[_<OptionalSuffix>].csv
See Working With the Data - File Naming Convention for field definitions and examples.
Documentation Map
| Document | Audience | Contents |
|---|---|---|
| Getting Started | All | Account setup, authentication, API key generation, quick start |
| Integration Workflow | All | The download-process-upload cycle, validation, retries |
| Working With the Data | Technical | List types, file schemas, standardization rules, hashing examples |
| API Operations | Technical | Endpoints, request examples, error handling, rate limits |
| Reference | All | This page - glossary, status codes, documentation map, and support information |
| OpenAPI Specification (YAML) | Developers | Machine-readable API definition for OpenAPI-compatible tools |
Contact and Support
Use the Data Broker Portal for account setup, credentials, and to contact us.
When reporting an issue, include:
- Timestamp (Pacific Time)
- Endpoint and HTTP status code
- File name involved
- Upload response payload or error message
- Whether the request occurred during the
1:00 AMto3:00 AMPT maintenance window
Version History
| Version | Date | Notes |
|---|---|---|
| 1.0.0 | March 2026 | Initial release |