Skip to content
ContentRemovalDeskDocumentation

THE COMPLETE CONTRACT

API reference

Every endpoint, parameter and response. Examples use standard HTTP clients and your server’s environment variables.

14 endpoints

Read your agency API connection

Read credential scopes, expiry, assigned agency workspace, and live engine configuration. The legacy partner field identifies the agency API account.

Permissionsany valid agency key

Response

Returns 200 on success.

partnerobjectrequired
Show nested fields
idstringrequired
namestringrequired
kindstringrequired

Always agency.

workspace_idstring | nullrequired
key_idstring | nullrequired
scopesarray[]required
expires_atinteger | nullrequired

Key expiration in epoch milliseconds, or null when there is no scheduled expiration. Revocation, agency verification, ownership, and scope checks still apply.

environmentstringrequired

Always live.

workspacesarray[]required
Show nested fields
idstringrequired
external_idstringrequired
namestringrequired
engine_configuredbooleanrequired

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/me
curl --request GET 'https://api.crd.systems/v1/me' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "partner": {
    "id": "ptn_example",
    "name": "Example Agency",
    "kind": "agency"
  },
  "workspace_id": "wsp_example",
  "key_id": "key_example",
  "scopes": [
    "workspaces:read",
    "creators:read",
    "creators:write"
  ],
  "expires_at": null,
  "environment": "live",
  "workspaces": [
    {
      "id": "wsp_example",
      "name": "Example Agency",
      "external_id": "agency_001"
    }
  ],
  "engine_configured": true
}

Retrieve your assigned workspace

Requires workspaces:read. API customers cannot create agencies or additional workspaces.

Permissionsworkspaces:read

Parameters

idpathrequired

Response

Returns 200 on success.

idstringrequired
external_idstringrequired
namestringrequired
created_atintegerrequired

Unix epoch milliseconds.

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/workspaces/{id}
curl --request GET 'https://api.crd.systems/v1/workspaces/wsp_example' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "id": "wsp_example",
  "external_id": "agency_001",
  "name": "Example Agency",
  "created_at": 1790035200000
}

Link or invite an agency creator

Requires creators:write. Provide an existing agency crd_user_id or email, first_name, last_name for a real CRD invitation. Existing creators must belong to the agency and not be staff. Aliases and supported profile URLs update actual CRD identity data; mandate/contact evidence is not fabricated. Invitations send real email and require acceptance/onboarding. Enrollment starts inactive. Retry with identical external_id and payload; changed input conflicts. If roster sync already imported the same CRD user, enrollment reuses its stable API creator ID and may replace the automatic crd:UUID external ID with the supplied ID. A different already-assigned external ID conflicts. No duplicate creator or usage interval is created. New invitation enrollment triggers email; email_sent reports provider acceptance, not inbox delivery or creator acceptance. An identical retry does not resend an invitation. Existing confirmed agency creators can link without invitation. Enrollment never activates protection automatically.

Permissionscreators:write

Request body

workspace_idstringrequired

Maximum 200 characters.

external_idstringrequired

Maximum 200 characters.

display_namestringrequired

Maximum 160 characters.

aliasesarray[]

Pseudonyms, alternate spellings, and usernames without a required social-network label. Merged into the native CRD search aliases.

Up to 30 items.

profile_urlsarray[]

Supported official profile URLs. The integration extracts each platform and username into existing native CRD platform records; URLs are not ownership verification.

Up to 20 items.

crd_user_idstring
emailstring

Maximum 254 characters.

first_namestring

Maximum 100 characters.

last_namestring

Maximum 100 characters.

localestring

Values: en fr

Response

Returns 201 on success.

idstringrequired
workspace_idstringrequired
external_idstringrequired
display_namestringrequired
aliasesarray[]required
profile_urlsarray[]required
protection_statusstringrequired

API schedule state, separate from enrollment and eligibility. Activation and resumption require an explicit protection PUT after current eligibility checks.

Values: not_activated active paused

created_atintegerrequired

Unix epoch milliseconds.

enrollment_statusstringrequired

Current CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.

crd_user_idstring | nullrequired
invitation_idstring | nullrequired
simulatedbooleanrequired

Always false.

scan_schedule_managed_bystringrequired

Always api.

crd_subscription_managed_bystringrequired

Always crd.

email_sentboolean

Present on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.

identity_sync_pendingbooleanrequired

True when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.

Retries & errors

