Skip to main content

Creator Pay API (1.0)

Getting started

The Creator Pay API lets you create creators, collect their payout details, send them payments, and track each payment until the money lands.

Environments

API host Where you sign in
Sandbox https://dev.creatorpay.co trial.creatorpay.co
Production https://api.creatorpay.co app.creatorpay.co

Build and test against the sandbox. Each environment has its own accounts and API keys, so a sandbox key does not work in production.

What you'll need

  • A Creator Pay account with owner or admin privileges, in the environment you are calling.

Generate an API key

Generate an API key on the Settings page, under the API tab.

Creator Pay Token

Get a session token

You don't send your API key with each request. You exchange it for a session token, and send that instead.

curl "https://dev.creatorpay.co/v1/org_api_token/session?key=<your_api_key>"

The response body is the token, as a JSON string. A session token is valid for 7 days. Request a new one before it expires.

Make a request

Send the token in a session-token header. A session token acts as your organization, with admin-level access to every endpoint in this reference.

curl https://dev.creatorpay.co/v1/creators \
  --header 'session-token: <session token>'

Guide: onboard and pay a creator

This guide walks through paying a creator from start to finish: creating the creator, getting their payout details on file, sending a payment, and knowing when the money has landed.

Before you start

  • A funded account. Payments draw from your Creator Pay balance. Fees are always collected from that balance too, whichever payout method the creator uses. There is no credit line, so fund the account before you send.
  • Amounts are in cents, in USD. 27000 means $270.00.

The flow at a glance

  1. Create the creator with POST /v1/creators.
  2. Get their payout details on file. Send them yourself, or let Creator Pay collect them from the creator through a hosted form.
  3. Create payments with POST /v1/payments. They start as drafts.
  4. Send the payments with PUT /v1/payments/initiate.
  5. Track each payment with GET /v1/payments until it reaches a final status.

Steps 1 and 2 happen once per creator. Steps 3 to 5 repeat for every payout run.

1. Create the creator

curl -X POST https://dev.creatorpay.co/v1/creators \
  -H "session-token: $SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '[{
    "email": "[email protected]",
    "entity_type": "individual",
    "first_name": "Alex",
    "last_name": "Rivera",
    "phone_number": "+15555550123"
  }]'

The body is an array, so you can create many creators in one call. email and entity_type (individual or business) are required. The response is an array of creators. Store each creator's id. You use it as the payment recipient.

Creating a creator sends them nothing. Creator Pay contacts a creator only when a payment needs details they haven't given yet.

phone_number is optional. If you include it, Creator Pay texts the creator the details form as well as emailing it.

A creator's email address is unique across Creator Pay. If the address already belongs to an account that isn't a creator, such as an organization admin, the request fails. Use a separate address for test creators.

2. Get payout details on file

Choose one option per creator.

Option A: you send the details

If you already hold the creator's payout details, send them with PUT /v1/creators/{id}. Always include selected_payment_method. That field tells Creator Pay which details to pay against.

curl -X PUT https://dev.creatorpay.co/v1/creators/$CREATOR_ID \
  -H "session-token: $SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "selected_payment_method": "paypal",
    "paypal_email": "[email protected]"
  }'
selected_payment_method Details to send Notes
stripe account_number, routing_number Bank transfer to a US bank account
paypal paypal_email Your organization must have PayPal connected
venmo venmo_phone_number Sent through PayPal, so it also needs PayPal connected

Any other value is accepted but never paid. The payment falls back to asking the creator for their details, as in option B.

Option B: Creator Pay collects the details from the creator

Skip the update and go straight to creating the payment. When you send a payment to a creator with no usable details on file, Creator Pay:

  1. Emails the creator a secure link to a hosted form, and texts it too if a phone number is on file. The form lets them pick a payout method and enter their details. The email's subject line is "You just got paid!", even though no money has moved yet. Tell your creators to expect it.
  2. Moves the payment to requires_info.

When the creator submits the form, every payment waiting on them is sent automatically. You don't need to send it again.

The link expires after 14 days. A creator has one live link at a time: a new link replaces the old one.

To send a fresh link, call POST /v1/payments/reminders with the payments that are still in requires_info:

curl -X POST https://dev.creatorpay.co/v1/payments/reminders \
  -H "session-token: $SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "ids": "'"$PAYMENT_ID"'", "reminder_type": "email" }'

ids is one string of comma-separated payment ids. reminder_type is email, sms or all.

