THE COMPLETE CONTRACT
API reference
Every endpoint, parameter and response. Examples use standard HTTP clients and your server’s environment variables.
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.
any valid agency keyResponse
Returns 200 on success.
partnerobjectrequiredShow nested fields
idstringrequirednamestringrequiredkindstringrequiredAlways agency.
workspace_idstring | nullrequiredkey_idstring | nullrequiredscopesarray[]requiredexpires_atinteger | nullrequiredKey expiration in epoch milliseconds, or null when there is no scheduled expiration. Revocation, agency verification, ownership, and scope checks still apply.
environmentstringrequiredAlways live.
workspacesarray[]requiredShow nested fields
idstringrequiredexternal_idstringrequirednamestringrequiredengine_configuredbooleanrequiredRetries & 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
/v1/mecurl --request GET 'https://api.crd.systems/v1/me' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
workspaces:readParameters
idpathrequiredResponse
Returns 200 on success.
idstringrequiredexternal_idstringrequirednamestringrequiredcreated_atintegerrequiredUnix 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
/v1/workspaces/{id}curl --request GET 'https://api.crd.systems/v1/workspaces/wsp_example' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
creators:writeRequest body
workspace_idstringrequiredMaximum 200 characters.
external_idstringrequiredMaximum 200 characters.
display_namestringrequiredMaximum 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_idstringemailstringMaximum 254 characters.
first_namestringMaximum 100 characters.
last_namestringMaximum 100 characters.
localestringValues: en fr
Response
Returns 201 on success.
idstringrequiredworkspace_idstringrequiredexternal_idstringrequireddisplay_namestringrequiredaliasesarray[]requiredprofile_urlsarray[]requiredprotection_statusstringrequiredAPI 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_atintegerrequiredUnix epoch milliseconds.
enrollment_statusstringrequiredCurrent CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.
crd_user_idstring | nullrequiredinvitation_idstring | nullrequiredsimulatedbooleanrequiredAlways false.
scan_schedule_managed_bystringrequiredAlways api.
crd_subscription_managed_bystringrequiredAlways crd.
email_sentbooleanPresent 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_pendingbooleanrequiredTrue 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
/v1/creatorscurl --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"
]
}'{
"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.
creators:readParameters
limitqueryafterqueryCanonical CRD user UUID from next_cursor.
Response
Returns 200 on success.
dataarray[]requiredShow nested fields
idstringrequiredworkspace_idstringrequiredexternal_idstringrequireddisplay_namestringrequiredaliasesarray[]requiredprofile_urlsarray[]requiredprotection_statusstringrequiredAPI 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_atintegerrequiredUnix epoch milliseconds.
enrollment_statusstringrequiredCurrent CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.
crd_user_idstring | nullrequiredinvitation_idstring | nullrequiredsimulatedbooleanrequiredAlways false.
scan_schedule_managed_bystringrequiredAlways api.
crd_subscription_managed_bystringrequiredAlways crd.
email_sentbooleanPresent on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.
authorizationobjectrequiredShow nested fields
approvedbooleanrequiredstatusstringexpires_atstring | nullentitlementobjectrequiredShow nested fields
activebooleanrequiredsourcestringeligiblebooleanrequiredidentity_sync_pendingbooleanrequiredTrue when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.
next_cursorstring | nullrequiredLast 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
/v1/creatorscurl --request GET 'https://api.crd.systems/v1/creators?limit=25' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
creators:readParameters
idpathrequiredResponse
Returns 200 on success.
idstringrequiredworkspace_idstringrequiredexternal_idstringrequireddisplay_namestringrequiredaliasesarray[]requiredprofile_urlsarray[]requiredprotection_statusstringrequiredAPI 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_atintegerrequiredUnix epoch milliseconds.
enrollment_statusstringrequiredCurrent CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.
crd_user_idstring | nullrequiredinvitation_idstring | nullrequiredsimulatedbooleanrequiredAlways false.
scan_schedule_managed_bystringrequiredAlways api.
crd_subscription_managed_bystringrequiredAlways crd.
email_sentbooleanPresent on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.
authorizationobjectrequiredShow nested fields
approvedbooleanrequiredstatusstringexpires_atstring | nullentitlementobjectrequiredShow nested fields
activebooleanrequiredsourcestringeligiblebooleanrequiredidentity_sync_pendingbooleanrequiredTrue 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
/v1/creators/{id}curl --request GET 'https://api.crd.systems/v1/creators/crt_example' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
creators:writeParameters
idpathrequiredRequest body
display_namestringMaximum 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.
idstringrequiredworkspace_idstringrequiredexternal_idstringrequireddisplay_namestringrequiredaliasesarray[]requiredprofile_urlsarray[]requiredprotection_statusstringrequiredAPI 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_atintegerrequiredUnix epoch milliseconds.
enrollment_statusstringrequiredCurrent CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.
crd_user_idstring | nullrequiredinvitation_idstring | nullrequiredsimulatedbooleanrequiredAlways false.
scan_schedule_managed_bystringrequiredAlways api.
crd_subscription_managed_bystringrequiredAlways crd.
email_sentbooleanPresent on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.
authorizationobjectrequiredShow nested fields
approvedbooleanrequiredstatusstringexpires_atstring | nullentitlementobjectrequiredShow nested fields
activebooleanrequiredsourcestringeligiblebooleanrequiredidentity_sync_pendingbooleanrequiredTrue 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
/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"
]
}'{
"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.
protection:writeParameters
idpathrequiredRequest body
statusstringrequiredValues: active paused
Response
Returns 200 on success.
idstringrequiredworkspace_idstringrequiredexternal_idstringrequireddisplay_namestringrequiredaliasesarray[]requiredprofile_urlsarray[]requiredprotection_statusstringrequiredAPI 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_atintegerrequiredUnix epoch milliseconds.
enrollment_statusstringrequiredCurrent CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.
crd_user_idstring | nullrequiredinvitation_idstring | nullrequiredsimulatedbooleanrequiredAlways false.
scan_schedule_managed_bystringrequiredAlways api.
crd_subscription_managed_bystringrequiredAlways crd.
email_sentbooleanPresent 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_pendingbooleanrequiredTrue 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
/v1/creators/{id}/protectioncurl --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"
}'{
"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.
scans:writeParameters
idpathrequiredIdempotency-KeyheaderrequiredStable key for one logical operation. Reuse unchanged for retries.
Request body
Send an empty JSON object: {}.
Response
Returns 202 on success.
idstringrequiredcreator_idstringrequiredstatusstringrequiredValues: queued dispatching running uncertain completed failed cancelled
sourcestringrequiredValues: manual scheduled
created_atintegerrequiredUnix epoch milliseconds.
finished_atinteger | nullrequiredUnix epoch milliseconds, or null.
error_codestring | nullrequiredcrd_job_idstring | nullrequiredsimulatedbooleanrequiredAlways 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
/v1/creators/{id}/scanscurl --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 '{}'{
"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.
scans:readParameters
idpathrequiredResponse
Returns 200 on success.
idstringrequiredcreator_idstringrequiredstatusstringrequiredValues: queued dispatching running uncertain completed failed cancelled
sourcestringrequiredValues: manual scheduled
created_atintegerrequiredUnix epoch milliseconds.
finished_atinteger | nullrequiredUnix epoch milliseconds, or null.
error_codestring | nullrequiredcrd_job_idstring | nullrequiredsimulatedbooleanrequiredAlways 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
/v1/scans/{id}curl --request GET 'https://api.crd.systems/v1/scans/scn_example' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
cases:readParameters
idpathrequiredlimitqueryafterqueryLast case ID in this creator’s authorized collection.
Response
Returns 200 on success.
dataarray[]requiredShow nested fields
idstringrequiredscan_idstring | nullrequiredKnown API scan ID, or null for a native CRD case without API-scan provenance.
creator_idstringrequiredstatusstringrequiredCurrent native CRD finding state observed during synchronization, not a removal confirmation.
urlstringrequiredThe finding URL from the creator’s current native CRD leak record.
simulatedbooleanrequiredAlways false.
created_atintegerrequiredUnix epoch milliseconds.
sourcestringrequiredcrd for native findings without known API-scan provenance; api_scan when a verified API scan mapping exists.
Values: crd api_scan
leak_idstringrequiredThe underlying native CRD leak record ID. Use the API case id in public API paths.
updated_atintegerrequiredNative update time in epoch milliseconds, or the imported creation time until native state is observed.
actionableboolean | nullrequiredNative actionability flag when synchronized; null if not yet observed.
dead_on_arrivalboolean | nullrequiredNative dead-on-arrival flag when synchronized; null if not yet observed.
availablebooleanrequiredWhether the synchronized native record remains available. Removal is observed after complete reconciliation.
api_deindex_supportedbooleanrequiredWhether known API-scan provenance supports the API deindex route. Current authorization and entitlement are checked separately.
next_cursorstring | nullrequiredRetries & 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
/v1/creators/{id}/casescurl --request GET 'https://api.crd.systems/v1/creators/crt_example/cases?limit=25' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
cases:readdeindex:writeParameters
idpathrequiredIdempotency-KeyheaderrequiredStable key for one logical operation. Reuse unchanged for retries.
Request body
providerstringrequiredAlways google.
Response
Returns 202 on success.
idstringrequiredcase_idstringrequiredcreator_idstringrequiredproviderstringrequiredAlways google.
statusstringrequiredActual processing state. queued is not submission or verified removal; dispatching and uncertain require reconciliation.
simulatedbooleanrequiredAlways false.
submitted_to_providerbooleanrequiredremoval_verifiedbooleanrequiredcreated_atintegerrequiredUnix epoch milliseconds.
updated_atintegerrequiredUnix epoch milliseconds.
error_codestring | nullrequiredRetries & 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
/v1/cases/{id}/deindex-requestscurl --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"
}'{
"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.
cases:readParameters
idpathrequiredResponse
Returns 200 on success.
idstringrequiredcase_idstringrequiredcreator_idstringrequiredproviderstringrequiredAlways google.
statusstringrequiredActual processing state. queued is not submission or verified removal; dispatching and uncertain require reconciliation.
simulatedbooleanrequiredAlways false.
submitted_to_providerbooleanrequiredremoval_verifiedbooleanrequiredcreated_atintegerrequiredUnix epoch milliseconds.
updated_atintegerrequiredUnix epoch milliseconds.
error_codestring | nullrequiredRetries & 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
/v1/deindex-requests/{id}curl --request GET 'https://api.crd.systems/v1/deindex-requests/dix_example' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
usage:readParameters
monthqueryUTC calendar month YYYY-MM; defaults to the current month.
Response
Returns 200 on success.
monthstringrequiredperiod_startstringrequiredperiod_endstringrequiredmeasured_throughstringrequiredactive_creator_countintegerrequiredDistinct creators contributing positive active time in the measured period; not current enrollment count.
creator_secondsnumberrequiredcreator_monthsnumberrequiredestimated_subtotal_centsinteger | nullrequiredInteger minor units (cents), or null when unconfigured or not exposed to this credential.
minimum_monthly_centsinteger | nullrequiredInteger minor units (cents), or null when unconfigured or not exposed to this credential.
estimated_total_centsinteger | nullrequiredInteger minor units (cents), or null when unconfigured or not exposed to this credential.
currencystringrequiredValues: EUR USD
estimatebooleanrequiredAlways true.
simulatedbooleanrequiredAlways false.
scopestringrequiredAlways agency.
billing_basisstringrequiredAlways 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
/v1/usagecurl --request GET 'https://api.crd.systems/v1/usage?month=2026-09' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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.
events:readParameters
limitqueryafterqueryLast event ID from this authorized stream.
Response
Returns 200 on success.
dataarray[]requiredShow nested fields
idstringrequiredtypestringrequiredValues: protection.activated protection.paused scan.completed scan.failed case.created deindex.status_changed creator.updated case.updated case.deleted
workspace_idstringrequiredcreated_atintegerrequiredUnix epoch milliseconds.
simulatedbooleanrequiredAlways false.
dataobjectrequiredShow nested fields
creator_idstringrequiredscan_idstringcase_idstringcrd_job_idstringstatusstringreasonstringscopestringAlways api_scan_schedule.
deindex_request_idstringsubmitted_to_providerbooleanremoval_verifiedbooleancreatorobjectShow nested fields
idstringrequiredworkspace_idstringrequiredexternal_idstringrequireddisplay_namestringrequiredaliasesarray[]requiredprofile_urlsarray[]requiredprotection_statusstringrequiredAPI 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_atintegerrequiredUnix epoch milliseconds.
enrollment_statusstringrequiredCurrent CRD linkage state, for example invited, pending_onboarding, linked, enrolling, failed, or uncertain.
crd_user_idstring | nullrequiredinvitation_idstring | nullrequiredsimulatedbooleanrequiredAlways false.
scan_schedule_managed_bystringrequiredAlways api.
crd_subscription_managed_bystringrequiredAlways crd.
email_sentbooleanPresent on a new enrollment response. True means the email provider accepted the invitation email; it does not prove inbox delivery, acceptance, authorization, or activation.
authorizationobjectrequiredentitlementobjectrequiredeligiblebooleanrequiredidentity_sync_pendingbooleanrequiredTrue when an accepted invitation still needs legal onboarding before its submitted identity data can be applied.
caseobjectShow nested fields
idstringrequiredscan_idstring | nullrequiredKnown API scan ID, or null for a native CRD case without API-scan provenance.
creator_idstringrequiredstatusstringrequiredCurrent native CRD finding state observed during synchronization, not a removal confirmation.
urlstringrequiredThe finding URL from the creator’s current native CRD leak record.
simulatedbooleanrequiredAlways false.
created_atintegerrequiredUnix epoch milliseconds.
sourcestringrequiredcrd for native findings without known API-scan provenance; api_scan when a verified API scan mapping exists.
Values: crd api_scan
leak_idstringrequiredThe underlying native CRD leak record ID. Use the API case id in public API paths.
updated_atintegerrequiredNative update time in epoch milliseconds, or the imported creation time until native state is observed.
actionableboolean | nullrequiredNative actionability flag when synchronized; null if not yet observed.
dead_on_arrivalboolean | nullrequiredNative dead-on-arrival flag when synchronized; null if not yet observed.
availablebooleanrequiredWhether the synchronized native record remains available. Removal is observed after complete reconciliation.
api_deindex_supportedbooleanrequiredWhether known API-scan provenance supports the API deindex route. Current authorization and entitlement are checked separately.
next_cursorstring | nullrequiredLast 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
/v1/eventscurl --request GET 'https://api.crd.systems/v1/events?limit=25' \
--header "Authorization: Bearer $CRD_API_KEY"{
"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
}