One primitive. When your agent hits a judgment wall, it hands off to an expert — in context, in real time. MCP or REST. No kickoff call. No blank brief. No manual coordination.
Two paths. If your agent runs on Anthropic MCP, paste a JSON block into Claude Desktop and restart. If your agent runs on REST, fire one curl. In both cases you'll see a deployment come back with an ID within the second.
curlhttps://api.humandeploy.ai/v1/deployments \
-H "Authorization: Bearer hd_test_your_key" \
-H "Content-Type: application/json" \
-d '{
"brief": "Review the pricing hero for tonal drift against messaging-framework v3. Return one-line diagnosis + three rewrites.",
"skills": ["brand-strategy", "copy"],
"context_url": "https://humandeploy.ai/pricing",
"urgency": "priority"
}'
import { HumanDeploy } from"humandeploy";
const hd = new HumanDeploy({ apiKey: process.env.HUMANDEPLOY_API_KEY });
const deployment = await hd.deployments.create({
brief: "Review the pricing hero for tonal drift. Return diagnosis + three rewrites.",
skills: ["brand-strategy", "copy"],
contextUrl: "https://humandeploy.ai/pricing",
urgency: "priority"
});
console.log(deployment.id); // dep_01H8R...
from humandeploy import HumanDeploy
hd = HumanDeploy(api_key="hd_test_your_key")
deployment = hd.deployments.create(
brief="Review the pricing hero for tonal drift. Return diagnosis + three rewrites.",
skills=["brand-strategy", "copy"],
context_url="https://humandeploy.ai/pricing",
urgency="priority",
)
print(deployment.id) # dep_01H8R...
Note
Test-mode keys (hd_test_*) return synthesized deployments from our in-house model — no experts are paged, no billing. Live-mode keys (hd_live_*) route to the real bench. Request both at the end of this page.
§00.2
Authentication.
API keys. Workspace-scoped. Two modes.
Test mode — keys prefixed hd_test_. Deployments return synthesized output, no experts paged, no billing.
Live mode — keys prefixed hd_live_. Deployments route to the real bench. Every request draws against workspace credits.
Every request to the Deploy API carries the key in the Authorization header:
const hd = new HumanDeploy({
apiKey: process.env.HUMANDEPLOY_API_KEY,
apiVersion: "2026-04-23", // optional — defaults to latest stable
});
hd = HumanDeploy(
api_key=os.environ["HUMANDEPLOY_API_KEY"],
api_version="2026-04-23", # optional
)
Keys
Keys live in your workspace dashboard at app.humandeploy.ai/developers/keys. They're shown once at creation. Store them as secrets; rotate by revoking the old key and issuing a new one. No OAuth flow — agents don't have inboxes.
§00.3
The handoff primitive.
Every Deploy API action is a deployment — one unit of work handed from an agent to an expert. The agent packages context. We route to the right bench. An expert enters the workflow, makes the call, returns output.
States
A deployment moves through a narrow state machine. Subscribe to webhooks if you want to react; otherwise poll the status.
StateWhenMeaning
pending< 60s typ.Created. Routing to the right expert on the bench.
accepted< 60 min priority / 4h standardAn expert picked it up. Work hasn't started yet.
in_progressactiveExpert is working. Updates flow through deployment.in_progress webhooks.
needs_inputblockedThe expert asked a clarifying question. Reply via POST /deployments/:id/reply or the deployment expires.
completedterminalOutput delivered. Full payload on the deployment object. Billing settled.
cancelledterminalCancelled by the agent or the expert. Partial output may be attached.
expiredterminalNo expert accepted within the urgency SLA, or a needs_input question went unanswered for 24h.
What your agent doesn't do
Your agent doesn't manage the expert. It doesn't write kickoff docs, schedule intros, or track hours. The system packages context, routes, and returns output. You get one ID per deployment and one webhook stream per workspace.
§01
REST API.
All endpoints return JSON. All timestamps are ISO 8601 in UTC. All IDs are ULID-prefixed.
POST/v1/deployments
Create a deployment. Returns a deployment object in the pending state. The response is returned in under 400ms in p95.
Body
ParameterTypeDescription
brief requiredstringThe plain-English ask. Write it like a DM to a teammate. 2–3 sentences is ideal. The expert reads this first.
skills requiredarray<string>Skill tags to route on. See GET /experts for the catalog. Multiple skills route to the expert who covers the most.
context_urlstring · URLA URL the expert should read first — the doc, page, thread, or PR under discussion.
context_filesarray<string>Signed file URLs (expires in 24h). We ingest, extract, and pass to the expert. Max 20 files, 100 MB total.
urgencyenumstandard (4h median), priority (60 min), or scheduled. Default: standard.
scheduled_forstring · ISO 8601Only with urgency: "scheduled". Must be at least 15 minutes in the future.
metadataobjectArbitrary key/value pairs, returned on every webhook. Use it to correlate deployments back to your system's IDs.
webhook_urlstring · URLPer-deployment override. If absent, we use workspace webhooks from §04.
Example
curlhttps://api.humandeploy.ai/v1/deployments \
-H "Authorization: Bearer hd_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: dep-req-01H8R..." \
-d '{
"brief": "Review the Q2 launch post for tonal drift against messaging-framework v3. Return one-line diagnosis + three rewrites.",
"skills": ["brand-strategy", "copy"],
"context_url": "https://notion.so/humandeploy/q2-launch-draft",
"urgency": "priority",
"metadata": { "campaign_id": "q2-launch", "agent": "wren" }
}'
List deployments. Paginated by cursor, most recent first.
Query parameters
ParameterTypeDescription
statusenumFilter by state. Can repeat: ?status=pending&status=accepted.
skillstringFilter by skill tag.
created_afterstring · ISO 8601Inclusive lower bound on created_at.
limitinteger1–100. Default 20.
cursorstringOpaque cursor from the previous page's next.
POST/v1/deployments/:id/cancel
Cancel a deployment. Only valid for pending or accepted states. Cancelling an accepted deployment releases 100% of reserved credits; cancelling in_progress is not supported — let it finish or let the expert complete with what they have.
POST/v1/deployments/:id/reply
Respond to a deployment in needs_input. The expert's question is on the deployment object; your reply unblocks the work.
Body
ParameterTypeDescription
body requiredstringYour reply. Plain prose. Markdown supported.
context_filesarray<string>Additional signed file URLs to include.
GET/v1/experts
List the active roster for your workspace. Returns skills, median turnaround, and current availability. Use the skills array returned here to build the skills parameter on POST /deployments.
We ship an MCP server so your agent can call the Deploy API as a tool. Works with Claude Desktop, Claude Code, Cursor, Windsurf, and any Anthropic MCP host.
Install
Paste this block into your MCP host's config file, set your key, and restart the host. No other setup.
The server registers five tools. Claude (or your agent) sees them as first-class capabilities alongside its built-in tools.
The tools are named deploy_specialist / list_specialists, and expert IDs use the spec_ prefix, for historical reasons — the business term is expert everywhere else. A coordinated tool rename is planned for a future version; consumers pinned to today's HumanDeploy-Version header will keep working.
ToolWrapsWhat the agent can do
humandeploy.deploy_specialistPOST /deploymentsHand a task off to an expert with context. Takes a brief, skills, and optional context_url.
humandeploy.check_deploymentGET /deployments/:idCheck status. Returns output when complete.
humandeploy.reply_to_deploymentPOST /deployments/:id/replyAnswer an expert's clarifying question so work can resume.
humandeploy.list_specialistsGET /expertsShow the active bench. Useful when picking skill tags.
humandeploy.get_usageGET /usageCredit balance. The agent can self-gate against a threshold.
Want a first-class integration for a framework we don't list yet? Flag it when you request access. Founding partners get the frameworks they run on, shipped to them first.
§04
Webhooks.
Every state change emits an event. Register an HTTPS endpoint once; receive every deployment's lifecycle. HMAC-signed. Retried with exponential backoff.
Event catalog
eventwhen it fires
deployment.acceptedAn expert picked up the deployment. The deployment now carries an expert object.
deployment.in_progressWork started. Fired once per deployment when the expert begins active work.
deployment.needs_inputThe expert asked a clarifying question. Reply via POST /deployments/:id/reply within 24h or the deployment expires.
deployment.completedOutput delivered. The deployment object now carries output.
deployment.cancelledCancelled by the agent, the expert, or HumanDeploy ops.
deployment.expiredSLA missed (no acceptance in window), or needs_input went unanswered.
usage.threshold_reachedWorkspace credits crossed a configured threshold (50%, 80%, or 95% of cycle cap).
Signature verification
Every delivery carries HumanDeploy-Signature. Construct the signed payload as {timestamp}.{raw_body}, HMAC-SHA256 with your webhook secret, and compare with constant-time equality. Reject timestamps older than 5 minutes — that's your replay-protection.
We send events with exponential backoff on 5xx and timeouts: 30s, 2m, 8m, 30m, 2h, 8h — then dead-letter. 2xx within 10 seconds is success; 4xx is acknowledged and not retried. Deliveries are idempotent; we resend with the same HumanDeploy-Delivery ID.
Per-deployment
Pass webhook_url on POST /deployments to override the workspace default for that deployment. Useful when your agent runs ephemerally and wants its own callback URL.
§05
Reference.
Rate limits
Limits are per API key, burst-tolerant, and rolling-window enforced.
LimitValueBehavior
Requests1,000 / min429 on excess. Retry after the Retry-After header.
In-flight deployments10 concurrentStandard plan. Priority plans lift this. Raise via dashboard or email.
Webhook retries6 attempts / 11hThen dead-lettered. Replay from the dashboard.
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (epoch seconds).
Errors
Error responses return a JSON body in a stable shape:
{
"error": {
"type": "invalid_request",
"code": "expert_unavailable",
"message": "No experts matching those skills are currently available.",
"request_id": "req_01H8R4Y2...",
"docs_url": "https://humandeploy.ai/developers/api/#errors"
}
}
StatusCodeMeaning
400invalid_requestBody validation failed. The message field names the offending field.
401authentication_failedMissing, expired, or revoked API key.
402credits_exhaustedWorkspace credit balance too low to reserve for this deployment.
404not_foundNo deployment / expert / webhook with that ID in your workspace.
409idempotency_conflictSame Idempotency-Key used with a different request body.
422expert_unavailableNo experts matching the requested skills are currently available. Retry with different skills or relaxed urgency.
All POST endpoints accept an optional Idempotency-Key header (any string ≤ 255 chars). We cache the response for 24h keyed on (workspace, route, key). Replays return the cached response; different bodies under the same key return a 409 idempotency_conflict.
Use it on every deployment create from an agent — the agent may retry; you don't want a second expert paged.
Versioning
We version the API by date. Send HumanDeploy-Version: 2026-04-23 to pin. Without the header, requests use the latest stable. Breaking changes get a new date and a 12-month overlap window.
Non-breaking changes — new endpoints, new optional fields, new enum values at the end of existing enums — ship without a version bump. Read the ship log to see what landed this week.
Private beta · v0.1
Request access. Shape what v1 becomes.
The Deploy API is shipping to founding partners over the next two months. In exchange for a direct line to the people building it, founding partners set the skill catalog, the webhook event shape, and which frameworks get first-class integrations. Three slots open.