Option A also works after the fact. If a payment is waiting in requires_info and you then send the creator's details with PUT /v1/creators/{id}, including selected_payment_method, that payment goes out right away.

3. Create the payments

curl -X POST https://dev.creatorpay.co/v1/payments \
  -H "session-token: $SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '[{
    "recipient": "'"$CREATOR_ID"'",
    "amount": 27000,
    "memo": "cashout-0928"
  }]'
  • recipient is the creator id from step 1.
  • amount is in cents.
  • memo may only contain letters, numbers and - # . $ & *. Spaces are rejected. Bank transfers show only its first 10 characters.

The response is an array of the payments you created. Store each payment's id.

Payments are created as draft. No money moves, and the creator hears nothing, until you send them. While a payment is a draft you can change it with PUT /v1/payments. Once it has been sent, changes are refused with 409.

Grouping payments into a campaign (optional)

A campaign is a named batch, such as one weekly payout run. Create one with POST /v1/campaigns (title is required), then pass its id as payment_group_id on each payment. You can then list the batch with GET /v1/payments?payment_group_id=<campaign id> and send every draft in it with POST /v1/campaigns/{id}/initiate.

When you update a payment that belongs to a campaign, send payment_group_id again. Leaving it out removes the payment from the campaign.

4. Send the payments

curl -X PUT https://dev.creatorpay.co/v1/payments/initiate \
  -H "session-token: $SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '["'"$PAYMENT_ID_1"'", "'"$PAYMENT_ID_2"'"]'

The body is an array of payment ids. Each payment is sent in order:

  • Creator details on file: the money is sent and the payment moves to processing. The creator gets a confirmation email.
  • Details missing: the creator is asked for them (option B above) and the payment moves to requires_info.

Every id is checked before anything is sent. If an id doesn't exist or belongs to another organization, the call returns 404. If a payment is not a draft, the call returns 409 and names it. In both cases nothing is sent. An id listed twice is sent once.

If a payment fails to send, the call stops there and returns an error. Payments earlier in the list have already been sent. The one that failed, and everything after it, stay draft. The most common cause is an insufficient balance. To recover:

  1. Fix the cause, for example by funding the account.
  2. List your payments with GET /v1/payments and find the ones still in draft.
  3. Send only those ids. A list that includes a payment already sent returns 409 and sends nothing, so a mistaken resend can't pay anyone twice.

If the payout provider doesn't confirm a send, for example because it timed out, the call returns an error and that payment is held in sending. Don't try to send it again: it may already be on its way. Check its status later, and contact Creator Pay support if it stays in sending.

If you grouped the payments into a campaign, POST /v1/campaigns/{id}/initiate is the simpler way to recover. It sends only the campaign's remaining drafts, so it is safe to call again.

5. Track status

Creator Pay does not send webhooks yet, so poll for status changes:

curl "https://dev.creatorpay.co/v1/payments" \
  -H "session-token: $SESSION_TOKEN"

Add ?payment_group_id=<campaign id> to list one campaign, or fetch a single payment with GET /v1/payments/{id}. Results are not paginated, and there is no status filter, so filter by status on your side.

Status Meaning Final?
draft Created, not sent. Can be changed or deleted. No
requires_info Waiting for the creator to submit payout details. Sent automatically once they do. No
sending Being handed to the payout provider. Usually lasts a moment. If a payment stays here, contact Creator Pay support rather than sending it again. No
processing Money is on its way. No
succeeded Delivered. Yes, except that a bank transfer can still be returned later
failed Rejected by the payout provider. The funds were not delivered. Yes
canceled Bank transfers only: the transfer was canceled before it settled. The funds were not delivered. Yes
returned Bank transfers only: the receiving bank sent the money back. Yes

Bank transfers usually settle within a few business days, so checking a processing payment a few times a day is enough.

Retries and duplicates

Idempotency keys are not available yet, so retrying a create can repeat it. Sending is protected: a payment is only ever sent once.

  • Before retrying POST /v1/payments, list your payments and check whether the first attempt created them. A blind retry creates duplicates.
  • PUT /v1/payments/initiate is safe to retry. A payment that has already been sent is refused with 409, and nothing in that call is sent. After a timeout, list your payments and resend only the ids still in draft.
  • Large batches can take longer than the request allows. If a call that sends many payments times out, treat the result as unknown and check statuses before sending anything again.

