Skip to content
ContentRemovalDeskDocumentation

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.

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

One roster in your dashboard and API

GET /v1/creators reads the agency’s existing CRD creator roster and assigns stable API creator IDs where needed. It does not activate scheduling or start billing. Use limit up to 100 and the returned next_cursor CRD user UUID as after for another page.

GET /v1/creators/{id} refreshes the same creator identity. Name, alias, and official profile edits made in the CRD agency dashboard appear in API reads. Use the returned API creator ID for subsequent requests.

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.

Send supported identity data only

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.

FieldRules
external_idYour stable ID, 1–200 characters; unique within the workspace.
display_nameCreator display name, 1–160 characters.
aliasesUp to 30 names or usernames, at most 160 characters each.
profile_urlsUp to 20 supported official HTTPS profile URLs, at most 2,048 characters each.
crd_user_idExisting CRD creator UUID, or use the invitation fields instead.
email / first_name / last_nameRequired for an invitation when crd_user_id is absent; email ≤254 characters and each name ≤100.
localeOptional 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.

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.

Aliases do not require a supported profile host

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.

Profile hosts currently acceptedURL format
OnlyFans, Fansly, Stripchat, Chaturbate, RevealMe, Instagram, X/TwitterOfficial HTTPS host followed by one username path.
MYMhttps://mym.fans/username or https://mym.com/username, optionally with /en/ or /fr/ before the username. Responses use mym.fans.
TikTokhttps://www.tiktok.com/@username.
ManyVidshttps://www.manyvids.com/Profile/12345/username.

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.

One creator remains one profile

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 stateIntegration action
No crd_user_id; enrollment_status indicates an invitationShow that acceptance/onboarding is pending. Poll the creator or refresh after creator.updated.
Linked; identity_sync_pending: trueSome submitted identity data awaits completion of the existing signed legal onboarding. Keep the same creator ID.
authorization.approved: falseShow authorization required or under review. The creator and CRD use the existing portal signing/review process.
entitlement.active: falseResolve the existing account or agency entitlement through CRD; the API does not purchase a subscription.
eligible: true; protection_status: not_activated or pausedSend the explicit active PUT if the agency wants API scheduling enabled.
eligible: true; protection_status: activeFollow scheduled work or request a manual scan with a stable Idempotency-Key.
Enrollment failed or uncertainInspect the returned error and reconcile the same external_id and original payload before retrying.

Request & response example

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
}

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