Reuse the same external_id and complete payload for retries. Changed input under the same external ID conflicts. Use PATCH to update a linked creator’s identity.

Documented statuses: 200, 201, 400, 401, 403, 404, 409, 413, 415, 429, 502, 503, 504. Error handling guide

POST/v1/creators
curl --request POST 'https://api.crd.systems/v1/creators' \
  --header "Authorization: Bearer $CRD_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "workspace_id": "wsp_example",
  "external_id": "creator_001",
  "crd_user_id": "33333333-3333-4333-8333-333333333333",
  "display_name": "Example Creator",
  "aliases": [
    "example_creator"
  ],
  "profile_urls": [
    "https://onlyfans.com/example_creator"
  ]
}'
Use your secret key in the environment variable.
Example response · 201
{
  "id": "crt_example",
  "workspace_id": "wsp_example",
  "external_id": "creator_001",
  "display_name": "Example Creator",
  "aliases": [
    "example_creator"
  ],
  "profile_urls": [
    "https://onlyfans.com/example_creator"
  ],
  "protection_status": "not_activated",
  "created_at": 1790035200000,
  "enrollment_status": "linked",
  "crd_user_id": "33333333-3333-4333-8333-333333333333",
  "invitation_id": null,
  "simulated": false,
  "scan_schedule_managed_by": "api",
  "crd_subscription_managed_by": "crd",
  "identity_sync_pending": false,
  "email_sent": false
}

Read your canonical agency roster

Requires creators:read. Reads the existing CRD agency roster, imports missing API mappings without activating billing, and returns stable API creator IDs with current names, aliases, official URLs, authorization, entitlement, and eligibility. Changes made in the CRD app are reflected on reads. The after cursor is a CRD user UUID, not an API creator ID.

Permissionscreators:read

Parameters

limitquery

afterquery

Canonical CRD user UUID from next_cursor.

Response

Returns 200 on success.

dataarray[]required
Show nested fields
idstringrequired
workspace_idstringrequired
external_idstringrequired
display_namestringrequired
aliasesarray[]required
profile_urlsarray[]required
protection_statusstringrequired

API schedule state, separate from enrollment and eligibility. Activation and resumption require an explicit protection PUT after current eligibility checks.

Values: not_activated active paused

created_atintegerrequired

Unix epoch milliseconds.

enrollment_statusstringrequired

Current CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.

crd_user_idstring | nullrequired
invitation_idstring | nullrequired
simulatedbooleanrequired

Always false.

scan_schedule_managed_bystringrequired

Always api.

crd_subscription_managed_bystringrequired

Always crd.

email_sentboolean

Present on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.

authorizationobjectrequired
Show nested fields
approvedbooleanrequired
statusstring
expires_atstring | null
entitlementobjectrequired
Show nested fields
activebooleanrequired
sourcestring
eligiblebooleanrequired
identity_sync_pendingbooleanrequired

True when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.

next_cursorstring | nullrequired

Last canonical CRD user UUID for the next roster page, or null.

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/creators
curl --request GET 'https://api.crd.systems/v1/creators?limit=25' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "data": [
    {
      "id": "crt_example",
      "workspace_id": "wsp_example",
      "external_id": "creator_001",
      "display_name": "Example Creator",
      "aliases": [
        "example_creator"
      ],
      "profile_urls": [
        "https://onlyfans.com/example_creator"
      ],
      "protection_status": "not_activated",
      "created_at": 1790035200000,
      "enrollment_status": "linked",
      "crd_user_id": "33333333-3333-4333-8333-333333333333",
      "invitation_id": null,
      "simulated": false,
      "scan_schedule_managed_by": "api",
      "crd_subscription_managed_by": "crd",
      "identity_sync_pending": false,
      "authorization": {
        "approved": true,
        "status": "approved",
        "expires_at": null
      },
      "entitlement": {
        "active": true,
        "source": "agency_subscription"
      },
      "eligible": true
    }
  ],
  "next_cursor": null
}

Read creator linkage and eligibility

Requires creators:read. Refreshes the shared CRD identity so changes made in the agency dashboard are returned by the API. Resolves invitation onboarding and returns actual authorization, entitlement, and eligibility.

Permissionscreators:read

Parameters

idpathrequired

Response

Returns 200 on success.

idstringrequired
workspace_idstringrequired
external_idstringrequired
display_namestringrequired
aliasesarray[]required
profile_urlsarray[]required
protection_statusstringrequired

