API Reference

FanLock Platform API

REST API for managing creators, submitting URLs, and tracking credits.

Enterprise partners only

This API is for enterprise platform partners. There is no API for agencies or solo creators. Schedule a call to get access.

Quick start

1

Get your API key

Provided during onboarding

2

Register creators

POST /submit-creators

3

Submit URLs

POST /submit-urls

bash
# Test your API key
curl https://fanlock.com/api/platforms/health

# List your creators
curl https://fanlock.com/api/platforms/creators \
  -H "X-API-Key: fl_your_api_key"
BASE URLhttps://fanlock.com/api/platforms

Authentication

Pass your API key in the X-API-Key header. All endpoints except /health require it.

curlbash
curl https://fanlock.com/api/platforms/creators \
  -H "X-API-Key: fl_your_api_key"
fetchtypescript
const res = await fetch(
  "https://fanlock.com/api/platforms/creators",
  {
    headers: {
      "X-API-Key": process.env.FANLOCK_API_KEY!,
    },
  }
);
const data = await res.json();
401Invalid or missing API key
429Too many failed auth attempts — check Retry-After header
413Request body exceeds 5 MB

Errors & Rate Limits

All errors return JSON with an error string. Rate limits return 429 with Retry-After seconds.

400Validation error
401Invalid API key or inactive account
402Insufficient credits — includes required and balance
404Creator not found
429Rate limited — respect Retry-After
500Server error — retry with backoff
Example error
{
  "error": "Rate limit exceeded",
  "retryAfterSeconds": 30
}

Health Check

GET/health

Returns API status. No auth required.

{ "status": "ok" }

Register Creators

POST/submit-creators

Bulk register or update creators. Upserts on email — idempotent and safe to retry.

Request body

creatorsCreatorInput[]required

Max 500 per request.

CreatorInput

stage_namestringrequired

Display name.

emailstringrequired

Unique key for upsert.

official_linksOfficialLink[]required

At least one. Each has platform + handle.

legal_namestring

For DMCA filings.

notification_emailstring

Separate notification address.

notesstring

Internal notes.

Platforms

onlyfansfanslyfanvuemanyvidschaturbatestripchatcam4bongacamslivejasmincamsodapatreontwitterinstagramtiktokredditpornhubxvideosxhamsterother
Examplebash
curl -X POST https://fanlock.com/api/platforms/submit-creators \
  -H "X-API-Key: fl_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "creators": [{
      "stage_name": "ExampleCreator",
      "email": "creator@example.com",
      "legal_name": "Jane Doe",
      "official_links": [
        { "platform": "onlyfans", "handle": "examplecreator" },
        { "platform": "fansly", "handle": "examplecreator" }
      ]
    }]
  }'
201 Created
{ "created": 1, "updated": 0 }

List Creators

GET/creators

Paginated list of your creators.

Query params

limitint

Default 50, max 1000.

offsetint

Default 0.

200 OK
{
  "creators": [{
    "id": "uuid",
    "stage_name": "ExampleCreator",
    "email": "creator@example.com",
    "official_links": [{ "platform": "onlyfans", "handle": "examplecreator" }],
    "created_at": "2026-03-01T00:00:00Z"
  }],
  "total": 1,
  "limit": 50,
  "offset": 0
}

Get Creator

GET/creators/:id

Get a single creator by ID.

200 OK
{ "creator": { "id": "uuid", "stage_name": "ExampleCreator", ... } }

Update Creator

PATCH/creators/:id

Partial update. Only include fields to change.

Fields

stage_namestring

Cannot be empty.

emailstring

Must be valid.

legal_namestring | null

Pass null to clear.

notification_emailstring | null

Pass null to clear.

official_linksOfficialLink[]

Replaces all links. Min 1.

notesstring | null

Pass null to clear.

Examplebash
curl -X PATCH https://fanlock.com/api/platforms/creators/uuid \
  -H "X-API-Key: fl_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "stage_name": "NewName" }'

Delete Creator

DELETE/creators/:id

Delete a creator. Pass ?confirm=false for a dry run.

Query params

confirmstring

Set to false to preview associated data counts without deleting.

Dry run (200)
{
  "creator": { "id": "uuid", "stage_name": "ExampleCreator" },
  "associated_urls": 142,
  "associated_takedowns": 98
}

Creator Stats

GET/creators/stats

URL submission stats per creator.

Query params

searchstring

Filter by stage name (case-insensitive).

200 OK
{
  "stats": [{
    "creator_id": "uuid",
    "stage_name": "ExampleCreator",
    "total_urls": 350,
    "new_urls": 280,
    "duplicate_urls": 60,
    "invalid_urls": 10
  }]
}

Submit URLs

POST/submit-urls

Submit infringing URLs for takedown. URLs are deduplicated, validated, and processed automatically.

Request body

groupsUrlGroup[]required

Max 100 groups per request.

notesstring

Batch-level notes.

UrlGroup

creator_idstringrequired

Creator UUID.

urlsstring[]required

Max 2048 chars each. Max 10,000 total per request.

DeduplicationPer-creator URL hashing. Same URL for different creators is not a dupe.
Credits1 credit per new URL. Dupes and invalid = free.
RefundsAuto-refunded if processing fails.
Examplebash
curl -X POST https://fanlock.com/api/platforms/submit-urls \
  -H "X-API-Key: fl_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "groups": [
      {
        "creator_id": "creator_abc123",
        "urls": [
          "https://piracy-site.com/stolen-content",
          "https://leak-forum.net/uploads/12345",
          "https://t.me/leakchannel/456"
        ]
      },
      {
        "creator_id": "creator_def456",
        "urls": ["https://x.com/leaker/status/123456"]
      }
    ],
    "notes": "Weekly scan batch"
  }'
201 Created
{
  "batchId": "uuid",
  "urlCount": 4,
  "new": 3,
  "duplicate": 1,
  "invalid": 0,
  "byHost": {
    "piracy-site.com": {
      "total": 1, "new": 1, "duplicate": 0, "invalid": 0,
      "contact": {
        "takedown_method": "email",
        "dmca_email": "abuse@piracy-site.com",
        "registrar_name": "Namecheap",
        "registrar_email": "abuse@namecheap.com"
      }
    },
    "t.me": { "total": 1, "new": 1, "duplicate": 0, "invalid": 0, "contact": null },
    "x.com": {
      "total": 1, "new": 0, "duplicate": 1, "invalid": 0,
      "contact": { "takedown_method": "form", "form_url": "..." }
    }
  }
}
402Insufficient credits — includes required and balance
207Partial success — processing failed, credits refunded. Resubmit.

Transactions

GET/transactions

Credit transaction history — debits, top-ups, and refunds.

Query params

pageint

Zero-indexed. Default 0.

limitint

Default 25, max 100.

200 OK
{
  "transactions": [
    { "id": "uuid", "type": "debit",  "amount": 150, "description": "Batch ...: 150 new URLs", "created_at": "..." },
    { "id": "uuid", "type": "topup",  "amount": 1000, "description": "Credit purchase", "created_at": "..." },
    { "id": "uuid", "type": "refund", "amount": 50,  "description": "Refund for failed batch ...", "created_at": "..." }
  ],
  "total": 24,
  "page": 0,
  "limit": 25
}

Ready to integrate?

Get your API key, staging access, and a dedicated support channel.

Get API Access