Appearance
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-dataRequired 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/sites3. Scan the brokers
http
POST /api/v1/delete-my-data/scan
GET /api/v1/delete-my-data/scan/statusRetry a single failed site:
http
POST /api/v1/delete-my-data/scan/{siteId}/retrySite 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:
| Status | Meaning |
|---|---|
SCAN_NOT_STARTED | No scan has run for this site yet. |
SCAN_INITIATED | A scan is queued or in progress. |
SCAN_FAILED | The scan failed — retry with POST .../scan/{siteId}/retry. |
SCAN_COMPLETED | The 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:
| Status | Meaning |
|---|---|
POA_SENT_TO_SITE | The deletion request / power of attorney was sent to the site. |
USER_MANUAL_INSTRUCTIONS_SENT | The site requires manual user action; see manual_instructions. |
DATA_REMOVED_VERIFIED | The data was confirmed removed from the site. |
DATA_REAPPEARED_DETECTED | Previously 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/initiatePoll signing state:
http
GET /api/v1/delete-my-data/signature/status
GET /api/v1/delete-my-data/signature-orderOption 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
404until 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/eventsjson
{ "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-dataCRM 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).