UGC Pocket docs

REST API & MCP server

UGC Pocket exposes an MCP server for AI agents: an agent drafts a UGC campaign with no account and no API key, then gives the user a claim link. The user confirms the draft, and the UGC Pocket team gets back to them with a commercial proposal and writes the campaign scripts. Nothing is charged by an agent.

Overview

MCP serverhttps://ugcpocket.com/mcp · Streamable HTTP, JSON-RPC 2.0, protocol 2025-06-18
AuthenticationNone. No account, no API key.
Toolsget_service_info, create_campaign_draft
REST basehttps://ugcpocket.com/api · only GET /service-info is live
Specification/openapi.json (OpenAPI 3.1)
CurrencyEUR, amounts in cents
Campaign package200,000 to 10,000,000 cents (€2,000 to €100,000)

budget_max_cents is the flat campaign package the user has in mind. It is indicative: the final price is in the commercial proposal. UGC Pocket, not the brand, sets creator pay. Agents must never promise views, a number of videos or a number of creators.

Getting started

  1. Point your MCP client at https://ugcpocket.com/mcp. No header, no key.
  2. Call create_campaign_draft with what the user told you and what you read on their website.
  3. Give the returned claim_url to the user, with the next_step text.

First request

curl -X POST https://ugcpocket.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 1, "method": "tools/call",
    "params": { "name": "create_campaign_draft", "arguments": {
      "title": "Kibble launch",
      "brief": "Short TikTok videos showing dogs trying our new kibble…",
      "target_categories": ["dog"],
      "platforms": ["TikTok"],
      "budget_max_cents": 350000,
      "company": { "name": "Acme Pet", "website": "https://acme.example" }
    } }
  }'
// result.structuredContent
{
  "draft_id": "8b1f…",
  "claim_url": "https://app.ugcpocket.com/c/Xk3…",
  "expires_at": "2026-10-04T10:00:00.000Z",
  "emailed": false,
  "next_step": "Give the claim_url to the user: no email was sent, so they only get it from you. The user opens the link, confirms the campaign with a 6-digit code sent by email and leaves a phone number. …"
}

MCP server

Streamable HTTP MCP server at https://ugcpocket.com/mcp, protocol 2025-06-18, ugc-pocket-mcp v1.3.0. JSON transport only: the server emits no SSE stream, and a client whose Accept header allows neither application/json nor */* gets 406. Only POST is accepted. Every method and both tools work without authentication.

Client configuration

{
  "mcpServers": {
    "ugc-pocket": {
      "type": "http",
      "url": "https://ugcpocket.com/mcp"
    }
  }
}

One-step install. Claude Code:

claude mcp add --transport http ugc-pocket https://ugcpocket.com/mcp
  • Cursor: add UGC Pocket to Cursor
  • Claude (web and desktop): Settings, Connectors, Add custom connector, URL https://ugcpocket.com/mcp

Discovery: the domain catalog is at /.well-known/ard.json (same content at /.well-known/ai-catalog.json), the server card at /mcp/server-card, and the server is listed in the official MCP Registry as com.ugcpocket/ugc-pocket.

Tools

ToolInputPurpose
get_service_infononeService descriptor: categories, platforms, price model, what happens after a draft. Read-only, idempotent. Same payload as GET /service-info.
create_campaign_draftsee belowBuilds a campaign draft with no account and returns a claim_url for the user.

Ordering with an API key and the creator tools are paused: estimate_campaign, create_campaign_order, check_campaign_status, list_my_campaigns, submit_posted_video and list_my_deliverables are no longer listed, and calling them returns isError: true pointing to create_campaign_draft or to the app.

create_campaign_draft

The input is coerced, not strictly rejected. Only a missing title, a missing or too short brief, and a budget_max_cents missing or below the floor return an error. Everything else is silently normalised: title and brief are truncated to their maximum length, unknown values are dropped from target_categories and platforms, objectives keeps its first 6 entries, a budget above the ceiling is clamped to 10000000, an invalid deadline or email is ignored.

