Skip to content

Online Data ​

Online Data submits removal requests to data brokers on the user's behalf. Every call is app-authenticated — obtain an app token via SSO first. The account's plan must include the Online Data product.

Flow overview ​

All calls send Authorization: Bearer {app_token}.

1. Create or update the removal profile ​

http
POST /api/v1/delete-my-data
Authorization: Bearer {app_token}
Content-Type: application/json

{
  "first_name": "John",
  "last_name": "Doe",
  "email": "john.doe@example.com",
  "phone": "+46701234567",
  "street": "Testgatan 1",
  "zip": "11122",
  "city": "Stockholm"
}

Read or update the profile:

http
GET /api/v1/delete-my-data
PUT /api/v1/delete-my-data

Required fields follow the integration spec for your API version — only omit a field when the schema marks it optional.

2. Status and sites ​

http
GET /api/v1/delete-my-data/status
GET /api/v1/delete-my-data/sites

3. Scan the brokers ​

http
POST /api/v1/delete-my-data/scan
GET  /api/v1/delete-my-data/scan/status

Retry a single failed site:

http
POST /api/v1/delete-my-data/scan/{siteId}/retry

Site statuses ​

GET /api/v1/delete-my-data/scan/status returns one entry per site under sites[]. Each site carries two independent status dimensions.

1. Scan status — sites[].scan_result.status, where the scan stands for that site:

StatusMeaning
SCAN_NOT_STARTEDNo scan has run for this site yet.
SCAN_INITIATEDA scan is queued or in progress.
SCAN_FAILEDThe scan failed — retry with POST .../scan/{siteId}/retry.
SCAN_COMPLETEDThe scan finished — check is_data_found and comparison.

When is_data_found is true, scan_result.data is an object of the matched personal data (firstName, lastName, email, ssn, phone, street, zip, city); otherwise it is an empty array ([]).

2. Removal status — sites[].removal_requests[].status, where a deletion request stands once you submit one for that site:

StatusMeaning
POA_SENT_TO_SITEThe deletion request / power of attorney was sent to the site.
USER_MANUAL_INSTRUCTIONS_SENTThe site requires manual user action; see manual_instructions.
DATA_REMOVED_VERIFIEDThe data was confirmed removed from the site.
DATA_REAPPEARED_DETECTEDPreviously removed data was detected again on the site.

can_send_deletion_request on each site indicates whether a removal request can be submitted for it yet. A site only appears in removal_requests[] once a request exists, so an empty array means none has been raised.

4. Power of attorney (user action) ​

Brokers only act on a removal request backed by the user's signed power of attorney. Choose one of the two ways to get it.

Option A: sign with Defentry ​

Initiate signing — typically opens a BankID-style flow in your UI:

http
POST /api/v1/delete-my-data/signatures/initiate

Poll signing state:

http
GET /api/v1/delete-my-data/signature/status
GET /api/v1/delete-my-data/signature-order

Option B: bring your own signed power of attorney ​

Use this when the user already signs the power of attorney in your own platform. Defentry does not run a signing flow; you register the signature and upload the signed PDF.

1. Register the signature. Send your own reference for the signed document:

http
POST /api/v1/delete-my-data/signatures/external
Authorization: Bearer {app_token}
Content-Type: application/json

{
  "external_document_id": "your-doc-42",
  "signer_id": "your-signer-42",
  "signed_at": "2026-10-08T09:55:00Z"
}

Only external_document_id is required. The first call returns 201; calling again returns 200 with the same order and updates any changed values, so it is safe to retry. Registering replaces any earlier Defentry signature for the account. GET /api/v1/delete-my-data/signature-order now returns provider: "external".

2. Create an upload slot with the exact size of the PDF in bytes (at most 10 MB):

http
POST /api/v1/delete-my-data/poa-documents
Authorization: Bearer {app_token}
Content-Type: application/json

{ "content_type": "application/pdf", "content_length": 524288 }

Response (201): data.document_id, a short-lived data.upload_url and data.expires_at.

3. Upload the PDF straight to upload_url before it expires. The file does not pass through the Defentry API, and both headers must match the slot:

http
PUT {upload_url}
Content-Type: application/pdf
Content-Length: 524288

<PDF bytes>

Each document_id covers one removal request. Create a new slot (and upload again) for the next request.

Order matters

  • Creating an upload slot before registering the signature returns 422.
  • Both calls return 404 until the user has an Online Data profile (step 1).

5. Submit and track removals ​

http
POST /api/v1/delete-my-data/removal-requests
GET  /api/v1/delete-my-data/removal-requests
GET  /api/v1/delete-my-data/events
json
{ "site_ids": [16] }

With your own signed power of attorney (option B), also send the uploaded document:

json
{
  "site_ids": [16],
  "poa_document_id": "9f0c2e8a-4b1d-4c3e-9a57-2d6f1b8e7c40"
}

poa_document_id is required for those accounts and must be omitted for accounts signed with Defentry. It returns 404 if the document is unknown or belongs to another account. It returns 422 if the document has expired, was already used, was never uploaded, or is not a PDF within the size limit.

Tearing down ​

To remove the profile entirely:

http
DELETE /api/v1/delete-my-data

CRM tokens cannot call Online Data

Online Data is strictly app-scoped. Your backend must hold the user's app token, or run the signing step in a user-facing web view. This includes registering your own signed power of attorney (option B).

Next steps ​

  • Webhooks — push delete_my_data_event notifications for removal progress
  • Alarms — monitor identity events alongside Online Data

For API access and technical questions, contact Defentry through your account manager.