API schedule state, separate from enrollment and eligibility. Activation and resumption require an explicit protection PUT after current eligibility checks.

Values: not_activated active paused

created_atintegerrequired

Unix epoch milliseconds.

enrollment_statusstringrequired

Current CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.

crd_user_idstring | nullrequired
invitation_idstring | nullrequired
simulatedbooleanrequired

Always false.

scan_schedule_managed_bystringrequired

Always api.

crd_subscription_managed_bystringrequired

Always crd.

email_sentboolean

Present on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.

authorizationobjectrequired
Show nested fields
approvedbooleanrequired
statusstring
expires_atstring | null
entitlementobjectrequired
Show nested fields
activebooleanrequired
sourcestring
eligiblebooleanrequired
identity_sync_pendingbooleanrequired

True when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/creators/{id}
curl --request GET 'https://api.crd.systems/v1/creators/crt_example' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "id": "crt_example",
  "workspace_id": "wsp_example",
  "external_id": "creator_001",
  "display_name": "Example Creator",
  "aliases": [
    "example_creator"
  ],
  "profile_urls": [
    "https://onlyfans.com/example_creator"
  ],
  "protection_status": "not_activated",
  "created_at": 1790035200000,
  "enrollment_status": "linked",
  "crd_user_id": "33333333-3333-4333-8333-333333333333",
  "invitation_id": null,
  "simulated": false,
  "scan_schedule_managed_by": "api",
  "crd_subscription_managed_by": "crd",
  "identity_sync_pending": false,
  "authorization": {
    "approved": true,
    "status": "approved",
    "expires_at": null
  },
  "entitlement": {
    "active": true,
    "source": "agency_subscription"
  },
  "eligible": true
}

Update the shared CRD creator identity

Requires creators:write and a linked current agency creator. Omitted fields are unchanged. display_name updates the CRD name; aliases and supported profile URLs merge into existing CRD identity data. Reads in the API and agency dashboard use the same creator state. This is not removal/replacement of the complete alias or platform collection. Identical retries are safe for these additive/set operations.

Permissionscreators:write

Parameters

idpathrequired

Request body

display_namestring

Maximum 160 characters.

aliasesarray[]

Pseudonyms, alternate spellings, and usernames without a required social-network label. Merged into the native CRD search aliases.

Up to 30 items.

profile_urlsarray[]

Supported official profile URLs. The integration extracts each platform and username into existing native CRD platform records; URLs are not ownership verification.

Up to 20 items.

Response

Returns 200 on success.

idstringrequired
workspace_idstringrequired
external_idstringrequired
display_namestringrequired
aliasesarray[]required
profile_urlsarray[]required
protection_statusstringrequired

API schedule state, separate from enrollment and eligibility. Activation and resumption require an explicit protection PUT after current eligibility checks.

Values: not_activated active paused

created_atintegerrequired

Unix epoch milliseconds.

enrollment_statusstringrequired

Current CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.

crd_user_idstring | nullrequired
invitation_idstring | nullrequired
simulatedbooleanrequired

Always false.

scan_schedule_managed_bystringrequired

Always api.

crd_subscription_managed_bystringrequired

Always crd.

email_sentboolean

Present on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.

authorizationobjectrequired
Show nested fields
approvedbooleanrequired
statusstring
expires_atstring | null
entitlementobjectrequired
Show nested fields
activebooleanrequired
sourcestring
eligiblebooleanrequired
identity_sync_pendingbooleanrequired

True when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.

Retries & errors

Omitted fields stay unchanged. Aliases and platforms merge into the existing CRD identity. Repeating the same update does not add duplicate identity entries.

Documented statuses: 200, 400, 401, 403, 404, 409, 413, 415, 429, 502, 503, 504. Error handling guide

