For brands
API docs
The TVNNEL API lets you pull your creators, sales and content into your own dashboards, spreadsheets and tools. It's read-only, so it can't change anything in your account.
Get a key
In your brand dashboard, open Integrations and find API access. Name the key after the tool it's for and click Create key. Copy the key right away, because it's only shown once. Brand owners and admins can create and revoke keys. Each key works for one brand.
Keep keys private. If one leaks, revoke it on the same page and create a new one.
Make a request
Send the key in the Authorization header. Every endpoint is a GET under https://www.tvnnel.com/api/v1 and answers in JSON.
curl https://www.tvnnel.com/api/v1/orders?since=2026-10-01 \
-H "Authorization: Bearer tvn_your_key"Lists come back a page at a time with page and has_more. While has_more is true, ask again with the next page. Dates are ISO 8601 in UTC, and money is in cents with its currency.
Brand
GET /brand
The brand the key belongs to, with its creator program terms.
{
"data": {
"id": "6f1c…",
"name": "FACT",
"website": "https://factclothing.com",
"currency": "USD",
"timezone": "America/Los_Angeles",
"program": { "live": true, "commission_percent": 15, "discount_percent": 10 },
"dashboard_url": "https://www.tvnnel.com/dashboard/brands/6f1c…"
}
}Creators
GET /creators
Creators in your program, oldest first, with their link and discount code.
status: active or left. Leave out for both.limit: Rows per page, 1 to 500. Default 100.page: Page number, starting at 1.
{
"data": [
{
"id": "a9e2…",
"name": "Raven Kade",
"status": "active",
"instagram": "ravenkade",
"tiktok": null,
"location": "Portland, OR",
"joined_at": "2026-10-02T18:04:11.000Z",
"link": "https://www.tvnnel.com/r/raven-kade",
"discount_code": "RAVEN10"
}
],
"page": 1,
"has_more": false
}Orders
GET /orders
Orders matched to a creator by their link or code, newest first. Amounts are in cents, excluding shipping and tax, after refunds. Test orders are left out.
since: Only orders on or after this date, like 2026-10-01.until: Only orders before this date.limit: Rows per page, 1 to 500. Default 100.page: Page number, starting at 1.
{
"data": [
{
"id": "c31d…",
"order": "#1042",
"shopify_order_id": "5583920…",
"creator_id": "a9e2…",
"matched_by": "code",
"currency": "USD",
"sales_cents": 8400,
"commission_cents": 1260,
"commission_percent": 15,
"cancelled": false,
"ordered_at": "2026-10-11T21:15:02.000Z"
}
],
"page": 1,
"has_more": true
}Content
GET /content
Content creators sent you, newest first. Links to uploaded files work for one hour.
status: pending, approved, changes or rejected. Leave out for all.limit: Rows per page, 1 to 100. Default 50.page: Page number, starting at 1.
{
"data": [
{
"id": "e70b…",
"creator_id": "a9e2…",
"status": "approved",
"type": "upload",
"platform": null,
"url": "https://…/submissions/…?token=…",
"file_type": "video/mp4",
"caption": "Wearing the Void hoodie all week.",
"ad_rights_days": 90,
"ad_rights_until": "2027-01-10T16:20:00.000Z",
"review_note": null,
"submitted_at": "2026-10-09T03:41:27.000Z",
"reviewed_at": "2026-10-12T16:20:00.000Z"
}
],
"page": 1,
"has_more": false
}Errors
A missing, wrong or revoked key gets 401. A bad parameter gets 400 with a message saying what to fix. Errors look like this:
{ "error": { "code": "bad_request", "message": "limit must be a whole number from 1 to 500." } }Questions
Need something the API doesn't have yet? Email us.