Things to know

  • Errors. Most failures come back as HTTP 500 with a message, including validation problems. An id that doesn't exist returns 404. A request that conflicts with a payment's status, such as sending or editing one that is no longer a draft, returns 409. Read the message rather than relying on the status code alone.
  • International payouts. Bank transfers go to US bank accounts only. Creators outside the US should choose PayPal.
  • Not available yet: webhooks for status changes, and idempotency keys.

Creators

Creators are the accounts for content creators of an organization. Each organization may create creator accounts for its creators to let them access the website via creator dashboard.

Retrieve Creators for an organization

Get all creators of your organization

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Creates Creators

creates creators for an org and an associated user row if necessary

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

Array
account_number
string
business_name
string
email
required
string
entity_type
required
string
Enum: "individual" "business"
first_name
string
last_name
string
manager_id
string
phone_number
string
routing_number
string

Responses

Request samples

Content type
application/json
[
  • {
    }
]

Response samples

Content type
application/json
[
  • {
    }
]

Update data for Creator

Updates available data for a creator

path Parameters
id
required
string

Creator id

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

account_number
string
object
affiliated_persons
string
bio
string
business_name
string
date_of_birth
string
entity_type
string
Enum: "individual" "business"
first_name
string
id
string
is_active
boolean
is_shipping_same_as_home
boolean
last_name
string
manager_id
string
manager_split
integer
notes
string
paypal_email
string
phone_number
string
platforms
string
pronouns
string
qb_acct
string
qb_vendor
string
routing_number
string
selected_payment_method
string
object
split
number
state_tax_id
string
tax_id
string
venmo_phone_number
string

Responses

Request samples

Content type
application/json
{
  • "account_number": "123456789",
  • "address": {
    },
  • "affiliated_persons": "string",
  • "bio": "YouTube creator with gaming content",
  • "business_name": "The Blue Boat",
  • "date_of_birth": "2000-01-02",
  • "entity_type": "individual",
  • "first_name": "Joe",
  • "id": "string",
  • "is_active": true,
  • "is_shipping_same_as_home": true,
  • "last_name": "Morgan",
  • "manager_id": "00000000-0000-0000-0000-000000000000",
  • "manager_split": 10,
  • "notes": "Prefers to be texted",
  • "paypal_email": "[email protected]",
  • "phone_number": "+12223334444",
  • "platforms": "['https://www.youtube.com','http://facebook.com/pageurl']",
  • "pronouns": "He",
  • "qb_acct": "string",
  • "qb_vendor": "string",
  • "routing_number": "123456789",
  • "selected_payment_method": "paypal",
  • "shipping_address": {
    },
  • "split": 20,
  • "state_tax_id": "000000000",
  • "tax_id": "000000000",
  • "venmo_phone_number": "+12223334444"
}

Response samples

Content type
application/json
{
  • "account_number": "123456789",
  • "address_city": "New York City",
  • "address_line_1": "1 Main St",
  • "address_line_2": "string",
  • "address_shipping_city": "New York City",
  • "address_shipping_line_1": "1 Main St",
  • "address_shipping_line_2": "string",
  • "address_shipping_state": "NY",
  • "address_shipping_zip": "10001",
  • "address_state": "NY",
  • "address_zip": "10001",
  • "affiliated_persons": "[{'name':'James Hoffman','role':'Lawyer','email':'[email protected]','phone':'50957793793'}]",
  • "bio": "YouTube content creator in music area",
  • "business_name": "Red Guitar",
  • "created_at": "2022-03-30T20:41:44.483039Z",
  • "date_of_birth": "2000-01-02",
  • "email": "[email protected]",
  • "entity_type": "business",
  • "first_name": "John",
  • "id": "ace932c9-9bkj-467a-99a4-bc74499c4843",
  • "is_active": "true",
  • "is_shipping_same_as_home": "true",
  • "last_name": "Doe",
  • "manager_id": "00000000-0000-0000-0000-000000000000",
  • "manager_split": 10,
  • "notes": "Prefers to be texted",
  • "org_id": "ace932c9-9bkj-467a-99a4-bc74499c4843",
  • "paypal_email": "[email protected]",
  • "phone_number": "+12223334444",
  • "platforms": "['https://www.youtube.com','http://facebook.com/pageurl']",
  • "pronouns": "She",
  • "qb_acct": "{'Name':'Test Account', 'Id':'1234'}",
  • "qb_vendor": "{'DisplayName':'Test Vendor', 'Id':'5678'}",
  • "routing_number": "123456789",
  • "selected_payment_method": "paypal",
  • "split": "80",
  • "state_tax_id": "123456789",
  • "tags": "['Tag_ID_1', 'Tag_ID_2']",
  • "tax_id": "123456789",
  • "user_id": "ace932c9-9bkj-467a-99a4-bc74499c4843",
  • "venmo_phone_number": "12223334444"
}

