Roster
Roster
AffiliateBlogFor Brands
I'm a Creator
MCP Server live on npm · 34 tools · 48 REST endpoints

The complete API for
creator management

REST API and MCP server for managing creators, campaigns, affiliates, commissions, content tracking, contracts, and more. Build integrations or use Claude directly.

Get your API keyView on npm
Quick Start
Authentication
API Reference
Brand ProfileCampaignsApplicationsCreators & RosterAffiliatesCommissionsPayoutsMessagesBriefsContent TrackingContractsDeliverablesShipmentsWebhooksAnalytics
MCP Server
Webhooks Guide
Code Examples
SDKs & Libraries

Quick Start

Get set up in under 2 minutes. There are two ways to use Roster programmatically - both use the same API key and give you the same capabilities.

MCP Server

Recommended

Talk to Claude in plain English and it uses Roster tools automatically. “Show me my top affiliates” just works. No code needed.

Best for: Managing your brand via Claude Desktop or Claude Code

REST API

Standard HTTP endpoints you call from any language. Same data, same actions - just code instead of conversation.

Best for: Custom integrations, dashboards, automations, scripts

1

Get your API key

a

Open your Brand Portal and go to the Settings tab

b

Scroll to API & Integrations and click Create API Key

c

Copy the key immediately - it's only shown once

Your key looks like:

rsk_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0

2

Connect to Claude (MCP) or your code (API)

Option A: MCP ServerUse Claude as your interface

Pick the config file for your Claude app, paste the JSON below, and replace your-api-key with your real key.

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json
claude_desktop_config.json
{
  "mcpServers": {
    "roster": {
      "command": "npx",
      "args": ["ugcroster-mcp"],
      "env": {
        "ROSTER_API_KEY": "your-api-key"
      }
    }
  }
}

Claude Code (terminal)

~/.claude/settings.json
settings.json
{
  "mcpServers": {
    "roster": {
      "command": "npx",
      "args": ["ugcroster-mcp"],
      "env": {
        "ROSTER_API_KEY": "your-api-key"
      }
    }
  }
}

After pasting, restart Claude completely (quit and reopen). The MCP server won't load until you restart.

or
Option B: REST APICall from your own code

Hit any endpoint with your API key in the Authorization header. That's it.

cURL
curl https://www.ugcroster.com/api/v1/creators \
  -H "Authorization: Bearer rsk_your-api-key"
3

You're live - try these

If you set up MCP, just type these into Claude. If you're using the API, these map to the endpoints in the reference below.

“Show me my top 5 performing affiliates this month”“Approve all pending commissions over $50”“How many creators applied to my latest campaign?”“Send a follow-up message to emma@creator.com about the skincare campaign”“Create a 15% discount code SUMMER15 for @creator”“What was my total affiliate revenue last week?”“List all unpaid commissions and mark them as paid”“Show me conversations with creators who haven't replied”

Authentication

All API requests require authentication via an API key. Keys use the rsk_ prefix and are passed as Bearer tokens in the Authorization header.

API Key Format

API keys are 44 characters long and always start with rsk_. You can create and revoke keys at any time from Settings → API & Integrations.

Important: Your API key is shown only once when created. Store it securely. If lost, revoke the old key and create a new one.

Making Authenticated Requests

curl -X GET https://www.ugcroster.com/api/v1/creators \
  -H "Authorization: Bearer rsk_your_key_here" \
  -H "Content-Type: application/json"

Rate Limiting

The API is rate limited to 100 requests per minute per API key. If you exceed this limit, you will receive a 429 response. Rate limit headers are included in every response:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1718300460

API Reference

Base URL: https://www.ugcroster.com/api/v1. All request and response bodies are JSON. Response fields use snake_case.

Click any endpoint to expand its full documentation, parameters, and response examples.

Brand Profile

GET/api/v1/brandRetrieve your brand profile, settings, and subscription info.

Retrieve your brand profile, settings, and subscription info.

Response

