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 server | https://ugcpocket.com/mcp · Streamable HTTP, JSON-RPC 2.0, protocol 2025-06-18 |
| Authentication | None. No account, no API key. |
| Tools | get_service_info, create_campaign_draft |
| REST base | https://ugcpocket.com/api · only GET /service-info is live |
| Specification | /openapi.json (OpenAPI 3.1) |
| Currency | EUR, amounts in cents |
| Campaign package | 200,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
- Point your MCP client at
https://ugcpocket.com/mcp. No header, no key. - Call
create_campaign_draftwith what the user told you and what you read on their website. - Give the returned
claim_urlto the user, with thenext_steptext.
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
| Tool | Input | Purpose |
|---|---|---|
get_service_info | none | Service descriptor: categories, platforms, price model, what happens after a draft. Read-only, idempotent. Same payload as GET /service-info. |
create_campaign_draft | see below | Builds 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.
| Field | Type | Details |
|---|---|---|
titlerequired | string ≤ 120 | Campaign title, e.g. the product and the angle. |
briefrequired | string ≤ 2000 | What the product is, who it is for, what the videos should show. |
budget_max_centsrequired | integer | Euro 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. |
objectives | string[] ≤ 6 | Free-form campaign objectives. |
target_categories | enum[] | Creator categories whose audience fits the product. See the categories below. |
platforms | enum[] | TikTok, Instagram. |
deadline | date | YYYY-MM-DD, in the future. Anything else is ignored. |
company | object | name (≤ 120), website (≤ 250), description (≤ 400, one line). Shown on the claim page. |
email | string | The user's email, if they gave it: they also receive the claim link by email. |
language | enum | fr or en, for that email. Defaults to the language of the brief. |
Categories
dogcatpetscarcookingcouplefamilykidsbusinessfinancepodcastsportwellnessbeautyfashiontechgaminghomegardendiytravellifestyle
Call get_service_info rather than hard-coding them.
Output
| Field | Details |
|---|---|
draft_id | Draft identifier. |
claim_url | https://app.ugcpocket.com/c/<token>. Public: no login needed to view it. Give it to the user. |
expires_at | 7 days after creation. |
emailed | true when the claim link was also sent to the email you passed. When false, the user only gets it from you. |
next_step | What to tell the user now. |
After the draft
- The user opens
claim_urland sees the campaign you built. - They confirm it with a 6-digit code sent by email and leave a phone number (required).
- 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.
| Code | Cause |
|---|---|
-32601 | Unknown tool or method. |
-32602 | Missing required argument. |
-32700 / -32600 | Unparseable JSON / invalid JSON-RPC request. |
-32000 | HTTP method other than POST (405) or unacceptable Accept header (406). |
-32603 | Internal error. |
isError: true | Business 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": "…" }.
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.
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.
| HTTP | error | Cause |
|---|---|---|
404 | not_found | Unknown route. |
410 | paused | Paused route: use the MCP tool create_campaign_draft. |
Limits
| Limit | Value | Behaviour when exceeded |
|---|---|---|
| MCP drafts | 20 per IP per hour | isError: true, "Rate limit reached" |
| Campaign package | 200,000 to 10,000,000 cents | Below the floor: isError: true. Above the ceiling: clamped to 10,000,000. |
| Draft lifetime | 7 days | The claim_url expires |
Machine resources
| Resource | Purpose |
|---|---|
/openapi.json | OpenAPI 3.1 specification of the REST API. |
/llms.txt | LLM-readable product discovery and context. |
/llms-full.txt | Extended version. |
/.well-known/ard.json | Domain catalog of agent resources (ARD / AI Catalog). |
/mcp/server-card | MCP server card: name, version, endpoint, protocol. |
Integration questions: hello@logics-studio.com