REST API and MCP server for managing creators, campaigns, affiliates, commissions, content tracking, contracts, and more. Build integrations or use Claude directly.
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.
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
Standard HTTP endpoints you call from any language. Same data, same actions - just code instead of conversation.
Best for: Custom integrations, dashboards, automations, scripts
Open your Brand Portal and go to the Settings tab
Scroll to API & Integrations and click Create API Key
Copy the key immediately - it's only shown once
Your key looks like:
rsk_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
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{
"mcpServers": {
"roster": {
"command": "npx",
"args": ["ugcroster-mcp"],
"env": {
"ROSTER_API_KEY": "your-api-key"
}
}
}
}Claude Code (terminal)
~/.claude/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.
Hit any endpoint with your API key in the Authorization header. That's it.
curl https://www.ugcroster.com/api/v1/creators \ -H "Authorization: Bearer rsk_your-api-key"
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.
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 keys are 44 characters long and always start with rsk_. You can create and revoke keys at any time from Settings → API & Integrations.
curl -X GET https://www.ugcroster.com/api/v1/creators \ -H "Authorization: Bearer rsk_your_key_here" \ -H "Content-Type: application/json"
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
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.
/api/v1/brandRetrieve your brand profile, settings, and subscription info.Retrieve your brand profile, settings, and subscription info.
{
"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"
}
}/api/v1/brandUpdate your brand profile or settings.Update your brand profile or settings.
{
"name": "Glow Skincare Co.",
"description": "Premium clean skincare.",
"settings": {
"auto_approve_commissions": true,
"default_commission_rate": 20
}
}{
"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"
}
}/api/v1/campaignsList all campaigns with optional status filter.List all campaigns with optional status filter.
| Name | Type | Description |
|---|---|---|
| status | string | Filter by status: active, draft, paused, completed |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1). Offset is also supported. |
{
"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
}
}/api/v1/campaignsCreate a new campaign.Create a new campaign.
{
"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"
}{
"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"
}
}/api/v1/campaigns/:idGet detailed information about a specific campaign.Get detailed information about a specific campaign.
| Name | Type | Description |
|---|---|---|
| id | string | Campaign ID (path parameter) |
{
"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"
}
}/api/v1/campaigns/:idUpdate an existing campaign's settings, status, or requirements.Update an existing campaign's settings, status, or requirements.
| Name | Type | Description |
|---|---|---|
| id | string | Campaign ID (path parameter) |
{
"status": "paused",
"compensation": {
"amount": 350
}
}{
"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"
}
}/api/v1/campaigns/:id/applicationsList all applications for a specific campaign.List all applications for a specific campaign.
| Name | Type | Description |
|---|---|---|
| id | string | Campaign ID (path parameter) |
| status | string | Filter: pending, accepted, rejected, shortlisted |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1). Offset is also supported. |
{
"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
}
}/api/v1/applications/:idUpdate an application's status (accept, reject, shortlist).Update an application's status (accept, reject, shortlist).
| Name | Type | Description |
|---|---|---|
| id | string | Application ID (path parameter) |
{
"status": "accepted",
"note": "Great portfolio, perfect fit for our brand."
}{
"data": {
"id": "app_001",
"status": "accepted",
"note": "Great portfolio, perfect fit for our brand.",
"updated_at": "2026-06-13T15:00:00Z"
}
}/api/v1/creatorsList all creators with performance data (clicks, conversions, revenue).List all creators with performance data (clicks, conversions, revenue).
| Name | Type | Description |
|---|---|---|
| search | string | Search by name or email |
| platform | string | Filter by platform: instagram, tiktok, youtube |
| min_followers | integer | Minimum follower count |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1). Offset is also supported. |
{
"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
}
}/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.
| Name | Type | Description |
|---|---|---|
| q | string | Free text search across username, name, bio, niches, category |
| follower_min | integer | Minimum follower count |
| follower_max | integer | Maximum follower count |
| engagement_min | number | Minimum engagement rate (e.g. 2.5) |
| category | string | Exact category match |
| niche | string | Search within niches field |
| has_email | boolean | Filter to creators with extracted contact email |
| country | string | Country filter (partial match) |
| city | string | City filter (partial match) |
| state | string | State filter (partial match) |
| gender | string | Gender filter (exact match) |
| sort | string | Sort: followers (default) or engagement |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1) |
{
"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
}
}/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.
| Name | Type | Description |
|---|---|---|
| pk | integer | Creator primary key (from search results) |
{
"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
}
}/api/v1/rosterList creators on your brand roster (your active creator network).List creators on your brand roster (your active creator network).
| Name | Type | Description |
|---|---|---|
| status | string | Filter: active, paused, removed |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1). Offset is also supported. |
{
"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
}
}/api/v1/rosterAdd a creator to your brand roster.Add a creator to your brand roster.
{
"creator_email": "emma@example.com",
"note": "Great fit for our skincare line"
}{
"data": {
"id": "roster_002",
"creator_email": "emma@example.com",
"status": "active",
"added_at": "2026-06-13T15:10:00Z"
}
}/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.
{
"ig_handle": "@emmachen",
"tt_handle": "@emmachen",
"name": "Emma Chen",
"tags": ["skincare", "lifestyle"]
}{
"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"
}
}/api/v1/affiliatesGet affiliate tracking data with optional date range and creator filters.Get affiliate tracking data with optional date range and creator filters.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| from | string | Start date (ISO 8601) |
| to | string | End date (ISO 8601) |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1). Offset is also supported. |
{
"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
}
}/api/v1/affiliates/linksList all affiliate links and discount codes.List all affiliate links and discount codes.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| status | string | Filter: active, expired, disabled |
{
"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
}
}/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.
{
"creator_email": "emma@example.com",
"type": "discount_code",
"code": "SUMMER20",
"discount_percent": 20,
"expires_at": "2026-09-01T23:59:59Z"
}{
"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"
}
}/api/v1/affiliates/links/:idUpdate an affiliate link (change code, discount, expiry, or status).Update an affiliate link (change code, discount, expiry, or status).
| Name | Type | Description |
|---|---|---|
| id | string | Link ID (path parameter) |
{
"discount_percent": 25,
"expires_at": "2026-12-31T23:59:59Z"
}{
"data": {
"id": "link_002",
"discount_percent": 25,
"expires_at": "2026-12-31T23:59:59Z",
"updated_at": "2026-06-13T15:25:00Z"
}
}/api/v1/affiliates/links/:idDelete an affiliate link. This action is permanent.Delete an affiliate link. This action is permanent.
| Name | Type | Description |
|---|---|---|
| id | string | Link ID (path parameter) |
{
"deleted": true,
"id": "link_002"
}/api/v1/commissionsList commission events with optional status and date filters.List commission events with optional status and date filters.
| Name | Type | Description |
|---|---|---|
| status | string | Filter: pending, approved, rejected, paid |
| creator_email | string | Filter by creator email |
| from | string | Start date (ISO 8601) |
| to | string | End date (ISO 8601) |
| limit | integer | Max results (default 20, max 100) |
| page | integer | Page number (default 1). Offset is also supported. |
{
"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
}
}/api/v1/commissionsManually create a commission event or bulk update commission statuses.Manually create a commission event or bulk update commission statuses.
{
"creator_email": "emma@example.com",
"amount": 50.00,
"description": "Bonus for viral TikTok",
"status": "approved"
}{
"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"
}
}/api/v1/payoutsList payout history with amounts, methods, and dates.List payout history with amounts, methods, and dates.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| method | string | Filter: paypal, bank_transfer, manual |
| from | string | Start date (ISO 8601) |
| to | string | End date (ISO 8601) |
| limit | integer | Max results (default 20, max 100) |
{
"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
}
}/api/v1/payoutsRecord a payout to a creator.Record a payout to a creator.
{
"creator_email": "emma@example.com",
"amount": 350.00,
"method": "paypal",
"note": "Campaign completion bonus"
}{
"data": {
"id": "pay_new001",
"creator_email": "emma@example.com",
"amount": 350.00,
"method": "paypal",
"status": "completed",
"created_at": "2026-06-13T15:40:00Z"
}
}/api/v1/messagesList recent conversations with creators.List recent conversations with creators.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| unread | boolean | Only show unread conversations |
| limit | integer | Max results (default 20, max 100) |
{
"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
}
}/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.
{
"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
}{
"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
}
}/api/v1/briefsList all content briefs with status and assignment info.List all content briefs with status and assignment info.
| Name | Type | Description |
|---|---|---|
| campaign_id | string | Filter by campaign |
| creator_email | string | Filter by creator email |
| status | string | Filter: draft, sent, in_progress, completed |
{
"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
}
}/api/v1/briefsCreate and send a content brief to a creator.Create and send a content brief to a creator.
{
"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
}{
"data": {
"id": "brief_new001",
"title": "Fall Collection Unboxing",
"status": "sent",
"creator_email": "emma@example.com",
"created_at": "2026-06-13T16:00:00Z"
}
}/api/v1/contentList all tracked content pieces with metrics.List all tracked content pieces with metrics.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| platform | string | Filter: instagram, tiktok, youtube |
| campaign_id | string | Filter by campaign |
| limit | integer | Max results (default 20, max 100) |
{
"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
}
}/api/v1/contentAdd a content URL for tracking (Instagram, TikTok, YouTube).Add a content URL for tracking (Instagram, TikTok, YouTube).
{
"url": "https://www.instagram.com/reel/abc123",
"creator_email": "emma@example.com",
"campaign_id": "camp_xyz789"
}{
"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"
}
}/api/v1/content/:idGet detailed metrics for a specific tracked content piece.Get detailed metrics for a specific tracked content piece.
| Name | Type | Description |
|---|---|---|
| id | string | Content ID (path parameter) |
{
"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"
}
}/api/v1/content/:idRefresh metrics for a tracked content piece.Refresh metrics for a tracked content piece.
| Name | Type | Description |
|---|---|---|
| id | string | Content ID (path parameter) |
{
"data": {
"id": "content_001",
"status": "refreshing",
"last_refreshed": "2026-06-13T16:15:00Z",
"next_refresh_available": "2026-06-13T17:15:00Z"
}
}/api/v1/content/:idStop tracking a content piece and remove it.Stop tracking a content piece and remove it.
| Name | Type | Description |
|---|---|---|
| id | string | Content ID (path parameter) |
{
"deleted": true,
"id": "content_001"
}/api/v1/contractsList all contracts with status filters.List all contracts with status filters.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| status | string | Filter: draft, sent, signed, expired |
| limit | integer | Max results (default 20, max 100) |
{
"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
}
}/api/v1/contractsGenerate a contract for a creator engagement.Generate a contract for a creator engagement.
{
"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
}{
"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"
}
}/api/v1/deliverablesList deliverables across campaigns and creators.List deliverables across campaigns and creators.
| Name | Type | Description |
|---|---|---|
| campaign_id | string | Filter by campaign |
| creator_email | string | Filter by creator email |
| status | string | Filter: pending, in_progress, submitted, approved, revision_requested |
| limit | integer | Max results (default 20, max 100) |
{
"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
}
}/api/v1/deliverables/:idUpdate a deliverable's status (approve, request revision, mark complete).Update a deliverable's status (approve, request revision, mark complete).
| Name | Type | Description |
|---|---|---|
| id | string | Deliverable ID (path parameter) |
{
"status": "approved",
"feedback": "Looks perfect, thank you!"
}{
"data": {
"id": "deliv_001",
"status": "approved",
"feedback": "Looks perfect, thank you!",
"updated_at": "2026-06-13T16:30:00Z"
}
}/api/v1/shipmentsList product shipments with tracking info and status.List product shipments with tracking info and status.
| Name | Type | Description |
|---|---|---|
| creator_email | string | Filter by creator email |
| status | string | Filter: pending, shipped, delivered, returned |
| limit | integer | Max results (default 20, max 100) |
{
"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
}
}/api/v1/shipmentsRecord a product shipment to a creator.Record a product shipment to a creator.
{
"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
}{
"data": {
"id": "ship_new001",
"creator_email": "emma@example.com",
"status": "shipped",
"tracking_number": "1Z999AA10987654321",
"carrier": "UPS",
"shipped_at": "2026-06-13T16:40:00Z"
}
}/api/v1/webhooksList all registered webhook endpoints.List all registered webhook endpoints.
{
"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
}
}/api/v1/webhooksRegister a new webhook endpoint.Register a new webhook endpoint.
{
"url": "https://yourapp.com/webhooks/roster",
"events": ["commission.created", "commission.approved", "application.received"],
"secret": "your_optional_secret"
}{
"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"
}
}/api/v1/webhooks/:idRemove a webhook endpoint.Remove a webhook endpoint.
| Name | Type | Description |
|---|---|---|
| id | string | Webhook ID (path parameter) |
{
"deleted": true,
"id": "wh_001"
}/api/v1/analyticsGet aggregated analytics overview: revenue, commissions, top performers, and trends.Get aggregated analytics overview: revenue, commissions, top performers, and trends.
| Name | Type | Description |
|---|---|---|
| from | string | Start date (ISO 8601) |
| to | string | End date (ISO 8601) |
| granularity | string | Data granularity: day, week, month |
{
"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 }
]
}The Roster MCP server exposes 34 tools to Claude, organized by category. Install via npm and connect to Claude Desktop or Claude Code.
npx ugcroster-mcp
list_creators
List all creators with performance data -- clicks, conversions, revenue, commissions
Creatorsget_creator_details
Get detailed profile and metrics for a specific creator
Creatorsadd_to_roster
Add a creator to your brand roster
Creatorsget_affiliate_performance
Get affiliate tracking data with optional date range and creator filters
Affiliatescreate_affiliate_link
Assign a discount code or referral link to a creator
Affiliatesupdate_affiliate_link
Update an existing affiliate link or discount code
Affiliatesdelete_affiliate_link
Remove an affiliate link
Affiliatesget_analytics
Aggregated analytics overview -- revenue, commissions, top performers
Analyticsget_campaign_stats
Campaign performance -- applicant counts, hired creators, status
Campaignscreate_campaign
Create a new campaign with requirements and compensation details
Campaignsupdate_campaign
Update campaign settings, status, or requirements
Campaignslist_applications
List applications for a campaign with status filters
Campaignsupdate_application
Accept, reject, or shortlist an application
Campaignslist_commissions
List commission events filtered by status (pending, approved, rejected, paid)
Commissionsapprove_commission
Approve a pending commission by event ID
Commissionsreject_commission
Reject a commission with an optional note
Commissionsbulk_update_commissions
Bulk approve, reject, or mark commissions as paid
Commissionssend_message
Send a message to a creator via email and in-app messaging
Messaginglist_conversations
List recent conversations with creators
Messagingcreate_payout
Record a payout to a creator -- PayPal, bank transfer, or manual
Payoutslist_payouts
View payout history with amounts, methods, and dates
Payoutscreate_brief
Create and send a content brief to a creator
Briefslist_briefs
List all briefs with status and assignment info
Briefstrack_content
Add a content URL for tracking (Instagram, TikTok, YouTube)
Contentget_content_stats
Get performance metrics for tracked content
Contentrefresh_content
Refresh metrics for a tracked content piece
Contentcreate_contract
Generate a contract for a creator engagement
Contractslist_contracts
List all contracts with status filters
Contractsupdate_deliverable
Mark a deliverable as complete or update its status
Deliverableslist_deliverables
List deliverables across campaigns and creators
Deliverablescreate_shipment
Record a product shipment to a creator
Shipmentslist_shipments
List shipments with tracking info and status
Shipmentsget_brand_profile
Get your brand profile and settings
Brandupdate_brand_profile
Update brand name, logo, description, or settings
Brand“Find my top affiliates and pay them”
get_affiliate_performance — Fetches all affiliates sorted by revenuelist_commissions — Gets unpaid approved commissions for each top affiliatecreate_payout — Records payouts for each creatorsend_message — Notifies each creator about their payout“Launch a campaign and invite top creators”
create_campaign — Creates the new campaign with requirementslist_creators — Finds creators matching the campaign criteriacreate_brief — Generates content briefs for each creatorcreate_contract — Generates and sends contractssend_message — Sends personalized invitations to each creator“Weekly performance report”
get_analytics — Pulls overall performance metrics for the weekget_content_stats — Gets metrics on all tracked contentget_campaign_stats — Campaign-level performance breakdownlist_deliverables — Checks deliverable completion statusReceive real-time notifications when events occur in your Roster account. Register a webhook endpoint and we will POST event data to your URL.
campaign.createdA new campaign is publishedcampaign.updatedCampaign settings or status changeapplication.receivedA creator applies to a campaignapplication.status_changedAn application is accepted, rejected, or shortlistedcommission.createdA new commission event is recordedcommission.approvedA commission is approvedcommission.rejectedA commission is rejectedcommission.paidA commission is marked as paidpayout.createdA payout is recordedmessage.receivedA creator sends a messagecontent.trackedA new content piece is added for trackingcontent.metrics_updatedContent metrics are refreshedcontract.signedA creator signs a contractdeliverable.completedA deliverable is marked completeshipment.deliveredA shipment is marked deliveredroster.creator_addedA creator is added to the rosterroster.creator_removedA creator is removed from the rosterEvery webhook payload follows the same envelope format:
{
"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"
}
}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'
);If your endpoint returns a non-2xx status code or times out (30 second timeout), we retry with exponential backoff:
| Attempt | Delay |
|---|---|
| 1st retry | 1 minute |
| 2nd retry | 5 minutes |
| 3rd retry | 30 minutes |
| 4th retry | 2 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.
Complete examples in popular languages. All examples use the REST API directly.
curl -X GET "https://www.ugcroster.com/api/v1/creators?limit=10" \ -H "Authorization: Bearer rsk_your_key_here"
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"
}'# 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" }'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
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
Generate your API key and start managing your creators through Claude or your own integrations in under 3 minutes.