API Reference
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.
Get your API key
Provided during onboarding
Register creators
POST /submit-creators
Submit URLs
POST /submit-urls
# 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"
https://fanlock.com/api/platformsPass your API key in the X-API-Key header. All endpoints except /health require it.
curl https://fanlock.com/api/platforms/creators \ -H "X-API-Key: fl_your_api_key"
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 key429Too many failed auth attempts — check Retry-After header413Request body exceeds 5 MBAll errors return JSON with an error string. Rate limits return 429 with Retry-After seconds.
400Validation error401Invalid API key or inactive account402Insufficient credits — includes required and balance404Creator not found429Rate limited — respect Retry-After500Server error — retry with backoff{
"error": "Rate limit exceeded",
"retryAfterSeconds": 30
}/healthReturns API status. No auth required.
{ "status": "ok" }/submit-creatorsBulk register or update creators. Upserts on email — idempotent and safe to retry.
creatorsCreatorInput[]requiredMax 500 per request.
stage_namestringrequiredDisplay name.
emailstringrequiredUnique key for upsert.
official_linksOfficialLink[]requiredAt least one. Each has platform + handle.
legal_namestringFor DMCA filings.
notification_emailstringSeparate notification address.
notesstringInternal notes.
onlyfansfanslyfanvuemanyvidschaturbatestripchatcam4bongacamslivejasmincamsodapatreontwitterinstagramtiktokredditpornhubxvideosxhamsterothercurl -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" }
]
}]
}'{ "created": 1, "updated": 0 }/creatorsPaginated list of your creators.
limitintDefault 50, max 1000.
offsetintDefault 0.
{
"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
}/creators/:idGet a single creator by ID.
{ "creator": { "id": "uuid", "stage_name": "ExampleCreator", ... } }/creators/:idPartial update. Only include fields to change.
stage_namestringCannot be empty.
emailstringMust be valid.
legal_namestring | nullPass null to clear.
notification_emailstring | nullPass null to clear.
official_linksOfficialLink[]Replaces all links. Min 1.
notesstring | nullPass null to clear.
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" }'/creators/:idDelete a creator. Pass ?confirm=false for a dry run.
confirmstringSet to false to preview associated data counts without deleting.
{
"creator": { "id": "uuid", "stage_name": "ExampleCreator" },
"associated_urls": 142,
"associated_takedowns": 98
}/creators/statsURL submission stats per creator.
searchstringFilter by stage name (case-insensitive).
{
"stats": [{
"creator_id": "uuid",
"stage_name": "ExampleCreator",
"total_urls": 350,
"new_urls": 280,
"duplicate_urls": 60,
"invalid_urls": 10
}]
}/submit-urlsSubmit infringing URLs for takedown. URLs are deduplicated, validated, and processed automatically.
groupsUrlGroup[]requiredMax 100 groups per request.
notesstringBatch-level notes.
creator_idstringrequiredCreator UUID.
urlsstring[]requiredMax 2048 chars each. Max 10,000 total per request.
new URL. Dupes and invalid = free.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"
}'{
"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 balance207Partial success — processing failed, credits refunded. Resubmit./transactionsCredit transaction history — debits, top-ups, and refunds.
pageintZero-indexed. Default 0.
limitintDefault 25, max 100.
{
"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
}