200 OK
{
  "data": {
    "id": "brand_abc123",
    "name": "Glow Skincare",
    "logo": "https://cdn.ugcroster.com/logos/glow.png",
    "contact_name": "Sarah Johnson",
    "contact_email": "sarah@glowskincare.com",
    "website": "https://glowskincare.com",
    "industry": "Beauty & Skincare",
    "description": "Clean skincare for everyday glow.",
    "plan": "growth",
    "subscription_status": "active",
    "settings": {
      "auto_approve_commissions": false,
      "default_commission_rate": 15,
      "currency": "USD"
    },
    "created_at": "2025-01-15T10:30:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
PATCH/api/v1/brandUpdate your brand profile or settings.

Update your brand profile or settings.

Request body

JSON
{
  "name": "Glow Skincare Co.",
  "description": "Premium clean skincare.",
  "settings": {
    "auto_approve_commissions": true,
    "default_commission_rate": 20
  }
}

Response

200 OK
{
  "data": {
    "id": "brand_abc123",
    "name": "Glow Skincare Co.",
    "description": "Premium clean skincare.",
    "contact_name": "Sarah Johnson",
    "contact_email": "sarah@glowskincare.com",
    "plan": "growth",
    "subscription_status": "active",
    "settings": {
      "auto_approve_commissions": true,
      "default_commission_rate": 20,
      "currency": "USD"
    },
    "updated_at": "2026-06-13T14:22:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Campaigns

GET/api/v1/campaignsList all campaigns with optional status filter.

List all campaigns with optional status filter.

Parameters

NameTypeRequiredDescription
statusstringNoFilter by status: active, draft, paused, completed
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1). Offset is also supported.

Response

200 OK
{
  "data": [
    {
      "id": "camp_xyz789",
      "title": "Summer Skincare Launch",
      "status": "active",
      "campaign_type": "ugc",
      "compensation_label": "$250 per video",
      "applicant_count": 47,
      "hired_count": 8,
      "created_at": "2026-05-20T09:00:00Z",
      "deadline": "2026-07-01T23:59:59Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 12,
    "has_more": false
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/campaignsCreate a new campaign.

Create a new campaign.

Request body

JSON
{
  "name": "Fall Collection UGC",
  "type": "ugc",
  "description": "We need authentic unboxing content for our fall line.",
  "compensation": {
    "type": "fixed",
    "amount": 300,
    "currency": "USD"
  },
  "requirements": {
    "platforms": ["tiktok", "instagram"],
    "min_followers": 3000,
    "content_types": ["reel"],
    "deliverables_count": 2
  },
  "deadline": "2026-09-01T23:59:59Z",
  "status": "active"
}

Response

200 OK
{
  "data": {
    "id": "camp_new456",
    "title": "Fall Collection UGC",
    "status": "active",
    "campaign_type": "ugc",
    "compensation_label": "$300 per video",
    "created_at": "2026-06-13T14:30:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
GET/api/v1/campaigns/:idGet detailed information about a specific campaign.

Get detailed information about a specific campaign.

Parameters

NameTypeRequiredDescription
idstringYesCampaign ID (path parameter)

Response

200 OK
{
  "data": {
    "id": "camp_xyz789",
    "title": "Summer Skincare Launch",
    "status": "active",
    "campaign_type": "ugc",
    "description": "Authentic skincare content for summer campaign.",
    "compensation_label": "$250 per video",
    "applicant_count": 47,
    "hired_count": 8,
    "created_at": "2026-05-20T09:00:00Z",
    "deadline": "2026-07-01T23:59:59Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
PATCH/api/v1/campaigns/:idUpdate an existing campaign's settings, status, or requirements.

Update an existing campaign's settings, status, or requirements.

Parameters

NameTypeRequiredDescription
idstringYesCampaign ID (path parameter)

Request body

JSON
{
  "status": "paused",
  "compensation": {
    "amount": 350
  }
}

Response

200 OK
{
  "data": {
    "id": "camp_xyz789",
    "title": "Summer Skincare Launch",
    "status": "paused",
    "campaign_type": "ugc",
    "compensation_label": "$350 per video",
    "updated_at": "2026-06-13T14:35:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
GET/api/v1/campaigns/:id/applicationsList all applications for a specific campaign.

List all applications for a specific campaign.

Parameters

NameTypeRequiredDescription
idstringYesCampaign ID (path parameter)
statusstringNoFilter: pending, accepted, rejected, shortlisted
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1). Offset is also supported.

Response

200 OK
{
  "data": [
    {
      "id": "app_001",
      "campaign_id": "camp_xyz789",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "creator_instagram": "@emmachen",
      "creator_tiktok": "@emmachen",
      "status": "pending",
      "message": "I'd love to create content for your skincare line!",
      "portfolio_urls": ["https://instagram.com/p/abc123"],
      "applied_at": "2026-06-01T12:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 47,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Applications

PATCH/api/v1/applications/:idUpdate an application's status (accept, reject, shortlist).

Update an application's status (accept, reject, shortlist).

Parameters

NameTypeRequiredDescription
idstringYesApplication ID (path parameter)

Request body

JSON
{
  "status": "accepted",
  "note": "Great portfolio, perfect fit for our brand."
}

Response

200 OK
{
  "data": {
    "id": "app_001",
    "status": "accepted",
    "note": "Great portfolio, perfect fit for our brand.",
    "updated_at": "2026-06-13T15:00:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Creators & Roster

GET/api/v1/creatorsList all creators with performance data (clicks, conversions, revenue).

List all creators with performance data (clicks, conversions, revenue).

Parameters

NameTypeRequiredDescription
searchstringNoSearch by name or email
platformstringNoFilter by platform: instagram, tiktok, youtube
min_followersintegerNoMinimum follower count
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1). Offset is also supported.

Response

200 OK
{
  "data": [
    {
      "id": "cr_emma",
      "name": "Emma Chen",
      "email": "emma@example.com",
      "instagram": "@emmachen",
      "tiktok": "@emmachen",
      "followers": 24500,
      "engagement_rate": 4.2,
      "performance": {
        "clicks": 1847,
        "conversions": 93,
        "revenue": 4650.00,
        "commissions_earned": 697.50
      },
      "tags": ["skincare", "lifestyle"],
      "joined_at": "2025-03-10T08:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 156,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
GET/api/v1/creators/searchSearch the 1M+ creator database. Requires active subscription or design partner status.

Search the 1M+ creator database. Requires active subscription or design partner status.

Parameters

NameTypeRequiredDescription
qstringNoFree text search across username, name, bio, niches, category
follower_minintegerNoMinimum follower count
follower_maxintegerNoMaximum follower count
engagement_minnumberNoMinimum engagement rate (e.g. 2.5)
categorystringNoExact category match
nichestringNoSearch within niches field
has_emailbooleanNoFilter to creators with extracted contact email
countrystringNoCountry filter (partial match)
citystringNoCity filter (partial match)
statestringNoState filter (partial match)
genderstringNoGender filter (exact match)
sortstringNoSort: followers (default) or engagement
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1)

Response

200 OK
{
  "data": [
    {
      "pk": 12345,
      "username": "emmachen",
      "full_name": "Emma Chen",
      "follower_count": 245000,
      "engagement_rate": 4.2,
      "category": "Beauty & Skincare",
      "biography": "Beauty creator | Collabs: emma@example.com",
      "extracted_email": "emma@example.com",
      "niches": "skincare, beauty, lifestyle",
      "city": "Los Angeles",
      "state": "CA",
      "country": "United States",
      "profile_pic_url": "https://...",
      "is_verified": false,
      "external_url": "https://linktr.ee/emma"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 48293,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
403SUBSCRIPTION_REQUIRED - Creator database access requires an active subscription
GET/api/v1/creators/:pkGet full profile details for a single creator from the database. Requires active subscription or design partner status.

Get full profile details for a single creator from the database. Requires active subscription or design partner status.

Parameters

NameTypeRequiredDescription
pkintegerNoCreator primary key (from search results)

Response

200 OK
{
  "data": {
    "pk": 12345,
    "username": "emmachen",
    "full_name": "Emma Chen",
    "follower_count": 245000,
    "following_count": 892,
    "media_count": 1243,
    "engagement_rate": 4.2,
    "category": "Beauty & Skincare",
    "biography": "Beauty creator...",
    "extracted_email": "emma@example.com",
    "niches": "skincare, beauty",
    "city": "Los Angeles",
    "state": "CA",
    "country": "United States",
    "profile_pic_url": "https://...",
    "external_url": "https://linktr.ee/emma",
    "is_verified": false,
    "gender": "female",
    "age": 27
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
403SUBSCRIPTION_REQUIRED
404Creator not found
GET/api/v1/rosterList creators on your brand roster (your active creator network).

List creators on your brand roster (your active creator network).

Parameters

NameTypeRequiredDescription
statusstringNoFilter: active, paused, removed
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1). Offset is also supported.

Response

200 OK
{
  "data": [
    {
      "id": "roster_001",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "status": "active",
      "added_at": "2025-06-01T12:00:00Z",
      "campaigns_completed": 3,
      "total_earned": 1250.00
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 42,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/rosterAdd a creator to your brand roster.

Add a creator to your brand roster.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "note": "Great fit for our skincare line"
}

Response

200 OK
{
  "data": {
    "id": "roster_002",
    "creator_email": "emma@example.com",
    "status": "active",
    "added_at": "2026-06-13T15:10:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/roster/addAdd a creator to your roster by social handle. Auto-scrapes their profile picture, name, and follower count. No email required.

Add a creator to your roster by social handle. Auto-scrapes their profile picture, name, and follower count. No email required.

Request body

JSON
{
  "ig_handle": "@emmachen",
  "tt_handle": "@emmachen",
  "name": "Emma Chen",
  "tags": ["skincare", "lifestyle"]
}

Response

200 OK
{
  "data": {
    "id": "abc123",
    "name": "Emma Chen",
    "ig_handle": "emmachen",
    "tt_handle": "emmachen",
    "pfp_url": "https://storage.googleapis.com/...",
    "ig_followers": 245000,
    "tt_followers": 89000,
    "tags": ["skincare", "lifestyle"],
    "status": "hired"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
409Creator already on roster
403Creator limit reached for plan

Affiliates

GET/api/v1/affiliatesGet affiliate tracking data with optional date range and creator filters.

Get affiliate tracking data with optional date range and creator filters.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
fromstringNoStart date (ISO 8601)
tostringNoEnd date (ISO 8601)
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1). Offset is also supported.

Response

200 OK
{
  "data": [
    {
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "clicks": 1847,
      "conversions": 93,
      "revenue": 4650.00,
      "commission_earned": 697.50,
      "conversion_rate": 5.03,
      "active_links": 3
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 42,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
GET/api/v1/affiliates/linksList all affiliate links and discount codes.

List all affiliate links and discount codes.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
statusstringNoFilter: active, expired, disabled

Response

200 OK
{
  "data": [
    {
      "id": "link_001",
      "creator_email": "emma@example.com",
      "type": "discount_code",
      "code": "EMMA15",
      "discount_percent": 15,
      "url": null,
      "clicks": 892,
      "conversions": 47,
      "revenue": 2350.00,
      "status": "active",
      "created_at": "2026-03-15T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 85,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/affiliates/linksCreate a new affiliate link or discount code for a creator.

Create a new affiliate link or discount code for a creator.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "type": "discount_code",
  "code": "SUMMER20",
  "discount_percent": 20,
  "expires_at": "2026-09-01T23:59:59Z"
}

Response

200 OK
{
  "data": {
    "id": "link_002",
    "creator_email": "emma@example.com",
    "type": "discount_code",
    "code": "SUMMER20",
    "discount_percent": 20,
    "status": "active",
    "created_at": "2026-06-13T15:20:00Z",
    "expires_at": "2026-09-01T23:59:59Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
PATCH/api/v1/affiliates/links/:idUpdate an affiliate link (change code, discount, expiry, or status).

Update an affiliate link (change code, discount, expiry, or status).

Parameters

NameTypeRequiredDescription
idstringYesLink ID (path parameter)

Request body

JSON
{
  "discount_percent": 25,
  "expires_at": "2026-12-31T23:59:59Z"
}

Response

200 OK
{
  "data": {
    "id": "link_002",
    "discount_percent": 25,
    "expires_at": "2026-12-31T23:59:59Z",
    "updated_at": "2026-06-13T15:25:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
DELETE/api/v1/affiliates/links/:idDelete an affiliate link. This action is permanent.

Delete an affiliate link. This action is permanent.

Parameters

NameTypeRequiredDescription
idstringYesLink ID (path parameter)

Response

200 OK
{
  "deleted": true,
  "id": "link_002"
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Commissions

GET/api/v1/commissionsList commission events with optional status and date filters.

List commission events with optional status and date filters.

Parameters

NameTypeRequiredDescription
statusstringNoFilter: pending, approved, rejected, paid
creator_emailstringNoFilter by creator email
fromstringNoStart date (ISO 8601)
tostringNoEnd date (ISO 8601)
limitintegerNoMax results (default 20, max 100)
pageintegerNoPage number (default 1). Offset is also supported.

Response

200 OK
{
  "data": [
    {
      "id": "comm_001",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "order_id": "order_9876",
      "order_amount": 89.99,
      "commission_amount": 13.50,
      "commission_rate": 15,
      "status": "pending",
      "source": "discount_code",
      "code": "EMMA15",
      "created_at": "2026-06-12T18:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 234,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/commissionsManually create a commission event or bulk update commission statuses.

Manually create a commission event or bulk update commission statuses.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "amount": 50.00,
  "description": "Bonus for viral TikTok",
  "status": "approved"
}

Response

200 OK
{
  "data": {
    "id": "comm_new001",
    "creator_email": "emma@example.com",
    "commission_amount": 50.00,
    "description": "Bonus for viral TikTok",
    "status": "approved",
    "created_at": "2026-06-13T15:30:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Payouts

GET/api/v1/payoutsList payout history with amounts, methods, and dates.

List payout history with amounts, methods, and dates.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
methodstringNoFilter: paypal, bank_transfer, manual
fromstringNoStart date (ISO 8601)
tostringNoEnd date (ISO 8601)
limitintegerNoMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "id": "pay_001",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "amount": 697.50,
      "currency": "USD",
      "method": "paypal",
      "paypal_email": "emma@example.com",
      "status": "completed",
      "note": "June commissions payout",
      "created_at": "2026-06-10T09:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 89,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/payoutsRecord a payout to a creator.

Record a payout to a creator.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "amount": 350.00,
  "method": "paypal",
  "note": "Campaign completion bonus"
}

Response

200 OK
{
  "data": {
    "id": "pay_new001",
    "creator_email": "emma@example.com",
    "amount": 350.00,
    "method": "paypal",
    "status": "completed",
    "created_at": "2026-06-13T15:40:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Messages

GET/api/v1/messagesList recent conversations with creators.

List recent conversations with creators.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
unreadbooleanNoOnly show unread conversations
limitintegerNoMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "conversation_id": "conv_001",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "last_message": {
        "body": "Just posted the reel! Check it out.",
        "sender": "creator",
        "sent_at": "2026-06-13T11:00:00Z"
      },
      "unread_count": 1,
      "message_count": 14
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 28,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/messagesSend a message to a creator via email and in-app messaging.

Send a message to a creator via email and in-app messaging.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "subject": "Great work on the reel!",
  "body": "Hi Emma, the reel looks amazing. Can you also create a story version?",
  "send_email": true
}

Response

200 OK
{
  "data": {
    "id": "msg_new001",
    "conversation_id": "conv_001",
    "body": "Hi Emma, the reel looks amazing. Can you also create a story version?",
    "sender": "brand",
    "sent_at": "2026-06-13T15:45:00Z",
    "email_sent": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Briefs

GET/api/v1/briefsList all content briefs with status and assignment info.

List all content briefs with status and assignment info.

Parameters

NameTypeRequiredDescription
campaign_idstringNoFilter by campaign
creator_emailstringNoFilter by creator email
statusstringNoFilter: draft, sent, in_progress, completed

Response

200 OK
{
  "data": [
    {
      "id": "brief_001",
      "title": "Summer Skincare Reel Brief",
      "campaign_id": "camp_xyz789",
      "creator_email": "emma@example.com",
      "status": "sent",
      "content_type": "reel",
      "platform": "instagram",
      "instructions": "Show morning skincare routine...",
      "mood_board_urls": ["https://cdn.ugcroster.com/mood/summer1.jpg"],
      "due_date": "2026-06-25T23:59:59Z",
      "created_at": "2026-06-10T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 15,
    "has_more": false
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/briefsCreate and send a content brief to a creator.

Create and send a content brief to a creator.

Request body

JSON
{
  "title": "Fall Collection Unboxing",
  "campaign_id": "camp_new456",
  "creator_email": "emma@example.com",
  "content_type": "reel",
  "platform": "tiktok",
  "instructions": "Film an authentic unboxing of the fall collection...",
  "talking_points": ["Highlight the packaging", "Show texture close-ups"],
  "do_not": ["Mention competitors", "Use filters"],
  "due_date": "2026-09-15T23:59:59Z",
  "send_notification": true
}

Response

200 OK
{
  "data": {
    "id": "brief_new001",
    "title": "Fall Collection Unboxing",
    "status": "sent",
    "creator_email": "emma@example.com",
    "created_at": "2026-06-13T16:00:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Content Tracking

GET/api/v1/contentList all tracked content pieces with metrics.

List all tracked content pieces with metrics.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
platformstringNoFilter: instagram, tiktok, youtube
campaign_idstringNoFilter by campaign
limitintegerNoMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "id": "content_001",
      "url": "https://www.tiktok.com/@emmachen/video/123456",
      "platform": "tiktok",
      "type": "reel",
      "creator_email": "emma@example.com",
      "campaign_id": "camp_xyz789",
      "metrics": {
        "views": 142000,
        "likes": 8400,
        "comments": 312,
        "shares": 1200,
        "saves": 890,
        "engagement_rate": 7.6
      },
      "tracked_at": "2026-06-08T14:00:00Z",
      "last_refreshed": "2026-06-13T06:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 67,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/contentAdd a content URL for tracking (Instagram, TikTok, YouTube).

Add a content URL for tracking (Instagram, TikTok, YouTube).

Request body

JSON
{
  "url": "https://www.instagram.com/reel/abc123",
  "creator_email": "emma@example.com",
  "campaign_id": "camp_xyz789"
}

Response

200 OK
{
  "data": {
    "id": "content_new001",
    "url": "https://www.instagram.com/reel/abc123",
    "platform": "instagram",
    "type": "reel",
    "creator_email": "emma@example.com",
    "metrics": {
      "views": 0,
      "likes": 0,
      "comments": 0
    },
    "tracked_at": "2026-06-13T16:10:00Z",
    "status": "tracking"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
GET/api/v1/content/:idGet detailed metrics for a specific tracked content piece.

Get detailed metrics for a specific tracked content piece.

Parameters

NameTypeRequiredDescription
idstringYesContent ID (path parameter)

Response

200 OK
{
  "data": {
    "id": "content_001",
    "url": "https://www.tiktok.com/@emmachen/video/123456",
    "platform": "tiktok",
    "type": "reel",
    "creator_email": "emma@example.com",
    "metrics": {
      "views": 142000,
      "likes": 8400,
      "comments": 312,
      "shares": 1200,
      "saves": 890,
      "engagement_rate": 7.6
    },
    "metrics_history": [
      { "date": "2026-06-08", "views": 12000, "likes": 800 },
      { "date": "2026-06-09", "views": 45000, "likes": 2800 },
      { "date": "2026-06-10", "views": 98000, "likes": 5600 }
    ],
    "tracked_at": "2026-06-08T14:00:00Z",
    "last_refreshed": "2026-06-13T06:00:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/content/:idRefresh metrics for a tracked content piece.

Refresh metrics for a tracked content piece.

Parameters

NameTypeRequiredDescription
idstringYesContent ID (path parameter)

Response

200 OK
{
  "data": {
    "id": "content_001",
    "status": "refreshing",
    "last_refreshed": "2026-06-13T16:15:00Z",
    "next_refresh_available": "2026-06-13T17:15:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
DELETE/api/v1/content/:idStop tracking a content piece and remove it.

Stop tracking a content piece and remove it.

Parameters

NameTypeRequiredDescription
idstringYesContent ID (path parameter)

Response

200 OK
{
  "deleted": true,
  "id": "content_001"
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Contracts

GET/api/v1/contractsList all contracts with status filters.

List all contracts with status filters.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
statusstringNoFilter: draft, sent, signed, expired
limitintegerNoMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "id": "contract_001",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "campaign_id": "camp_xyz789",
      "title": "Summer Skincare Campaign Agreement",
      "status": "signed",
      "compensation": {
        "type": "fixed",
        "amount": 250,
        "currency": "USD"
      },
      "deliverables": [
        { "type": "reel", "platform": "instagram", "quantity": 1 },
        { "type": "story", "platform": "instagram", "quantity": 3 }
      ],
      "signed_at": "2026-05-22T14:00:00Z",
      "expires_at": "2026-08-01T23:59:59Z",
      "created_at": "2026-05-20T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 34,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/contractsGenerate a contract for a creator engagement.

Generate a contract for a creator engagement.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "campaign_id": "camp_new456",
  "title": "Fall Collection UGC Agreement",
  "compensation": {
    "type": "fixed",
    "amount": 300,
    "currency": "USD"
  },
  "deliverables": [
    { "type": "reel", "platform": "tiktok", "quantity": 2 }
  ],
  "usage_rights": "12 months, paid ads included",
  "expires_at": "2026-10-01T23:59:59Z",
  "send_for_signature": true
}

Response

200 OK
{
  "data": {
    "id": "contract_new001",
    "title": "Fall Collection UGC Agreement",
    "status": "sent",
    "creator_email": "emma@example.com",
    "created_at": "2026-06-13T16:20:00Z",
    "signature_url": "https://www.ugcroster.com/sign/contract_new001"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Deliverables

GET/api/v1/deliverablesList deliverables across campaigns and creators.

List deliverables across campaigns and creators.

Parameters

NameTypeRequiredDescription
campaign_idstringNoFilter by campaign
creator_emailstringNoFilter by creator email
statusstringNoFilter: pending, in_progress, submitted, approved, revision_requested
limitintegerNoMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "id": "deliv_001",
      "contract_id": "contract_001",
      "campaign_id": "camp_xyz789",
      "creator_email": "emma@example.com",
      "type": "reel",
      "platform": "instagram",
      "status": "submitted",
      "content_url": "https://www.instagram.com/reel/abc123",
      "due_date": "2026-06-25T23:59:59Z",
      "submitted_at": "2026-06-20T16:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 22,
    "has_more": true
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
PATCH/api/v1/deliverables/:idUpdate a deliverable's status (approve, request revision, mark complete).

Update a deliverable's status (approve, request revision, mark complete).

Parameters

NameTypeRequiredDescription
idstringYesDeliverable ID (path parameter)

Request body

JSON
{
  "status": "approved",
  "feedback": "Looks perfect, thank you!"
}

Response

200 OK
{
  "data": {
    "id": "deliv_001",
    "status": "approved",
    "feedback": "Looks perfect, thank you!",
    "updated_at": "2026-06-13T16:30:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Shipments

GET/api/v1/shipmentsList product shipments with tracking info and status.

List product shipments with tracking info and status.

Parameters

NameTypeRequiredDescription
creator_emailstringNoFilter by creator email
statusstringNoFilter: pending, shipped, delivered, returned
limitintegerNoMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "id": "ship_001",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "campaign_id": "camp_xyz789",
      "products": [
        { "name": "Glow Serum", "sku": "GS-001", "quantity": 1 },
        { "name": "Moisturizer SPF 30", "sku": "MS-030", "quantity": 1 }
      ],
      "tracking_number": "1Z999AA10123456784",
      "carrier": "UPS",
      "status": "delivered",
      "shipped_at": "2026-06-05T10:00:00Z",
      "delivered_at": "2026-06-08T14:30:00Z",
      "address": {
        "city": "Los Angeles",
        "state": "CA",
        "country": "US"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 18,
    "has_more": false
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/shipmentsRecord a product shipment to a creator.

Record a product shipment to a creator.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "campaign_id": "camp_new456",
  "products": [
    { "name": "Fall Collection Box", "sku": "FCB-001", "quantity": 1 }
  ],
  "tracking_number": "1Z999AA10987654321",
  "carrier": "UPS",
  "notify_creator": true
}

Response

200 OK
{
  "data": {
    "id": "ship_new001",
    "creator_email": "emma@example.com",
    "status": "shipped",
    "tracking_number": "1Z999AA10987654321",
    "carrier": "UPS",
    "shipped_at": "2026-06-13T16:40:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/brand/shipments/shareGenerate a shareable public link for your shipments. The page reads live data from your shipment records and auto-generates a custom OG image for social sharing.

Generate a shareable public link for your shipments. The page reads live data from your shipment records and auto-generates a custom OG image for social sharing.

Request body

JSON
{
  "title": "Q3 Product Seeding",
  "campaignName": "Summer Launch",
  "campaignId": "camp_xyz789",
  "logoUrl": "https://example.com/logo.png"
}

Response

200 OK
{
  "shareId": "a1b2c3d4e5f6g7h8",
  "url": "https://ugcroster.com/shared-shipment/a1b2c3d4e5f6g7h8"
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Webhooks

GET/api/v1/webhooksList all registered webhook endpoints.

List all registered webhook endpoints.

Response

200 OK
{
  "data": [
    {
      "id": "wh_001",
      "url": "https://yourapp.com/webhooks/roster",
      "events": ["commission.created", "commission.approved", "payout.created"],
      "status": "active",
      "secret": "whsec_abc...xyz",
      "created_at": "2026-05-01T10:00:00Z",
      "last_triggered": "2026-06-13T12:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 2,
    "has_more": false
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
POST/api/v1/webhooksRegister a new webhook endpoint.

Register a new webhook endpoint.

Request body

JSON
{
  "url": "https://yourapp.com/webhooks/roster",
  "events": ["commission.created", "commission.approved", "application.received"],
  "secret": "your_optional_secret"
}

Response

200 OK
{
  "data": {
    "id": "wh_new001",
    "url": "https://yourapp.com/webhooks/roster",
    "events": ["commission.created", "commission.approved", "application.received"],
    "status": "active",
    "secret": "whsec_generated_secret_here",
    "created_at": "2026-06-13T16:50:00Z"
  }
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error
DELETE/api/v1/webhooks/:idRemove a webhook endpoint.

Remove a webhook endpoint.

Parameters

NameTypeRequiredDescription
idstringYesWebhook ID (path parameter)

Response

200 OK
{
  "deleted": true,
  "id": "wh_001"
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

Analytics

GET/api/v1/analyticsGet aggregated analytics overview: revenue, commissions, top performers, and trends.

Get aggregated analytics overview: revenue, commissions, top performers, and trends.

Parameters

NameTypeRequiredDescription
fromstringNoStart date (ISO 8601)
tostringNoEnd date (ISO 8601)
granularitystringNoData granularity: day, week, month

Response

200 OK
{
  "period": {
    "from": "2026-06-01T00:00:00Z",
    "to": "2026-06-13T23:59:59Z"
  },
  "summary": {
    "total_revenue": 24650.00,
    "total_commissions": 3697.50,
    "total_clicks": 18470,
    "total_conversions": 930,
    "conversion_rate": 5.03,
    "active_creators": 42,
    "active_campaigns": 5,
    "content_pieces_tracked": 67
  },
  "top_creators": [
    {
      "id": "cr_emma",
      "name": "Emma Chen",
      "revenue": 4650.00,
      "conversions": 93
    }
  ],
  "trends": [
    { "date": "2026-06-01", "revenue": 1850.00, "clicks": 1420 },
    { "date": "2026-06-02", "revenue": 2100.00, "clicks": 1580 }
  ]
}

Error codes

401Unauthorized -- missing or invalid API key
403Forbidden -- key does not have access to this resource
404Not found
422Validation error -- check request body
429Rate limit exceeded -- wait and retry
500Internal server error

MCP Server

The Roster MCP server exposes 34 tools to Claude, organized by category. Install via npm and connect to Claude Desktop or Claude Code.

Install
npx ugcroster-mcp

list_creators

List all creators with performance data -- clicks, conversions, revenue, commissions

Creators

get_creator_details

Get detailed profile and metrics for a specific creator

Creators

add_to_roster

Add a creator to your brand roster

Creators

get_affiliate_performance

Get affiliate tracking data with optional date range and creator filters

Affiliates

create_affiliate_link

Assign a discount code or referral link to a creator

Affiliates

update_affiliate_link

Update an existing affiliate link or discount code

Affiliates

delete_affiliate_link

Remove an affiliate link

Affiliates

get_analytics

Aggregated analytics overview -- revenue, commissions, top performers

Analytics

get_campaign_stats

Campaign performance -- applicant counts, hired creators, status

Campaigns

create_campaign

Create a new campaign with requirements and compensation details

Campaigns

update_campaign

Update campaign settings, status, or requirements

Campaigns

list_applications

List applications for a campaign with status filters

Campaigns

update_application

Accept, reject, or shortlist an application

Campaigns

list_commissions

List commission events filtered by status (pending, approved, rejected, paid)

Commissions

approve_commission

Approve a pending commission by event ID

Commissions

reject_commission

Reject a commission with an optional note

Commissions

bulk_update_commissions

Bulk approve, reject, or mark commissions as paid

Commissions

send_message

Send a message to a creator via email and in-app messaging

Messaging

list_conversations

List recent conversations with creators

Messaging

create_payout

Record a payout to a creator -- PayPal, bank transfer, or manual

Payouts

list_payouts

View payout history with amounts, methods, and dates

Payouts

create_brief

Create and send a content brief to a creator

Briefs

list_briefs

List all briefs with status and assignment info

Briefs

track_content

Add a content URL for tracking (Instagram, TikTok, YouTube)

Content

get_content_stats

Get performance metrics for tracked content

Content

refresh_content

Refresh metrics for a tracked content piece

Content

create_contract

Generate a contract for a creator engagement

Contracts

list_contracts

List all contracts with status filters

Contracts

update_deliverable

Mark a deliverable as complete or update its status

Deliverables

list_deliverables

List deliverables across campaigns and creators

Deliverables

create_shipment

Record a product shipment to a creator

Shipments

list_shipments

List shipments with tracking info and status

Shipments

get_brand_profile

Get your brand profile and settings

Brand

update_brand_profile

Update brand name, logo, description, or settings

Brand

Example Multi-Tool Workflows

“Find my top affiliates and pay them”

1get_affiliate_performance — Fetches all affiliates sorted by revenue
2list_commissions — Gets unpaid approved commissions for each top affiliate
3create_payout — Records payouts for each creator
4send_message — Notifies each creator about their payout

“Launch a campaign and invite top creators”

1create_campaign — Creates the new campaign with requirements
2list_creators — Finds creators matching the campaign criteria
3create_brief — Generates content briefs for each creator
4create_contract — Generates and sends contracts
5send_message — Sends personalized invitations to each creator

“Weekly performance report”

1get_analytics — Pulls overall performance metrics for the week
2get_content_stats — Gets metrics on all tracked content
3get_campaign_stats — Campaign-level performance breakdown
4list_deliverables — Checks deliverable completion status

Webhooks Guide

Receive real-time notifications when events occur in your Roster account. Register a webhook endpoint and we will POST event data to your URL.

Available Events

campaign.createdA new campaign is published
campaign.updatedCampaign settings or status change
application.receivedA creator applies to a campaign
application.status_changedAn application is accepted, rejected, or shortlisted
commission.createdA new commission event is recorded
commission.approvedA commission is approved
commission.rejectedA commission is rejected
commission.paidA commission is marked as paid
payout.createdA payout is recorded
message.receivedA creator sends a message
content.trackedA new content piece is added for tracking
content.metrics_updatedContent metrics are refreshed
contract.signedA creator signs a contract
deliverable.completedA deliverable is marked complete
shipment.deliveredA shipment is marked delivered
roster.creator_addedA creator is added to the roster
roster.creator_removedA creator is removed from the roster

Payload Format

Every webhook payload follows the same envelope format:

Webhook payload
{
  "id": "evt_abc123",
  "type": "commission.approved",
  "created_at": "2026-06-13T15:30:00Z",
  "data": {
    "id": "comm_001",
    "creator_email": "emma@example.com",
    "creator_name": "Emma Chen",
    "commission_amount": 13.50,
    "status": "approved"
  }
}

Signature Verification

Every webhook request includes an X-Roster-Signature header containing an HMAC-SHA256 signature of the request body, signed with your webhook secret. Always verify this signature before processing.

const crypto = require('crypto');

function verifyWebhook(body, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(body)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your handler:
const isValid = verifyWebhook(
  rawBody,
  req.headers['x-roster-signature'],
  'whsec_your_secret'
);

Retry Policy

If your endpoint returns a non-2xx status code or times out (30 second timeout), we retry with exponential backoff:

AttemptDelay
1st retry1 minute
2nd retry5 minutes
3rd retry30 minutes
4th retry2 hours
5th retry (final)24 hours

After 5 failed attempts, the webhook is marked as failing. You will receive an email notification and the webhook will be disabled after 3 consecutive days of failures.

Code Examples

Complete examples in popular languages. All examples use the REST API directly.

List Creators with Performance Data

curl -X GET "https://www.ugcroster.com/api/v1/creators?limit=10" \
  -H "Authorization: Bearer rsk_your_key_here"

Create a Campaign

curl -X POST "https://www.ugcroster.com/api/v1/campaigns" \
  -H "Authorization: Bearer rsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Summer Launch",
    "type": "ugc",
    "compensation": { "type": "fixed", "amount": 250, "currency": "USD" },
    "requirements": {
      "platforms": ["tiktok", "instagram"],
      "min_followers": 5000,
      "content_types": ["reel"]
    },
    "deadline": "2026-08-01T23:59:59Z",
    "status": "active"
  }'

Approve Commissions & Create Payout

# 1. List pending commissions
curl -X GET "https://www.ugcroster.com/api/v1/commissions?status=pending" \
  -H "Authorization: Bearer rsk_your_key_here"

# 2. Approve a commission (use the commission ID from step 1)
curl -X POST "https://www.ugcroster.com/api/v1/commissions" \
  -H "Authorization: Bearer rsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "creator_email": "emma@example.com", "amount": 50.00, "status": "approved" }'

# 3. Create a payout
curl -X POST "https://www.ugcroster.com/api/v1/payouts" \
  -H "Authorization: Bearer rsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "creator_email": "emma@example.com", "amount": 697.50, "method": "paypal" }'

SDKs & Libraries

Official packages and integration options.

ugcroster-mcp

npm package

MCP server for Claude Desktop and Claude Code. Exposes all 34 tools for natural-language interaction with your brand data.

npx ugcroster-mcp
View on npm

REST API

Any language

Standard REST API with JSON requests and responses. Works with any programming language, Zapier, Make, or HTTP client.

Base URL: https://www.ugcroster.com/api/v1

Auth: Bearer token in Authorization header

Format: JSON request & response bodies

Ready to connect?

Generate your API key and start managing your creators through Claude or your own integrations in under 3 minutes.

Get your API keyView on npm
Roster

The end-to-end platform for creator campaigns. Source, brief, approve, pay. One place.

Platform

  • Get Started
  • Brand Login
  • Pricing

Resources

  • Blog
  • Contact
  • Terms of Service
ROSTER

© 2026 Roster Labs, Inc.. All rights reserved.

TermsPrivacyContact