PATCH/v1/creators/{id}
curl --request PATCH 'https://api.crd.systems/v1/creators/crt_example' \
  --header "Authorization: Bearer $CRD_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "display_name": "Example Creator",
  "aliases": [
    "example_creator_official"
  ],
  "profile_urls": [
    "https://mym.fans/fr/example_mym"
  ]
}'
Use your secret key in the environment variable.
Example response · 200
{
  "id": "crt_example",
  "workspace_id": "wsp_example",
  "external_id": "creator_001",
  "display_name": "Example Creator",
  "aliases": [
    "example_creator",
    "example_creator_official"
  ],
  "profile_urls": [
    "https://onlyfans.com/example_creator",
    "https://mym.fans/example_mym"
  ],
  "protection_status": "not_activated",
  "created_at": 1790035200000,
  "enrollment_status": "linked",
  "crd_user_id": "33333333-3333-4333-8333-333333333333",
  "invitation_id": null,
  "simulated": false,
  "scan_schedule_managed_by": "api",
  "crd_subscription_managed_by": "crd",
  "identity_sync_pending": false,
  "authorization": {
    "approved": true,
    "status": "approved",
    "expires_at": null
  },
  "entitlement": {
    "active": true,
    "source": "agency_subscription"
  },
  "eligible": true
}

Enable or pause API scan scheduling

Requires protection:write. Activation checks actual mandate, entitlement, current agency membership, and capacity. Active time is metered. Pausing stops this API schedule and queued scans; it does not cancel the creator CRD subscription or undo work already dispatched. Activation is an explicit second request after a fresh eligible:true creator read. Invitation acceptance, mandate approval, or creator.updated alone do not activate or resume the schedule. Requires a key containing protection:write; the Read only preset cannot perform this operation.

Permissionsprotection:write

Parameters

idpathrequired

Request body

statusstringrequired

Values: active paused

Response

Returns 200 on success.

idstringrequired
workspace_idstringrequired
external_idstringrequired
display_namestringrequired
aliasesarray[]required
profile_urlsarray[]required
protection_statusstringrequired

API schedule state, separate from enrollment and eligibility. Activation and resumption require an explicit protection PUT after current eligibility checks.

Values: not_activated active paused

created_atintegerrequired

Unix epoch milliseconds.

enrollment_statusstringrequired

Current CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.

crd_user_idstring | nullrequired
invitation_idstring | nullrequired
simulatedbooleanrequired

Always false.

scan_schedule_managed_bystringrequired

Always api.

crd_subscription_managed_bystringrequired

Always crd.

email_sentboolean

Present on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.

identity_sync_pendingbooleanrequired

True when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.

Retries & errors

Repeating active status does not create another usage interval. This controls the API scan schedule; the creator’s CRD subscription remains independently managed.

Documented statuses: 200, 400, 401, 403, 404, 409, 413, 415, 429, 502, 503, 504. Error handling guide

PUT/v1/creators/{id}/protection
curl --request PUT 'https://api.crd.systems/v1/creators/crt_example/protection' \
  --header "Authorization: Bearer $CRD_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "status": "active"
}'
Use your secret key in the environment variable.
Example response · 200
{
  "id": "crt_example",
  "workspace_id": "wsp_example",
  "external_id": "creator_001",
  "display_name": "Example Creator",
  "aliases": [
    "example_creator"
  ],
  "profile_urls": [
    "https://onlyfans.com/example_creator"
  ],
  "protection_status": "active",
  "created_at": 1790035200000,
  "enrollment_status": "linked",
  "crd_user_id": "33333333-3333-4333-8333-333333333333",
  "invitation_id": null,
  "simulated": false,
  "scan_schedule_managed_by": "api",
  "crd_subscription_managed_by": "crd",
  "identity_sync_pending": false
}

Queue a real CRD scan

Requires scans:write and active API scheduling. Returns before completion. Idempotency-Key is agency-wide for scan requests. Replays preserve the exact engine request identity; uncertain dispatch is reconciled rather than duplicated. Scans use actual CRD reporting workflows and can have real effects.

Permissionsscans:write

Parameters

idpathrequired

Idempotency-Keyheaderrequired

Stable key for one logical operation. Reuse unchanged for retries.

Request body

Send an empty JSON object: {}.

Response

Returns 202 on success.

idstringrequired
creator_idstringrequired
statusstringrequired

Values: queued dispatching running uncertain completed failed cancelled

sourcestringrequired

Values: manual scheduled

created_atintegerrequired

Unix epoch milliseconds.

finished_atinteger | nullrequired

Unix epoch milliseconds, or null.

error_codestring | nullrequired
crd_job_idstring | nullrequired
simulatedbooleanrequired

Always false.

Retries & errors

Use one Idempotency-Key per logical scan and preserve it across retries. A matching retry returns 200 with the original scan. Reconcile uncertain state rather than creating replacement work.

Documented statuses: 200, 202, 400, 401, 403, 404, 409, 413, 415, 429, 502, 503, 504. Error handling guide

