MCP Server live on npm · 58 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.

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 monthApprove all pending commissions over $50How many creators applied to my latest campaign?Send a follow-up message to emma@creator.com about the skincare campaignCreate a 15% discount code SUMMER15 for @creatorWhat was my total affiliate revenue last week?List all unpaid commissions and mark them as paidShow 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/brand

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/brand

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/campaigns

List all campaigns with optional status filter.

Parameters

NameTypeDescription
statusstringFilter by status: active, draft, paused, completed
limitintegerMax results (default 20, max 100)
pageintegerPage 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/campaigns

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/:id

Get detailed information about a specific campaign.

Parameters

NameTypeDescription
idstringCampaign 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/:id

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

Parameters

NameTypeDescription
idstringCampaign 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/applications

List all applications for a specific campaign.

Parameters

NameTypeDescription
idstringCampaign ID (path parameter)
statusstringFilter: pending, accepted, rejected, shortlisted
limitintegerMax results (default 20, max 100)
pageintegerPage 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/:id

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

Parameters

NameTypeDescription
idstringApplication 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/creators

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

Parameters

NameTypeDescription
searchstringSearch by name or email
platformstringFilter by platform: instagram, tiktok, youtube
min_followersintegerMinimum follower count
limitintegerMax results (default 20, max 100)
pageintegerPage 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/search

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

Parameters

NameTypeDescription
qstringFree text search across username, name, bio, niches, category. A q that is purely a location ("NYC", "Georgia") is treated as a city/state filter instead.
follower_minintegerMinimum follower count
follower_maxintegerMaximum follower count
engagement_minnumberMinimum engagement rate (e.g. 2.5)
categorystringExact category match
nichestringSearch within niches field
has_emailbooleanFilter to creators with extracted contact email
countrystringCountry filter (partial match)
citystringCity filter. Metro shorthand expands to the whole metro ("NYC" covers New York, Brooklyn, Queens, Bronx, Staten Island, Manhattan; also LA, SF, Bay Area, DC, Miami, DFW). "Brooklyn, NY" sets the state too. Unknown cities match as substrings.
statestringState filter. Accepts abbreviations ("NY") or full names; matches stored spellings exactly (case-insensitive), so VA does not match West Virginia.
genderstringGender filter (case-insensitive)
sortstringSort: followers (default) or engagement
limitintegerMax results (default 20, max 100)
pageintegerPage 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/:pk

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

Parameters

NameTypeDescription
pkintegerCreator 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/roster

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

Parameters

NameTypeDescription
statusstringFilter: active, paused, removed
limitintegerMax results (default 20, max 100)
pageintegerPage 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/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/add

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/affiliates

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

Parameters

NameTypeDescription
creator_emailstringFilter by creator email
fromstringStart date (ISO 8601)
tostringEnd date (ISO 8601)
limitintegerMax results (default 20, max 100)
pageintegerPage 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

Commissions

GET/api/v1/commissions

List commission events with optional status and date filters.

Parameters

NameTypeDescription
statusstringFilter: pending, approved, rejected, paid
creator_emailstringFilter by creator email
fromstringStart date (ISO 8601)
tostringEnd date (ISO 8601)
limitintegerMax results (default 20, max 100)
pageintegerPage 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/commissions

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/payouts

List payout history with amounts, methods, and dates.

Parameters

NameTypeDescription
creator_emailstringFilter by creator email
methodstringFilter: paypal, bank_transfer, manual
fromstringStart date (ISO 8601)
tostringEnd date (ISO 8601)
limitintegerMax 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/payouts

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/messages

List recent conversations with creators.

Parameters

NameTypeDescription
creator_emailstringFilter by creator email
unreadbooleanOnly show unread conversations
limitintegerMax 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/messages

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/briefs

List all content briefs with status and assignment info.

Parameters

NameTypeDescription
campaign_idstringFilter by campaign
creator_emailstringFilter by creator email
statusstringFilter: 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/briefs

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/content

List all tracked content pieces with metrics.

Parameters

NameTypeDescription
creator_emailstringFilter by creator email
platformstringFilter: instagram, tiktok, youtube
campaign_idstringFilter by campaign
limitintegerMax 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/content

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/:id

Get detailed metrics for a specific tracked content piece.

Parameters

NameTypeDescription
idstringContent 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/:id

Refresh metrics for a tracked content piece.

Parameters

NameTypeDescription
idstringContent 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/:id

