Overview
Sign a plan at the terms_fingerprint from plan_quote, under the brand terms a person at the brand accepted for this key, and get the Stripe Checkout link the brand or its finance person pays (card or Link up to $10,000, US bank account at any size). Only inside the key's mandate: a refusal names the limit (no mandate, expired, signing not allowed, terms not accepted, channel, plan maximum, monthly cap) and how much over, so you can take it to a person. A plan that changed since the quote is refused with terms_changed: quote again. A plan over the campaign's budget is refused with over_budget and its over_by_cents, always: nobody can approve an overage, the brand included, so remove a creator or ask a person at the brand to raise the budget, then quote again. Signing a signed plan returns its order and resumes payment; it never signs twice. Needs an idempotency_key.
- Server
https://app.distribution.tech/api/mcp- Scope
plans:approve- Changes data
- Yes, pass an idempotency_key
- REST endpoint
- POST /plans/{id}/approve
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
idempotency_key | string | Yes | Your unique id for this request. Retry with the same id and the same arguments to get the same answer; it never runs twice. |
plan_id | string (uuid) | Yes | The plan you quoted with plan_quote. |
terms_fingerprint | string | Yes | The terms_fingerprint from plan_quote. |
Call with curl
The server speaks streamable HTTP, so one JSON-RPC tools/call request runs the tool. Set DISTRIBUTION_API_KEY to a key from Developers with the plans:approve scope; the arguments shown are the required ones.
curl -X POST "https://app.distribution.tech/api/mcp" \
-H "Authorization: Bearer $DISTRIBUTION_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "approve_plan",
"arguments": {
"idempotency_key": "<string>",
"plan_id": "<uuid>",
"terms_fingerprint": "<string>"
}
}
}'Result
The answer's structuredContent follows the tool's output schema (the same JSON is in its text content). It has these fields:
| Name | Type | Required | Description |
|---|---|---|---|
plan_id | string (uuid) | No | |
status | "approved" | No | |
approved_at | string (date-time) | No | |
already_signed | boolean | No | |
order | object or null | No | |
payment | object | No |
{
"plan_id": "<uuid>",
"status": "approved",
"approved_at": "<date-time>",
"already_signed": false,
"order": {},
"payment": {
"next": "checkout",
"pay_url": "<string>",
"options": [
{
"rail": "checkout",
"label": "<string>",
"clears": "<string>"
}
]
}
}Other tools
inventory: Network coverageresolve_audience: Resolve an audiencecampaign_status: Campaign statusevidence: Proof of deliveryresults: Resultsbrain_get: Company contextcreators_search: Find creatorscreator_get: One creatorcreator_ask_price: Ask for a priceplan_quote: Quote a plancreate_campaign: Start a campaignplan_add_creator: Add a creatorplan_remove_creator: Remove a creatorplan_move_dates: Move a plan's datesplan_swap_creator: Swap a creatorset_creator_guidelines: Set the creator guidelinesarchive_campaign: Archive a campaignrename_campaign: Rename a campaigndelete_campaign: Delete a draft campaignfeedback_send: Send feedbackfeedback_list: Your feedback
Get access
Keys are created in Developers once your brand is approved. Connect an agent to ask for access, then read the agent guide for the full flow.