Record delete work orders work-order-endpoint
Use the /workorder endpoint in the Data Hygiene API to create, view, and manage record delete work orders in Adobe Experience Platform. Work orders let you control, monitor, and track data removal across datasets to help you maintain data quality and support your organization’s data governance standards.
Getting started
Before you begin, see the overview to learn about required headers, how to read sample API calls, and where to find related documentation.
Quotas and processing timelines quotas
Record delete work orders are subject to daily and monthly identifier submission limits, determined by your organization’s license entitlement. These limits apply to both UI- and API-based record delete requests.
Monthly submission entitlement by product quota-limits
The following table shows identifier submission limits by product and entitlement level. For each product, the monthly cap is the lesser of two values: a fixed identifier ceiling or a percentage-based threshold tied to your licensed data volume. In practice, most organizations have lower monthly limits based on their actual addressable audience or Adobe Customer Journey Analytics row entitlements.
- Quotas reset on the first day of each calendar month. Unused quota does not carry over.
- Quota usage is based on your organization’s licensed monthly entitlement for submitted identifiers. Quotas are not enforced by system guardrails but may be monitored and reviewed.
- Record delete work order capacity is a shared service. Your monthly cap reflects the highest entitlement across Real-Time CDP, Adobe Journey Optimizer, Customer Journey Analytics, and any applicable Shield add-ons.
Processing timelines for identifier submissions sla-processing-timelines
After submission, record delete work orders are queued and processed based on your entitlement level.
If your organization requires higher limits, contact your Adobe representative for an entitlement review.
List record delete work orders list
Retrieve a paginated list of record delete work orders for data hygiene operations in your organization. Filter results using query parameters. Each work order record includes the action type (such as identity-delete), status, related dataset and user details, and audit metadata.
API format
GET /workorder
The following table describes the query parameters available for listing record delete work orders.
searchtypeidentity-delete).statusEnum:
received, validated, submitted, ingested, completed, failedauthordisplayNamedescriptionworkorderIdsandboxName* to include all sandboxes.fromDatetoDate to be set.toDatefromDate to be set.filterDatepagelimitorderBy+ or - prefix for ascending/descending. Example: orderBy=-datasetName.propertiesRequest
The following request retrieves all completed record delete work orders, limited to two per page:
curl -X GET \
"https://platform.adobe.io/data/core/hygiene/workorder?status=completed&limit=2" \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'x-api-key: {API_KEY}' \
-H 'x-gw-ims-org-id: {ORG_ID}' \
-H 'x-sandbox-name: {SANDBOX_NAME}'
Response
A successful response returns a paginated list of record delete work orders.
{
"results": [
{
"workorderId": "DI-1729d091-b08b-47f4-923f-6a4af52c93ac",
"orgId": "9C1F2AC143214567890ABCDE@AcmeOrg",
"bundleId": "BN-4cfabf02-c22a-45ef-b21f-bd8c3d631f41",
"action": "identity-delete",
"createdAt": "2034-03-15T11:02:10.935Z",
"updatedAt": "2034-03-15T11:10:10.938Z",
"operationCount": 3,
"targetServices": [
"profile",
"datalake",
"identity",
"ajo"
],
"status": "received",
"createdBy": "a.stark@acme.com <a.stark@acme.com> BD8C3D631F41@acme.com",
"datasetId": "a7b7c8f3a1b8457eaa5321ab",
"datasetName": "Acme_Customer_Exports",
"displayName": "Customer Identity Delete Request",
"description": "Scheduled identity deletion for compliance"
}
],
"total": 1,
"count": 1,
"_links": {
"next": {
"href": "https://platform.adobe.io/workorder?page=1&limit=2",
"templated": false
},
"page": {
"href": "https://platform.adobe.io/workorder?limit={limit}&page={page}",
"templated": true
}
}
}
The following table describes the properties in the response.
resultsworkorderIdorgIdbundleIdactioncreatedAtupdatedAtoperationCounttargetServices["datalake", "identity", "profile", "ajo"]). For Customer Journey Analytics-only organizations (without a Real-Time Customer Profile entitlement), the only valid value is [“datalake”].statusreceived,validated, submitted, ingested, completed, and failed.createdBydatasetIdALL. When the request used profile-only mode, this value is ALL.datasetNamedisplayNamedescriptiontotalcount_linksnexthref (string) and templated (boolean) for the next page.pagehref (string) and templated (boolean) for page navigation.Create a record delete work order create
To delete records associated with one or more identities from a single dataset, multiple datasets, or all datasets, make a POST request to the /workorder endpoint.
Work orders are processed asynchronously and appear in the work order list after submission. Multi-dataset and profile-only (targeted services) options are generally available for all customers as of the March 2026 Experience Platform release.
API format
POST /workorder
- The dataset schema must define a primary identity or identity map. You can only delete records from datasets whose associated XDM schema defines a primary identity or identity map.
- Secondary identities are not scanned. If a dataset contains multiple identity fields, only the primary identity is used for matching. Records cannot be targeted or deleted based on non-primary identities.
- Records without a populated primary identity are skipped. If a record does not have primary identity metadata populated, it is not eligible for deletion.
- Data ingested before identity configuration is not eligible. If the primary identity field was added to a schema after data ingestion, previously ingested records cannot be deleted through record delete work orders.
Identity payload formats (namespacesIdentities or identities)
The request body must include exactly one of the following.
namespacesIdentitiesnamespace (for example, { "code": "email" }) and ids (array of identity strings).identitiesnamespace (for example, { "code": "email" }) and a single id (string).If you send both properties, neither property, or provide an empty array for the property you include, the API returns HTTP 400 (Bad Request) with one of these messages:
- Both properties provided:
"Identities and NamespacesIdentities are not allowed at the same time" - Neither provided or empty list:
"Identities are Empty for Delete Identity request."
Request
The following request deletes all records associated with specified email addresses from a particular dataset. It uses the recommended namespacesIdentities format.
curl -X POST \
https://platform.adobe.io/data/core/hygiene/workorder \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'x-api-key: {API_KEY}' \
-H 'x-gw-ims-org-id: {ORG_ID}' \
-H 'Content-Type: application/json' \
-H 'x-sandbox-name: {SANDBOX_NAME}' \
-d '{
"displayName": "Acme Loyalty - Customer Data Deletion",
"description": "Delete all records associated with the specified email addresses from the Acme_Loyalty_2023 dataset.",
"action": "delete_identity",
"datasetId": "7eab61f3e5c34810a49a1ab3",
"namespacesIdentities": [
{
"namespace": {
"code": "email"
},
"ids": [
"alice.smith@acmecorp.com",
"bob.jones@acmecorp.com",
"charlie.brown@acmecorp.com"
]
}
]
}'
The following table describes the properties for creating a record delete work order.
displayNamedescriptionactiondelete_identity.datasetIdALL, a single dataset ID, or a comma-separated list of two or more dataset IDs (e.g. "id1,id2,id3"). You cannot combine ALL with specific IDs. Single-dataset requests behave as before, multi-dataset requests delete the identities from each listed dataset, and ALL targets every dataset. Datasets must have a primary identity or identity map. If an identity map exists, it will be present as a top-level field named identityMap.Note: A dataset row may have many identities in its identity map, but only one can be marked as primary.
"primary": true must be included to force the id to match a primary identity.When using
targetServices for profile-only deletion, datasetId must be ALL.targetServices["datalake", "identity", "profile", "ajo"]) by default. Organizations with Customer Journey Analytics but without a Real-Time Customer Profile entitlement can only use [“datalake”]. To limit deletion to profile-related data only and leave the data lake untouched, set this to ["identity", "profile", "ajo"] (in any order). This profile-only mode requires a Real-Time CDP or Adobe Journey Optimizer entitlement and datasetId must be ALL.identitiesidentities or namespacesIdentities. Array of objects, each with namespace (object with code, e.g. "email") and id (single identity string). Accepted for backward compatibility and produced by the conversion scripts. The service normalizes this format internally; behavior is identical. See Identity payload format above.namespacesIdentitiesidentities or namespacesIdentities. Array of objects, each with namespace (object with code, e.g. "email") and ids (array of identity strings). Recommended for all payloads. The namespacesIdentities property is more compact when many identities share one namespace. See Identity payload format above. Identity namespaces: identity namespace documentation, Identity Service API.Response
A successful response returns the details of the new record delete work order.
{
"workorderId": "DI-95c40d52-6229-44e8-881b-fc7f072de63d",
"orgId": "8B1F2AC143214567890ABCDE@AcmeOrg",
"bundleId": "BN-c61bec61-5ce8-498f-a538-fb84b094adc6",
"action": "identity-delete",
"createdAt": "2035-06-02T09:21:00.000Z",
"updatedAt": "2035-06-02T09:21:05.000Z",
"operationCount": 1,
"targetServices": [
"profile",
"datalake",
"identity",
"ajo"
],
"status": "received",
"createdBy": "c.lannister@acme.com <c.lannister@acme.com> 7EAB61F3E5C34810A49A1AB3@acme.com",
"datasetId": "7eab61f3e5c34810a49a1ab3",
"datasetName": "Acme_Loyalty_2023",
"displayName": "Loyalty Identity Delete Request",
"description": "Schedule deletion for Acme loyalty program dataset"
}
The following table describes the properties in the response.
workorderIdorgIdbundleIdactioncreatedAtupdatedAtoperationCounttargetServicesstatuscreatedBydatasetIdALL. For multi-dataset requests, the value reflects the comma-separated list or single ID submitted.datasetNamedisplayNamedescriptionThe response targetServices value echoes your request or shows the full default set when omitted (see the response table above).
Multi-dataset and profile-only (API) multi-dataset-profile-only
The following options are available through the API only and are not supported in the Data Hygiene UI. They control which datasets and which services process the deletion, enabling multi-dataset submissions and profile-only targeted service requests.
The following table summarizes how the request body and behavior change for each option.
datasetId (e.g. "id1,id2,id3"). Single ID or ALL unchanged.ALL).targetServices with exactly ["identity", "profile", "ajo"] (any order). Requires datasetId: "ALL".Multi-dataset requests
The datasetId field is split on commas: use a single ID (same behavior as before), a comma-separated list of IDs, or the literal ALL. To delete identities from multiple specific datasets in one work order, provide a comma-separated list:
"datasetId": "6707eb36eef4d42ab86d9fbe,6643f00c16ddf51767fcf780"
Identities are then deleted from each of the listed datasets. Single-dataset requests work as they always did; use ALL to target every dataset. The value must be exactly one of: ALL, a single dataset ID, or two or more dataset IDs separated by commas (no combining ALL with specific IDs).
Profile-only (targeted services)
To only remove identity and profile-related data while leaving the data lake untouched, include targetServices with exactly these three values in any order: identity, profile, and ajo. Identity, Profile, and AJO are explicitly included; the data lake is excluded. In this mode, datasetId must be ALL (the use case is full profile deletion, not per-dataset fragments).
The following example creates a profile-only record delete work order:
curl -X POST \
"https://platform.adobe.io/data/core/hygiene/workorder" \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'x-api-key: {API_KEY}' \
-H 'x-gw-ims-org-id: {ORG_ID}' \
-H 'x-sandbox-name: {SANDBOX_NAME}' \
-H 'x-sandbox-id: {SANDBOX_ID}' \
-d '{
"action": "delete_identity",
"datasetId": "ALL",
"displayName": "Profile-only delete for specified identity",
"description": "Delete identity, profile, and AJO data only; datalake unchanged.",
"targetServices": ["identity", "profile", "ajo"],
"namespacesIdentities": [
{
"namespace": { "code": "email" },
"ids": ["user@example.com"]
}
]
}'
Successful responses for multi-dataset or profile-only requests follow the same shape as other work order responses. The returned datasetId and targetServices reflect the values in the request (or the full default list when targetServices is omitted), so you can confirm what was submitted.
identity-delete in API responses. If the API changes to use a different value (such as delete_identity), this documentation will be updated accordingly.Convert ID lists to JSON for record delete requests (#convert-id-lists-to-json-for-record-delete-requests)
Use conversion scripts to produce the required JSON payloads for the /workorder endpoint when your identifiers are in CSV, TSV, or TXT files. This approach is especially helpful when working with existing data files. For ready-to-use scripts and instructions, see the csv-to-data-hygiene GitHub repository.
The scripts output the identities format—one id per object with a namespace. The API accepts this format as-is; you can send the generated JSON directly in the POST body to /workorder with no conversion. The recommended format is namespacesIdentities; see Create a record delete work order and Identity payload format.
Generate JSON payloads
The following bash script examples demonstrate how to run the conversion scripts in Python or Ruby:
| code language-bash |
|---|
|
| code language-bash |
|---|
|
The table below describes the parameters in the bash scripts.
verbosecolumnnamespaceemail). The generated JSON uses this in each object’s namespace.code property.dataset-idALL for all datasets.descriptionoutput-dirThe example below shows a successful JSON payload converted from a CSV, TSV, or TXT file. It contains records associated with the specified namespace and is used to delete records identified by email addresses.
{
"action": "delete_identity",
"datasetId": "66f4161cc19b0f2aef3edf10",
"displayName": "output/sample-big-001.json",
"description": "a simple sample",
"identities": [
{
"namespace": {
"code": "email"
},
"id": "1"
},
{
"namespace": {
"code": "email"
},
"id": "2"
}
]
}
The following table describes the properties in the JSON payload.
actiondelete_identity by the conversion script.datasetIdALL.displayNamedescriptionidentitiesAn array of objects, each containing:
namespace: An object with acodeproperty specifying the identity namespace (for example, “email”).id: The identity value to delete for this namespace.
Submit the generated JSON data to the /workorder endpoint
The script output uses the identities format, which the API accepts as-is. Use the converted JSON payload as the request body (-d) when you send your curl POST request to the /workorder endpoint. For full request options and validation rules, see Create a record delete work order.
Retrieve details for a specific record delete work order lookup
Retrieve information for a specific record delete work order by making a GET request to /workorder/{WORKORDER_ID}. The response includes action type, status, associated dataset and user information, and audit metadata.
API format
GET /workorder/{WORKORDER_ID}
{WORK_ORDER_ID}Request
curl -X GET \
https://platform.adobe.io/data/core/hygiene/workorder/DI-6fa98d52-7bd2-42a5-bf61-fb5c22ec9427 \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'x-api-key: {API_KEY}' \
-H 'x-gw-ims-org-id: {ORG_ID}' \
-H 'x-sandbox-name: {SANDBOX_NAME}'
Response
A successful response returns the details of the specified record delete work order.
{
"workorderId": "DI-6fa98d52-7bd2-42a5-bf61-fb5c22ec9427",
"orgId": "3C7F2AC143214567890ABCDE@AcmeOrg",
"bundleId": "BN-dbe3ffad-cb0b-401f-91ae-01c189f8e7b2",
"action": "identity-delete",
"createdAt": "2037-01-21T08:25:45.119Z",
"updatedAt": "2037-01-21T08:30:45.233Z",
"operationCount": 3,
"targetServices": [
"ajo",
"profile",
"datalake",
"identity"
],
"status": "received",
"createdBy": "g.baratheon@acme.com <g.baratheon@acme.com> C189F8E7B2@acme.com",
"datasetId": "d2f1c8a4b8f747d0ba3521e2",
"datasetName": "Acme_Marketing_Events",
"displayName": "Marketing Identity Delete Request",
"description": "Scheduled identity deletion for marketing compliance"
}
The following table describes the properties in the response.
workorderIdorgIdbundleIdactioncreatedAtupdatedAtoperationCounttargetServicesstatuscreatedBydatasetIdALL).datasetNamedisplayNamedescriptionUpdate a record delete work order update
Update the name and description for a record delete work order by making a PUT request to the /workorder/{WORKORDER_ID} endpoint.
API format
PUT /workorder/{WORKORDER_ID}
The following table describes the parameter for this request.
{WORK_ORDER_ID}Request
curl -X PUT \
https://platform.adobe.io/data/core/hygiene/workorder/DI-893a6b1d-47c2-41e1-b3f1-2d7c2956aabb \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'x-api-key: {API_KEY}' \
-H 'x-gw-ims-org-id: {ORG_ID}' \
-H 'x-sandbox-name: {SANDBOX_NAME}' \
-H 'Content-Type: application/json' \
-d '{
"name": "Updated Marketing Identity Delete Request",
"description": "Updated deletion request for marketing data"
}'
The following table describes the properties you can update.
namedescriptionResponse
A successful response returns the updated work order request.
{
"workorderId": "DI-893a6b1d-47c2-41e1-b3f1-2d7c2956aabb",
"orgId": "7D4E2AC143214567890ABCDE@AcmeOrg",
"bundleId": "BN-12abcf45-32ea-45bc-9d1c-8e7b321cabc8",
"action": "identity-delete",
"createdAt": "2038-04-15T12:14:29.210Z",
"updatedAt": "2038-04-15T12:30:29.442Z",
"operationCount": 2,
"targetServices": [
"profile",
"datalake"
],
"status": "received",
"createdBy": "b.tarth@acme.com <b.tarth@acme.com> 8E7B321CABC8@acme.com",
"datasetId": "1a2b3c4d5e6f7890abcdef12",
"datasetName": "Acme_Marketing_2024",
"displayName": "Updated Marketing Identity Delete Request",
"description": "Updated deletion request for marketing data",
"productStatusDetails": [
{
"productName": "Data Management",
"productStatus": "waiting",
"createdAt": "2024-06-12T20:11:18.447747Z"
},
{
"productName": "Identity Service",
"productStatus": "success",
"createdAt": "2024-06-12T20:36:09.020832Z"
},
{
"productName": "Profile Service",
"productStatus": "waiting",
"createdAt": "2024-06-12T20:11:18.447747Z"
},
{
"productName": "Journey Orchestrator",
"productStatus": "success",
"createdAt": "2024-06-12T20:12:19.843199Z"
}
]
}
workorderIdorgIdbundleIdactioncreatedAtupdatedAtoperationCounttargetServicesstatusreceived,validated, submitted, ingested, completed, and failed.createdBydatasetIdALL).datasetNamedisplayNamedescriptionproductStatusDetailsAn array listing the current status of downstream processes for the request. Each object contains:
productName: The name of the downstream service.productStatus: The current processing status from the downstream service.createdAt: The timestamp when the most recent status was posted by the service.
This property is available after the work order is submitted to downstream services to begin processing.