POST/v1/creators/{id}/scans
curl --request POST 'https://api.crd.systems/v1/creators/crt_example/scans' \
  --header "Authorization: Bearer $CRD_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-request-001' \
  --data '{}'
Use your secret key in the environment variable.
Example response · 202
{
  "id": "scn_example",
  "creator_id": "crt_example",
  "status": "queued",
  "source": "manual",
  "created_at": 1790035200000,
  "finished_at": null,
  "error_code": null,
  "crd_job_id": null,
  "simulated": false
}

Read real scan progress

Requires scans:read. Follow queued/running work through completed, failed, or cancelled. dispatching and uncertain mean provider reconciliation is in progress; do not replace the logical request.

Permissionsscans:read

Parameters

idpathrequired

Response

Returns 200 on success.

idstringrequired
creator_idstringrequired
statusstringrequired

Values: queued dispatching running uncertain completed failed cancelled

sourcestringrequired

Values: manual scheduled

created_atintegerrequired

Unix epoch milliseconds.

finished_atinteger | nullrequired

Unix epoch milliseconds, or null.

error_codestring | nullrequired
crd_job_idstring | nullrequired
simulatedbooleanrequired

Always false.

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/scans/{id}
curl --request GET 'https://api.crd.systems/v1/scans/scn_example' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "id": "scn_example",
  "creator_id": "crt_example",
  "status": "completed",
  "source": "manual",
  "created_at": 1790035200000,
  "finished_at": 1790035201000,
  "error_code": null,
  "crd_job_id": "44444444-4444-4444-8444-444444444444",
  "simulated": false
}

Read the creator’s native CRD findings

Requires cases:read. Synchronizes existing native CRD leak records for this current agency creator, including manual, scheduled, historical, and API-scan findings. API IDs are stable; status changes are refreshed. Native records without known API-scan provenance have scan_id null and source crd. Use limit up to 100 and after from this creator’s authorized results. Only verified API-scan findings can use the API deindex route.

Permissionscases:read

Parameters

idpathrequired

limitquery

afterquery

Last case ID in this creator’s authorized collection.

Response

Returns 200 on success.

dataarray[]required
Show nested fields
idstringrequired
scan_idstring | nullrequired

Known API scan ID, or null for a native CRD case without API-scan provenance.

creator_idstringrequired
statusstringrequired

Current native CRD finding state observed during synchronization, not a removal confirmation.

urlstringrequired

The finding URL from the creator’s current native CRD leak record.

simulatedbooleanrequired

Always false.

created_atintegerrequired

Unix epoch milliseconds.

sourcestringrequired

crd for native findings without known API-scan provenance; api_scan when a verified API scan mapping exists.

Values: crd api_scan

leak_idstringrequired

The underlying native CRD leak record ID. Use the API case id in public API paths.

updated_atintegerrequired

Native update time in epoch milliseconds, or the imported creation time until native state is observed.

actionableboolean | nullrequired

Native actionability flag when synchronized; null if not yet observed.

dead_on_arrivalboolean | nullrequired

Native dead-on-arrival flag when synchronized; null if not yet observed.

availablebooleanrequired

Whether the synchronized native record remains available. Removal is observed after complete reconciliation.

api_deindex_supportedbooleanrequired

Whether known API-scan provenance supports the API deindex route. Current authorization and entitlement are checked separately.

next_cursorstring | nullrequired

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/creators/{id}/cases
curl --request GET 'https://api.crd.systems/v1/creators/crt_example/cases?limit=25' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "data": [
    {
      "id": "case_example",
      "scan_id": "scn_example",
      "creator_id": "crt_example",
      "status": "À faire",
      "url": "https://example.invalid/illustrative-finding",
      "simulated": false,
      "created_at": 1790035200000,
      "source": "api_scan",
      "leak_id": "55555555-5555-4555-8555-555555555555",
      "updated_at": 1790035200000,
      "actionable": true,
      "dead_on_arrival": false,
      "available": true,
      "api_deindex_supported": true
    }
  ],
  "next_cursor": null
}

Queue a real CRD Google deindex record

Requires cases:read and deindex:write. Verifies current creator eligibility and exact scan finding provenance. Creates a pending CRD record through a worker; this operation does not itself send the Google notice. queued is not submitted or removed. Preserve Idempotency-Key when retrying. Check api_deindex_supported on the case. Native cases without verified API-scan provenance return 409 native_case_managed_by_crd and continue through the existing CRD admin workflow.