Payments

Payment entities are the payments done by organizations to the creators. A payment represents a financial transaction (an actual exchange of money).

Get payments

Lists your organization's payments, newest first. Not paginated, and there is no status filter: filter on status in your own code.

query Parameters
payment_group_id
string

Only payments in this campaign; none for payments in no campaign

start_date
string

Start Date

end_date
string

End Date

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create payments

Creates payments to send money to a Creator. Amounts are always done in cents.

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

Array
amount
integer
audit
string
earnings
integer
federal_withholdings
integer
id
string
managed_creator_id
string
memo
string
payment_group_id
string
recipient
string
recipient_role
string
split
number
state_withholdings
integer

Responses

Request samples

Content type
application/json
[
  • {
    }
]

Response samples

Content type
application/json
[
  • {
    }
]

Updates Payments

Updates any available metadata for multiple payments. Only draft payments can be updated; any other returns 409 and nothing in the request is saved.

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

Array
amount
integer
audit
string
earnings
integer
federal_withholdings
integer
id
string
managed_creator_id
string
memo
string
payment_group_id
string
recipient
string
recipient_role
string
split
number
state_withholdings
integer

Responses

Request samples

Content type
application/json
[
  • {
    }
]

Response samples

Content type
application/json
{
  • "amount": 100,
  • "audit": "",
  • "created_at": "2022-03-30T20:41:44.483039Z",
  • "date_failed": "2022-03-30T20:41:44.483039Z",
  • "date_initiated": "2022-03-30T20:41:44.483039Z",
  • "date_posted": "2022-03-30T20:41:44.483039Z",
  • "earnings": 20,
  • "expected_arrival_date": "2022-03-30T20:41:44.483039Z",
  • "federal_withholdings": 10,
  • "fee": 3,
  • "fee_reference_id": "outp_1Jao4a0klqL2RlPbAgU0wyHz",
  • "id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "is_deleted": "false",
  • "memo": "cashout-0428",
  • "method": "paypal",
  • "org_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "payment_group_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "paypal_payout_batch_id": "SDWBDSNMOPLCN",
  • "paypal_payout_item_id": "LPFBJSPMSYMIO",
  • "recipient": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "reference_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "split": 80,
  • "state_withholdings": 10,
  • "status": "draft",
  • "updated_at": "2022-03-30T20:41:44.483039Z"
}

Retrieve a single payment

Retrieves a single payment using ID in the route params

path Parameters
id
required
string

Payment id

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Responses

Response samples

Content type
application/json
{
  • "amount": 100,
  • "audit": "",
  • "created_at": "2022-03-30T20:41:44.483039Z",
  • "date_failed": "2022-03-30T20:41:44.483039Z",
  • "date_initiated": "2022-03-30T20:41:44.483039Z",
  • "date_posted": "2022-03-30T20:41:44.483039Z",
  • "earnings": 20,
  • "expected_arrival_date": "2022-03-30T20:41:44.483039Z",
  • "federal_withholdings": 10,
  • "fee": 3,
  • "fee_reference_id": "outp_1Jao4a0klqL2RlPbAgU0wyHz",
  • "id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "is_deleted": "false",
  • "memo": "cashout-0428",
  • "method": "paypal",
  • "org_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "payment_group_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "paypal_payout_batch_id": "SDWBDSNMOPLCN",
  • "paypal_payout_item_id": "LPFBJSPMSYMIO",
  • "recipient": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "reference_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "split": 80,
  • "state_withholdings": 10,
  • "status": "draft",
  • "updated_at": "2022-03-30T20:41:44.483039Z"
}

Initiates payments

Sends each draft payment in the body, in order. A creator with payment details on file is paid right away; a creator without them is emailed a link to add details, and the payment moves to requires_info. Every id is checked before anything is sent: an id that doesn't exist or belongs to another organization returns 404, and an id that is not a draft returns 409 naming it; in both cases nothing is sent. An id listed twice is sent once. A send can still fail partway through the list, so payments earlier in the list may already have been sent.

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

Payment ids to send

Array
string

Responses

Request samples

Content type
application/json
[
  • "string"
]

Response samples

Content type
application/json
[
  • "string"
]