FieldTypeDetails
titlerequiredstring ≤ 120Campaign title, e.g. the product and the angle.
briefrequiredstring ≤ 2000What the product is, who it is for, what the videos should show.
budget_max_centsrequiredintegerEuro cents, 200000 (€2,000) to 10000000 (€100,000). The flat campaign package the user has in mind, indicative: the final price is in the commercial proposal.
objectivesstring[] ≤ 6Free-form campaign objectives.
target_categoriesenum[]Creator categories whose audience fits the product. See the categories below.
platformsenum[]TikTok, Instagram.
deadlinedateYYYY-MM-DD, in the future. Anything else is ignored.
companyobjectname (≤ 120), website (≤ 250), description (≤ 400, one line). Shown on the claim page.
emailstringThe user's email, if they gave it: they also receive the claim link by email.
languageenumfr or en, for that email. Defaults to the language of the brief.

Categories

dogcatpetscarcookingcouplefamilykidsbusinessfinancepodcastsportwellnessbeautyfashiontechgaminghomegardendiytravellifestyle

Call get_service_info rather than hard-coding them.

Output

FieldDetails
draft_idDraft identifier.
claim_urlhttps://app.ugcpocket.com/c/<token>. Public: no login needed to view it. Give it to the user.
expires_at7 days after creation.
emailedtrue when the claim link was also sent to the email you passed. When false, the user only gets it from you.
next_stepWhat to tell the user now.

After the draft

  1. The user opens claim_url and sees the campaign you built.
  2. They confirm it with a 6-digit code sent by email and leave a phone number (required).
  3. The UGC Pocket team gets back to them with a commercial proposal and writes the campaign scripts.

Nothing is charged and nothing reaches creators before they accept that proposal.

JSON-RPC errors

Two distinct registers, which an agent should not conflate: a protocol failure is an error object, a business rejection is a result with isError: true and an actionable message.

CodeCause
-32601Unknown tool or method.
-32602Missing required argument.
-32700 / -32600Unparseable JSON / invalid JSON-RPC request.
-32000HTTP method other than POST (405) or unacceptable Accept header (406).
-32603Internal error.
isError: trueBusiness rejection: validation (title, brief, budget below the floor), rate limit reached, paused tool.

REST API

Base https://ugcpocket.com/api. Responses are JSON; errors use the envelope { "error": "code", "detail": "…" }.

GET/api/service-info

Service descriptor, no authentication. GET / returns the same payload, as does the MCP tool get_service_info. Fields: name, description, categories, platforms (TikTok, Instagram), currency (EUR), budget_unit (cents), min_campaign_budget_cents (200000), max_campaign_budget_cents (10000000), pricing, order_model (draft_then_commercial_proposal), how_it_works, tools, paused, mcp, openapi, docs, contact.

Paused routes

POST /estimate, POST /campaigns and GET /campaigns/{id} are paused and return 410:

{ "error": "paused", "detail": "…", "mcp": "https://ugcpocket.com/mcp", "docs": "https://ugcpocket.com/for-agents" }

Errors

Every REST error uses the { "error", "detail" } envelope. The error field is stable; detail is a human-readable message that may change. MCP errors are listed above.

HTTPerrorCause
404not_foundUnknown route.
410pausedPaused route: use the MCP tool create_campaign_draft.

Limits

LimitValueBehaviour when exceeded
MCP drafts20 per IP per hourisError: true, "Rate limit reached"
Campaign package200,000 to 10,000,000 centsBelow the floor: isError: true. Above the ceiling: clamped to 10,000,000.
Draft lifetime7 daysThe claim_url expires

Machine resources

ResourcePurpose
/openapi.jsonOpenAPI 3.1 specification of the REST API.
/llms.txtLLM-readable product discovery and context.
/llms-full.txtExtended version.
/.well-known/ard.jsonDomain catalog of agent resources (ARD / AI Catalog).
/mcp/server-cardMCP server card: name, version, endpoint, protocol.

Integration questions: hello@logics-studio.com