Permissionscases:readdeindex:write

Parameters

idpathrequired

Idempotency-Keyheaderrequired

Stable key for one logical operation. Reuse unchanged for retries.

Request body

providerstringrequired

Always google.

Response

Returns 202 on success.

idstringrequired
case_idstringrequired
creator_idstringrequired
providerstringrequired

Always google.

statusstringrequired

Actual processing state. queued is not submission or verified removal; dispatching and uncertain require reconciliation.

simulatedbooleanrequired

Always false.

submitted_to_providerbooleanrequired
removal_verifiedbooleanrequired
created_atintegerrequired

Unix epoch milliseconds.

updated_atintegerrequired

Unix epoch milliseconds.

error_codestring | nullrequired

Retries & errors

Preserve the Idempotency-Key and provider for retries. Acceptance queues a real CRD record; it does not itself submit the notice to Google.

Documented statuses: 200, 202, 400, 401, 403, 404, 409, 413, 415, 429, 502, 503, 504. Error handling guide

POST/v1/cases/{id}/deindex-requests
curl --request POST 'https://api.crd.systems/v1/cases/case_example/deindex-requests' \
  --header "Authorization: Bearer $CRD_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-request-001' \
  --data '{
  "provider": "google"
}'
Use your secret key in the environment variable.
Example response · 202
{
  "id": "dix_example",
  "case_id": "case_example",
  "creator_id": "crt_example",
  "provider": "google",
  "status": "queued",
  "simulated": false,
  "submitted_to_provider": false,
  "removal_verified": false,
  "created_at": 1790035200000,
  "updated_at": 1790035200000,
  "error_code": null
}

Read a deindex processing state

Requires cases:read. Reconciles the underlying CRD record. submitted_to_provider and removal_verified report actual underlying status; successful acceptance alone sets neither.

Permissionscases:read

Parameters

idpathrequired

Response

Returns 200 on success.

idstringrequired
case_idstringrequired
creator_idstringrequired
providerstringrequired

Always google.

statusstringrequired

Actual processing state. queued is not submission or verified removal; dispatching and uncertain require reconciliation.

simulatedbooleanrequired

Always false.

submitted_to_providerbooleanrequired
removal_verifiedbooleanrequired
created_atintegerrequired

Unix epoch milliseconds.

updated_atintegerrequired

Unix epoch milliseconds.

error_codestring | nullrequired

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/deindex-requests/{id}
curl --request GET 'https://api.crd.systems/v1/deindex-requests/dix_example' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "id": "dix_example",
  "case_id": "case_example",
  "creator_id": "crt_example",
  "provider": "google",
  "status": "queued",
  "simulated": false,
  "submitted_to_provider": false,
  "removal_verified": false,
  "created_at": 1790035200000,
  "updated_at": 1790035200000,
  "error_code": null
}

Read live API schedule usage

Requires usage:read. UTC creator-months measure linked creators active in the API schedule. Estimates are not invoices or payment confirmation and do not alter CRD subscriptions.

Permissionsusage:read

Parameters

monthquery

UTC calendar month YYYY-MM; defaults to the current month.

Response

Returns 200 on success.

monthstringrequired
period_startstringrequired
period_endstringrequired
measured_throughstringrequired
active_creator_countintegerrequired

Distinct creators contributing positive active time in the measured period; not current enrollment count.

creator_secondsnumberrequired
creator_monthsnumberrequired
estimated_subtotal_centsinteger | nullrequired

Integer minor units (cents), or null when unconfigured or not exposed to this credential.

minimum_monthly_centsinteger | nullrequired

Integer minor units (cents), or null when unconfigured or not exposed to this credential.

estimated_total_centsinteger | nullrequired

Integer minor units (cents), or null when unconfigured or not exposed to this credential.

currencystringrequired

Values: EUR USD

estimatebooleanrequired

Always true.

simulatedbooleanrequired

Always false.

scopestringrequired

Always agency.

billing_basisstringrequired

Always active_api_scan_schedule.

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/usage
curl --request GET 'https://api.crd.systems/v1/usage?month=2026-09' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "month": "2026-09",
  "period_start": "2026-09-01T00:00:00.000Z",
  "period_end": "2026-10-01T00:00:00.000Z",
  "measured_through": "2026-09-16T00:00:00.000Z",
  "active_creator_count": 1,
  "creator_seconds": 1296000,
  "creator_months": 0.5,
  "estimated_subtotal_cents": null,
  "minimum_monthly_cents": null,
  "estimated_total_cents": null,
  "currency": "EUR",
  "estimate": true,
  "simulated": false,
  "scope": "agency",
  "billing_basis": "active_api_scan_schedule"
}