Resends the payment details link

Resends the link a creator uses to add payment details, for payments in requires_info. A new link replaces the old one. ids is a comma-separated list of payment ids; reminder_type is "email", "sms" or "all" (sms only goes out if a phone number is on file). An id that doesn't exist or belongs to another organization returns 404.

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

ids
string
reminder_type
string

Responses

Request samples

Content type
application/json
{
  • "ids": "string",
  • "reminder_type": "string"
}

Response samples

Content type
application/json
{
  • "message": "string",
  • "status": 0
}

Campaigns

Social media campaign that encompasses payments, contracts, invoices and all other data needed during planning and execution

Retrieve Campaigns

Retrieve all campaigns for an org. Type should always be "campaigns".

query Parameters
type
required
string

type

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a Campaign

Create a Campaign object to keep track of payments, invoices and other necesssary elements.

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

agent_id
string
campaign_end_date
string
campaign_ref_id
string
campaign_start_date
string
campaign_status
string
customer_id
string
deal_size
integer
description
string
is_archived
boolean
terms
string
title
string

Responses

Request samples

Content type
application/json
{
  • "agent_id": "00000000-0000-0000-0000-000000000000",
  • "campaign_end_date": "2021-3-3",
  • "campaign_ref_id": "internal_ref_abcd",
  • "campaign_start_date": "2021-1-1",
  • "campaign_status": "active",
  • "customer_id": "00000000-0000-0000-0000-000000000000",
  • "deal_size": 2500000,
  • "description": "Promoting winter clothing for partner brand",
  • "is_archived": false,
  • "terms": "Net 30",
  • "title": "Winter Campaign"
}

Response samples

Content type
application/json
{
  • "campaign_end_date": "2021-3-3",
  • "campaign_ref_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "campaign_start_date": "2021-1-1",
  • "campaign_status": "active",
  • "created_at": "2022-03-30T20:41:44.483039Z",
  • "description": "Promoting winter clothing for partner brand",
  • "id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "ignored_rows": "string",
  • "is_archived": false,
  • "org_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "payment_group_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "title": "Winter Campaign",
  • "type": "string",
  • "updated_at": "2022-03-30T20:41:44.483039Z"
}

Retrieve a Campaign

Retrieves a single Campaign using ID in the route params

path Parameters
id
required
string

Campaign id

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Update a Campaign

Updates various fields for a Campaign.

path Parameters
id
required
string

Campaign id

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Request Body schema: application/json

body

agent_id
string
campaign_end_date
string
campaign_ref_id
string
campaign_start_date
string
campaign_status
string
customer_id
string
deal_size
integer
description
string
is_archived
boolean
terms
string
title
string

Responses

Request samples

Content type
application/json
{
  • "agent_id": "00000000-0000-0000-0000-000000000000",
  • "campaign_end_date": "2021-3-3",
  • "campaign_ref_id": "internal_ref_abcd",
  • "campaign_start_date": "2021-1-1",
  • "campaign_status": "active",
  • "customer_id": "00000000-0000-0000-0000-000000000000",
  • "deal_size": 2500000,
  • "description": "Promoting winter clothing for partner brand",
  • "is_archived": false,
  • "terms": "Net 30",
  • "title": "Winter Campaign"
}

Response samples

Content type
application/json
{
  • "campaign_end_date": "2021-3-3",
  • "campaign_ref_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "campaign_start_date": "2021-1-1",
  • "campaign_status": "active",
  • "created_at": "2022-03-30T20:41:44.483039Z",
  • "description": "Promoting winter clothing for partner brand",
  • "id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "ignored_rows": "string",
  • "is_archived": false,
  • "org_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "payment_group_id": "ace932c9-9bkj-467a-99a4-bk74499c4843",
  • "title": "Winter Campaign",
  • "type": "string",
  • "updated_at": "2022-03-30T20:41:44.483039Z"
}

Initiate Campaign Payments

Initiate the execution for all payments currently marked as draft in a campaign.

path Parameters
id
required
string

Campaign id

header Parameters
session-token
string

Session token from your API key. API callers send this one; send it or auth-token, not both

Responses

Response samples

Content type
application/json
{
  • "message": "string",
  • "status": 0
}

Session Token

generates a session token

Exchanges an organization API key for a session token. Send the token in the session-token header on every other request. A session token is valid for 7 days.

query Parameters
key
required
string

Your organization API key

Responses

Response samples

Content type
application/json
"string"