Sign creators up from your own page
View as MarkdownApproved apps can create creator accounts by API, send each creator through the ID check and start working with the returned key.
The creator never fills in our sign-up form. Creator sign-up is enabled per app, so ask us to switch it on for yours.
1Collect their details
Your page collects the email, handle, display name, country of residence and subscription price. It also shows our Terms of Service, Privacy Policy and 2257 statement with an acceptance checkbox.
2Create the account
Call this from your server with a key your app owner holds, and pass the creator’s browser IP and user agent from the moment they accepted.
curlcurl -X POST "https://www.dropfans.io/api/external/v1/accounts" \ -H "Authorization: Bearer $APP_OWNER_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "valeria@example.com", "username": "valeria", "displayName": "Valeria", "residencyCountry": "SE", "subscription": { "priceUsd": 9.99, "interval": "monthly" }, "legalAccepted": true, "acceptedFromIp": "203.0.113.7", "acceptedUserAgent": "Mozilla/5.0", "kycReturnUrl": "https://crm.example.com/onboarding/done" }'Nodeconst res = await fetch('https://www.dropfans.io/api/external/v1/accounts', { method: 'POST', headers: { Authorization: 'Bearer ' + process.env.APP_OWNER_KEY, 'Content-Type': 'application/json', }, body: JSON.stringify({ "email": "valeria@example.com", "username": "valeria", "displayName": "Valeria", "residencyCountry": "SE", "subscription": { "priceUsd": 9.99, "interval": "monthly" }, "legalAccepted": true, "acceptedFromIp": "203.0.113.7", "acceptedUserAgent": "Mozilla/5.0", "kycReturnUrl": "https://crm.example.com/onboarding/done" }), }); console.log(await res.json());Pythonimport os, requests res = requests.post( "https://www.dropfans.io/api/external/v1/accounts", headers={"Authorization": f"Bearer {os.environ['APP_OWNER_KEY']}"}, json={ "email": "valeria@example.com", "username": "valeria", "displayName": "Valeria", "residencyCountry": "SE", "subscription": { "priceUsd": 9.99, "interval": "monthly" }, "legalAccepted": True, "acceptedFromIp": "203.0.113.7", "acceptedUserAgent": "Mozilla/5.0", "kycReturnUrl": "https://crm.example.com/onboarding/done" }, ) print(res.json())3Keep what comes back
apiKeyis bound to your app and shown once. You can upload and create drops straight away, but drops stay unsellable until the ID check is approved.kycUrlis valid for 24 hours; get a fresh one withPOST /accounts/{id}/kyc-session.4Send them through the ID check
Redirect the creator to
kycUrlin a full page or new tab, never an iframe. They come back to yourkycReturnUrlwith?kyc=approved|declined|in_review. Show the matching screen, but unlock nothing yet.5Wait for the decision
The decision arrives as an
account.kyc_updatedwebhook. WithkycStatus: "approved"the account is active and can sell and get paid.Event data{ "accountId": "...", "username": "valeria", "kycStatus": "approved", "sellerStatus": "..." }
Next
Last updated 2026-11-02