Skip to content
ContentRemovalDeskDocumentation

Operate & monitor

Errors, limits & retries

Use error codes and request IDs to diagnose failures. Preserve operation identity when retrying uncertain writes.

REST API · JSONv0.2.0 · Live CRD integration
On this page

Read the error response

Service errors return an error object and usually request_id. HTTP ingress failures may include only error.code. Live service responses identify their mode with X-CRD-Mode: live.

Record the HTTP status, error code, and request ID when diagnosing failures. Do not log credentials, signing secrets, or authorization evidence.

Example · 409 Conflictjson
{
  "error": {
    "code": "creator_not_eligible",
    "message": "The creator must have a verified mandate and active CRD entitlement."
  },
  "request_id": "req_example"
}

HTTP status codes

StatusMeaningNext step
400Invalid requestCheck fields, types, and URL rules.
401UnauthorizedCheck live key, expiry, and revocation.
403Access or verification deniedCheck scopes and current agency verification.
404Resource unavailableCheck the ID and current agency access.
409Conflict or workflow gateInspect the specific code before retrying.
413 / 415Body or media type rejectedUse JSON below the request size limit.
429Rate or scan limitHonor Retry-After when present and back off.
502 / 503Provider unavailable or invalid responseRetry reads with backoff; preserve idempotency on writes.

Common workflow errors

CodeHow to resolve it
agency_verification_unavailableCRD must configure or restore server-side agency verification.
agency_account_requiredComplete agency onboarding and KYC approval, then open /agency/api as the current owner.
agency_kyc_requiredComplete agency KYC and wait for approval.
agency_owner_changedHave the current verified owner open /agency/api and issue new keys and webhook endpoints.
agency_key_reissue_requiredIssue a replacement key after the verified agency binding.
crd_engine_not_configuredCRD must configure the real provider; no synthetic fallback is used.
creator_invitation_pendingWait for invitation acceptance and creator onboarding.
creator_not_eligibleResolve the creator’s actual mandate or entitlement requirement.
creator_rebinding_requiredAsk CRD to review a creator tied to an earlier agency binding.
external_id_conflictUse the original enrollment payload; this is not an update route.
capacity_reachedAsk CRD to adjust the active creator allowance.
native_case_managed_by_crdThis native case has no verified API-scan mapping. Use the existing CRD admin workflow; inspect api_deindex_supported before offering this API action.
scan_in_progressFollow the existing pending scan.
idempotency_conflictRetry with the original key and input.
scan_limit_reachedWait for the rolling manual scan allowance.

Preserve the logical operation

Enrollment uses your stable external ID and identical payload for reconciliation. Scan and deindex writes use the same Idempotency-Key across retries. A fresh key describes new work, not a retry.

An uncertain worker state means the service is reconciling real effects. Do not assume the operation failed or repeat it with a different identity. Read the resource and contact CRD when reconciliation is needed.

Follow each collection’s returned cursor

Use limit from 1 to 100; the default is 25. Follow next_cursor until it is null. Do not infer completion solely from an empty data array: access filtering can leave an empty page that still has a next cursor. Treat cursors as opaque values returned by that collection.

These collections reflect changing live records, not a frozen export. Deduplicate by resource ID while paging. For event polling, keep the previous saved cursor when no newer accessible event is returned, and process repeated events safely.

CollectionCursor to send as afterBehavior
GET /v1/creatorsThe returned next_cursor, a native CRD user UUID.Current eligible-to-access agency roster, ordered by native user ID. Do not substitute a crt_… API ID.
GET /v1/creators/{id}/casesThe returned next_cursor, an API case ID.Current native findings for that creator. Keep cursors inside the same creator collection.
GET /v1/eventsThe returned next_cursor while paging, then the last processed event ID for later polling.Insertion order, filtered by current creator access. Events and webhook deliveries share event IDs.

Retry the operation, not a new copy of the work

Scan idempotency keys are unique across the agency’s scan operations, not only within one creator. Deindex keys are unique across the agency’s deindex operations. Use a different key for each logical operation and keep scan and deindex operation records separate.

The live scan and deindex routes accept Idempotency-Key values of 1–120 characters. A matching write retry may return 200 instead of the original 201 or 202. HTTP acceptance does not mean the asynchronous work completed.

OperationSave before sendingSafe retry approach
POST creator enrollmentworkspace_id, stable external_id, and the original complete JSON payload.Resend the same payload. Omitted defaults, field order, and array order can affect reconciliation; preserve the original request. Use PATCH for later changes.
PATCH creator identityCreator ID and the desired non-empty subset of fields.Repeat the same update. Names are set; aliases and URLs merge without removing other entries.
PUT protection statusCreator ID and desired active or paused state.Read eligibility when blocked; repeat the same desired state after the requirement is resolved.
POST scanA unique Idempotency-Key for this logical scan and its creator ID.Reuse the key and input after a lost response. A matching retry returns the original scan.
POST deindex requestA unique Idempotency-Key for this logical case request and provider google.Reuse the key and input after a lost response. Follow the existing request rather than creating another.

Default operating limits

These are implementation defaults, not a service-level commitment. Confirm deployment capacity and commercial limits with CRD.

ControlDefault
Requests120 per agency API account per fixed minute; configurable by CRD.
Request body16 KiB.
Creator aliases / URLsUp to 30 aliases and 20 profile URLs per request.
Agency workspaceOne assigned workspace.
Total creator enrollmentUp to five times the active creator capacity.
Pending scansOne per creator.
Manual scansFive per creator per rolling 24 hours.
Webhook attemptsUp to five attempts with exponential backoff.

Handle rate limits and transient errors

The default request allowance is 120 requests per agency API account per fixed minute, shared by all of that agency’s keys. Creating another key does not create an independent allowance. Manual scans have a separate limit of five per creator over the preceding 24 hours. Scheduled work and webhook delivery are not additional client requests you need to poll continuously.

For 429 rate_limited, pause the agency’s request queue and retry with exponential backoff and jitter. Honor Retry-After if supplied by the deployment; the live API does not guarantee that header. For 429 scan_limit_reached, wait for the creator’s rolling manual-scan allowance instead of immediately retrying.

Retry transient network failures and 502/503/504 reads with backoff. For writes, preserve the same external ID or idempotency key. Do not blindly retry 400 validation failures, 401 invalid credentials, 403 missing permissions, or 409 workflow requirements; correct the reported cause first.

Include the request ID when investigating

Keep the method, endpoint, HTTP status, error code, and request_id or X-Request-ID if present. Do not log the Authorization header, webhook signing secret, or private authorization evidence.

Request & response example

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
}

Illustrative response. Replace example resource IDs with the IDs returned by your API requests. View endpoint details.