Recover your agency event stream

Requires events:read. Events are in insertion order and share IDs with signed webhook deliveries. Retain the last event ID for later polling even when next_cursor is null. The catalog covers API-linked current agency creators, synchronized native leak records, API scheduling/scans, and API deindex requests. Creator, case, and eligibility updates reflect state observed on reads or periodic worker reconciliation, not every intermediate database edit.

Permissionsevents:read

Parameters

limitquery

afterquery

Last event ID from this authorized stream.

Response

Returns 200 on success.

dataarray[]required
Show nested fields
idstringrequired
typestringrequired

Values: protection.activated protection.paused scan.completed scan.failed case.created deindex.status_changed creator.updated case.updated case.deleted

workspace_idstringrequired
created_atintegerrequired

Unix epoch milliseconds.

simulatedbooleanrequired

Always false.

dataobjectrequired
Show nested fields
creator_idstringrequired
scan_idstring
case_idstring
crd_job_idstring
statusstring
reasonstring
scopestring

Always api_scan_schedule.

deindex_request_idstring
submitted_to_providerboolean
removal_verifiedboolean
creatorobject
Show nested fields
idstringrequired
workspace_idstringrequired
external_idstringrequired
display_namestringrequired
aliasesarray[]required
profile_urlsarray[]required
protection_statusstringrequired

API schedule state, separate from enrollment and eligibility. Activation and resumption require an explicit protection PUT after current eligibility checks.

Values: not_activated active paused

created_atintegerrequired

Unix epoch milliseconds.

enrollment_statusstringrequired

Current CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.

crd_user_idstring | nullrequired
invitation_idstring | nullrequired
simulatedbooleanrequired

Always false.

scan_schedule_managed_bystringrequired

Always api.

crd_subscription_managed_bystringrequired

Always crd.

email_sentboolean

Present on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.

authorizationobjectrequired
entitlementobjectrequired
eligiblebooleanrequired
identity_sync_pendingbooleanrequired

True when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.

caseobject
Show nested fields
idstringrequired
scan_idstring | nullrequired

Known API scan ID, or null for a native CRD case without API-scan provenance.

creator_idstringrequired
statusstringrequired

Current native CRD finding state observed during synchronization, not a removal confirmation.

urlstringrequired

The finding URL from the creator’s current native CRD leak record.

simulatedbooleanrequired

Always false.

created_atintegerrequired

Unix epoch milliseconds.

sourcestringrequired

crd for native findings without known API-scan provenance; api_scan when a verified API scan mapping exists.

Values: crd api_scan

leak_idstringrequired

The underlying native CRD leak record ID. Use the API case id in public API paths.

updated_atintegerrequired

Native update time in epoch milliseconds, or the imported creation time until native state is observed.

actionableboolean | nullrequired

Native actionability flag when synchronized; null if not yet observed.

dead_on_arrivalboolean | nullrequired

Native dead-on-arrival flag when synchronized; null if not yet observed.

availablebooleanrequired

Whether the synchronized native record remains available. Removal is observed after complete reconciliation.

api_deindex_supportedbooleanrequired

Whether known API-scan provenance supports the API deindex route. Current authorization and entitlement are checked separately.

next_cursorstring | nullrequired

Last ID for the next page, or null. Retain the last returned event ID for subsequent polling.

Retries & errors

This read can be retried with exponential backoff. Honor Retry-After when it is returned.

Documented statuses: 200, 400, 401, 403, 404, 409, 429, 502, 503, 504. Error handling guide

GET/v1/events
curl --request GET 'https://api.crd.systems/v1/events?limit=25' \
  --header "Authorization: Bearer $CRD_API_KEY"
Use your secret key in the environment variable.
Example response · 200
{
  "data": [
    {
      "id": "evt_example",
      "type": "scan.completed",
      "workspace_id": "wsp_example",
      "created_at": 1790035200000,
      "simulated": false,
      "data": {
        "creator_id": "crt_example",
        "scan_id": "scn_example",
        "crd_job_id": "44444444-4444-4444-8444-444444444444"
      }
    }
  ],
  "next_cursor": null
}