Build your integration
Creators & aliases
Read and update the same creator roster used in your CRD agency dashboard, or invite a new creator through existing onboarding.
On this page
Link an existing creator or invite a new one
POST /v1/creators requires workspace_id, your stable external_id, and display_name. Read the roster first and reuse an existing API creator ID. When linking by CRD identity, include crd_user_id. The profile must belong to the bound agency and must not be a staff account.
For a new creator, omit crd_user_id and provide email, first_name, last_name, and optional locale (en or fr). The invitation uses CRD’s existing onboarding flow and sends real email. It does not fabricate a signed mandate, approved identity, or subscription.
Names, aliases, and official URLs
Names, aliases, and supported profiles connect to the same creator identity used by CRD. Added URLs are unverified profile data; supplying a URL does not verify ownership. Several aliases or URLs remain one creator profile. Stored aliases may be up to 160 characters, but the current scan variant builder uses aliases of 2–60 characters containing a Latin letter and selects up to two extra variants per handle.
Unknown fields are rejected. There is no media upload endpoint. Do not include passwords, session cookies, private messages, photos, or voice files in the payload.
| Field | Rules |
|---|---|
| external_id | Your stable ID, 1–200 characters; unique within the workspace. |
| display_name | Creator display name, 1–160 characters. |
| aliases | Up to 30 names or usernames, at most 160 characters each. |
| profile_urls | Up to 20 supported official HTTPS profile URLs, at most 2,048 characters each. |
| crd_user_id | Existing CRD creator UUID, or use the invitation fields instead. |
| email / first_name / last_name | Required for an invitation when crd_user_id is absent; email ≤254 characters and each name ≤100. |
| locale | Optional en or fr for the invitation flow. |
Update the same creator from your backend
PATCH /v1/creators/{id} accepts a non-empty subset of display_name, aliases, and profile_urls. It writes to the linked creator’s actual CRD identity, so the agency dashboard and later API reads see the change.
Omitted fields remain unchanged. Aliases and official profiles merge into the existing collections; they do not remove other entries. Use PATCH for identity changes rather than resubmitting enrollment with changed fields.
Keep your enrollment request stable
Use the same external_id and complete payload when retrying an uncertain enrollment. A matching existing enrollment returns the same creator; changed fields return external_id_conflict. Enrollment is not a profile update endpoint.
If the roster already imported the same CRD user, enrollment reuses its stable API creator ID and can assign your external ID once. It does not create a duplicate profile. Read GET /v1/creators/{id} for current linkage and eligibility; identity_sync_pending means submitted identity data still awaits legal onboarding. Creating an invitation or API creator record alone does not make the creator eligible for a scan.
Onboard several creators with one agency key
There is no bulk enrollment, bulk activation, or bulk scan endpoint. For ten creators, process ten individual creator records using the same agency key, with a distinct stable external_id for each. Preserve a separate API creator ID, enrollment state, and retry state for each record.
Use a queue with bounded concurrency rather than sending the entire roster at once. One invitation still awaiting acceptance should not prevent an already eligible creator from proceeding. As each creator becomes eligible, send its explicit protection activation request.
Use a different idempotency key for each creator’s scan or deindex operation. Keep each operation’s original key for retries. Handle partial success per creator and resume only unfinished work; do not recreate successful creators or rescan successful jobs because another record failed.
Several aliases and social profile URLs belong to the same creator. They are not separate creator enrollments. Active protection time, rather than the number of aliases or ordinary requests, drives the current API usage meter.
Read the creator’s current state
The response includes enrollment_status, crd_user_id, protection_status, and simulated: false. GET also reports the actual authorization, entitlement, and eligible state. Save the API creator ID alongside your external ID.
Protection status describes the API’s schedule: not_activated has no active usage interval, active enables scheduling, and paused stops future API scheduling. The creator’s underlying CRD subscription is managed separately.
Turn creator state into a clear next action
Eligibility can change after activation. Read current state when an operation is rejected, rather than treating a previously approved creator as permanently eligible. A transferred or archived creator may no longer be accessible to the original agency.
| Observed state | Integration action |
|---|---|
| No crd_user_id; enrollment_status indicates an invitation | Show that acceptance/onboarding is pending. Poll the creator or refresh after creator.updated. |
| Linked; identity_sync_pending: true | Some submitted identity data awaits completion of the existing signed legal onboarding. Keep the same creator ID. |
| authorization.approved: false | Show authorization required or under review. The creator and CRD use the existing portal signing/review process. |
| entitlement.active: false | Resolve the existing account or agency entitlement through CRD; the API does not purchase a subscription. |
| eligible: true; protection_status: not_activated or paused | Send the explicit active PUT if the agency wants API scheduling enabled. |
| eligible: true; protection_status: active | Follow scheduled work or request a manual scan with a stable Idempotency-Key. |
| Enrollment failed or uncertain | Inspect the returned error and reconcile the same external_id and original payload before retrying. |
Request & response example
/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
}Illustrative response. Replace example resource IDs with the IDs returned by your API requests. View endpoint details.
Send usernames and the profile links you already have
Send pseudonyms, alternate spellings, and usernames in aliases. You do not need to label each alias with a social network. When you also have an official profile link, include it in profile_urls: the existing CRD integration extracts its platform and username and stores them in the creator’s native platform records.
For example, https://onlyfans.com/example_creator supplies the username example_creator, and https://mym.fans/fr/example_mym supplies example_mym. CRD’s existing leak scanner uses its supported creator-platform handles, including OnlyFans and MYM, with alias variants. Social profiles remain part of the native identity and impersonation workflows; adding a social URL does not mean its handle becomes a leak-search query.
The profile URL field currently accepts only the listed platforms. For another network, include the creator’s relevant username in aliases. Do not put an unsupported URL into profile_urls or treat a submitted link as verified ownership.