Stop tracking a content piece and remove it.

Parameters

NameTypeDescription
idstringContent 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/contracts

List all contracts with status filters.

Parameters

NameTypeDescription
creator_emailstringFilter by creator email
statusstringFilter: draft, sent, signed, expired
limitintegerMax 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/contracts

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/deliverables

List deliverables across campaigns and creators.

Parameters

NameTypeDescription
campaign_idstringFilter by campaign
creator_emailstringFilter by creator email
statusstringFilter: pending, in_progress, submitted, approved, revision_requested
limitintegerMax 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/:id

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

Parameters

NameTypeDescription
idstringDeliverable 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/shipments

List product shipments with tracking info and status.

Parameters

NameTypeDescription
creator_emailstringFilter by creator email
statusstringFilter: pending, shipped, delivered, returned
limitintegerMax results (default 20, max 100)

Response

200 OK
{
  "data": [
    {
      "id": "ship_001",
      "campaign_id": "camp_xyz789",
      "creator_email": "emma@example.com",
      "creator_name": "Emma Chen",
      "carrier": "ups",
      "tracking_number": "1Z999AA10123456784",
      "estimated_arrival": null,
      "product_description": "Glow Serum, Moisturizer SPF 30",
      "shipping_address": {
        "street": "1234 Sunset Blvd",
        "city": "Los Angeles",
        "state": "CA",
        "zip": "90026",
        "country": "US"
      },
      "notes": null,
      "tracking_status": "pending",
      "creator_confirmed_receipt": false,
      "status": "shipped",
      "created_at": "2026-06-05T10:00:00Z",
      "updated_at": "2026-06-08T14:30:00Z"
    }
  ],
  "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/shipments

Record a product shipment to a creator. shipping_address accepts an object (street, line2, city, state, zip, country) or a free-form string.

Request body

JSON
{
  "creator_email": "emma@example.com",
  "campaign_id": "camp_new456",
  "product_description": "Fall Collection Box",
  "tracking_number": "1Z999AA10987654321",
  "carrier": "UPS",
  "shipping_address": {
    "street": "1234 Sunset Blvd",
    "city": "Los Angeles",
    "state": "CA",
    "zip": "90026",
    "country": "US"
  },
  "notes": "Leave at front desk"
}

Response

200 OK
{
  "data": {
    "id": "ship_new001",
    "creator_email": "emma@example.com",
    "status": "created",
    "tracking_number": "1Z999AA10987654321",
    "carrier": "ups",
    "product_description": "Fall Collection Box",
    "shipping_address": {
      "street": "1234 Sunset Blvd",
      "city": "Los Angeles",
      "state": "CA",
      "zip": "90026",
      "country": "US"
    },
    "created_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
PATCH/api/v1/shipments/:id

Update a shipment: status, tracking, shipping address, or notes. Pass shipping_address as an object or string; pass null to clear it.

Request body

JSON
{
  "status": "shipped",
  "tracking_number": "1Z999AA10987654321",
  "carrier": "UPS",
  "shipping_address": {
    "street": "2715 Bearcat Way",
    "city": "Cincinnati",
    "state": "OH",
    "zip": "45219-3539",
    "country": "US"
  },
  "notes": "Address updated by brand"
}

Response

200 OK
{
  "data": {
    "id": "ship_001",
    "status": "shipped",
    "tracking_number": "1Z999AA10987654321",
    "carrier": "ups",
    "shipping_address": {
      "street": "2715 Bearcat Way",
      "city": "Cincinnati",
      "state": "OH",
      "zip": "45219-3539",
      "country": "US"
    },
    "updated_at": "2026-08-17T16:20: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/share

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/webhooks

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/webhooks

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/:id

Remove a webhook endpoint.

Parameters

NameTypeDescription
idstringWebhook 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/analytics

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

Parameters

NameTypeDescription
fromstringStart date (ISO 8601)
tostringEnd date (ISO 8601)
granularitystringData 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

application.receivedA creator applies to a campaign
application.approvedAn application is approved
commission.createdA new commission event is recorded
commission.approvedA commission is approved
payout.createdA payout is recorded
content.refreshedTracked content metrics are refreshed
message.receivedA creator sends a message
deliverable.submittedA creator submits a deliverable
deliverable.approvedA deliverable is approved
deliverable.revision_requestedRevisions are requested on a deliverable
deliverable.cancelledA deliverable is cancelled
deliverable.declinedA deliverable is declined

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.