Partner reference — endpoint-by-endpoint. Public overview: /developers/api/
Deploy API · v0.1
Request access
Deploy API · Private beta · v0.1

The human layer your agents can call.

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.

Base URL
api.humandeploy.ai/v1
Transport
HTTPS · MCP
Auth
Bearer token
Median handoff
< 45 min
§00.1

Quickstart in one paste.

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.

// claude_desktop_config.json — paste and restart Claude Desktop.
{
  "mcpServers": {
    "humandeploy": {
      "command": "npx",
      "args": ["-y", "humandeploy-mcp"],
      "env": {
        "HUMANDEPLOY_API_KEY": "hd_test_your_key"
      }
    }
  }
}
curl https://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:

Authorization: Bearer hd_live_your_key
HumanDeploy-Version: 2026-04-23
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 standard An expert picked it up. Work hasn't started yet.
in_progress active Expert is working. Updates flow through deployment.in_progress webhooks.
needs_input blocked The expert asked a clarifying question. Reply via POST /deployments/:id/reply or the deployment expires.
completed terminal Output delivered. Full payload on the deployment object. Billing settled.
cancelled terminal Cancelled by the agent or the expert. Partial output may be attached.
expired terminal No 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 required string The plain-English ask. Write it like a DM to a teammate. 2–3 sentences is ideal. The expert reads this first.
skills required array<string> Skill tags to route on. See GET /experts for the catalog. Multiple skills route to the expert who covers the most.
context_url string · URL A URL the expert should read first — the doc, page, thread, or PR under discussion.
context_files array<string> Signed file URLs (expires in 24h). We ingest, extract, and pass to the expert. Max 20 files, 100 MB total.
urgency enum standard (4h median), priority (60 min), or scheduled. Default: standard.
scheduled_for string · ISO 8601 Only with urgency: "scheduled". Must be at least 15 minutes in the future.
metadata object Arbitrary key/value pairs, returned on every webhook. Use it to correlate deployments back to your system's IDs.
webhook_url string · URL Per-deployment override. If absent, we use workspace webhooks from §04.

Example

curl https://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" }
  }'
{
  "id": "dep_01H8R4Y2K7QSG2N5PWTBX6Q3RH",
  "status": "pending",
  "brief": "Review the Q2 launch post...",
  "skills": ["brand-strategy", "copy"],
  "urgency": "priority",
  "sla_deadline": "2026-04-23T19:12:00Z",
  "credits_reserved": 24,
  "expert": null,
  "output": null,
  "metadata": { "campaign_id": "q2-launch", "agent": "wren" },
  "created_at": "2026-04-23T18:12:03Z",
  "updated_at": "2026-04-23T18:12:03Z"
}
GET /v1/deployments/:id

Retrieve a deployment. Poll if you don't want to run webhooks. We recommend at most once every 5 seconds; rate limits punish tighter polling.

Response

Returns the full deployment object. When status = "completed", output is populated with the expert's deliverable:

{
  "id": "dep_01H8R4Y2K7QSG2N5PWTBX6Q3RH",
  "status": "completed",
  "expert": {
    "id": "spec_sarah_m",
    "name": "Sarah M",
    "role": "Brand Strategy"
  },
  "output": {
    "format": "markdown",
    "body": "### Diagnosis\nThe hero leans on 'empower'...",
    "attachments": []
  },
  "credits_charged": 18,
  "duration_seconds": 2612,
  "completed_at": "2026-04-23T18:55:35Z"
}
GET /v1/deployments

List deployments. Paginated by cursor, most recent first.

Query parameters

ParameterTypeDescription
status enum Filter by state. Can repeat: ?status=pending&status=accepted.
skill string Filter by skill tag.
created_after string · ISO 8601 Inclusive lower bound on created_at.
limit integer 1–100. Default 20.
cursor string Opaque 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 required string Your reply. Plain prose. Markdown supported.
context_files array<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.

{
  "data": [
    {
      "id": "spec_sarah_m",
      "name": "Sarah M",
      "role": "Brand Strategy",
      "skills": ["brand-strategy", "copy", "positioning"],
      "tenure_years": 6,
      "median_turnaround_minutes": 52,
      "availability": "online",
      "rate_credits_per_hour": 120
    }
  ],
  "next": null
}
GET /v1/usage

Credit balance, this-cycle burn rate, and deployments count. Poll freely — cached.

{
  "credits_remaining": 1842,
  "credits_reserved": 48,
  "cycle_start": "2026-04-01T00:00:00Z",
  "cycle_end": "2026-05-01T00:00:00Z",
  "deployments_this_cycle": 127,
  "burn_rate_daily": 14.3,
  "forecasted_depletion": "2026-05-08T00:00:00Z"
}
§02

MCP server.

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.

// ~/Library/Application Support/Claude/claude_desktop_config.json  (macOS)
// %APPDATA%\Claude\claude_desktop_config.json             (Windows)
{
  "mcpServers": {
    "humandeploy": {
      "command": "npx",
      "args": ["-y", "humandeploy-mcp"],
      "env": { "HUMANDEPLOY_API_KEY": "hd_live_..." }
    }
  }
}
// .cursor/mcp.json  (repo-local) or ~/.cursor/mcp.json (global)
{
  "mcpServers": {
    "humandeploy": {
      "command": "npx",
      "args": ["-y", "humandeploy-mcp"],
      "env": { "HUMANDEPLOY_API_KEY": "hd_live_..." }
    }
  }
}
// ~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "humandeploy": {
      "command": "npx",
      "args": ["-y", "humandeploy-mcp"],
      "env": { "HUMANDEPLOY_API_KEY": "hd_live_..." }
    }
  }
}

Tools the server exposes

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_specialist POST /deployments Hand a task off to an expert with context. Takes a brief, skills, and optional context_url.
humandeploy.check_deployment GET /deployments/:id Check status. Returns output when complete.
humandeploy.reply_to_deployment POST /deployments/:id/reply Answer an expert's clarifying question so work can resume.
humandeploy.list_specialists GET /experts Show the active bench. Useful when picking skill tags.
humandeploy.get_usage GET /usage Credit balance. The agent can self-gate against a threshold.
Open source
The MCP server is a thin wrapper around the REST API. Source at github.com/humandeploy/humandeploy-mcp. Fork it, pin it, audit it.
§03

Framework integrations.

First-class paths for the stacks agents actually run on. If your stack isn't here, the REST API works everywhere fetch does.

Proposal
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

event when it fires
deployment.accepted An expert picked up the deployment. The deployment now carries an expert object.
deployment.in_progress Work started. Fired once per deployment when the expert begins active work.
deployment.needs_input The expert asked a clarifying question. Reply via POST /deployments/:id/reply within 24h or the deployment expires.
deployment.completed Output delivered. The deployment object now carries output.
deployment.cancelled Cancelled by the agent, the expert, or HumanDeploy ops.
deployment.expired SLA missed (no acceptance in window), or needs_input went unanswered.
usage.threshold_reached Workspace 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.

import crypto from "node:crypto";

function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(
    header.split(",").map((p) => p.split("="))
  );
  const ts = parts.t;
  const sig = parts.v1;

  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${ts}.${rawBody}`)
    .digest("hex");

  return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}
import hmac, hashlib, time

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    ts, sig = parts["t"], parts["v1"]

    if abs(time.time() - int(ts)) > 300:
        return False

    expected = hmac.new(
        secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256
    ).hexdigest()

    return hmac.compare_digest(sig, expected)
HumanDeploy-Signature: t=1714500123,v1=a2c8d7f6e1b4...
HumanDeploy-Event: deployment.completed
HumanDeploy-Delivery: del_01H8R4Y...
HumanDeploy-Idempotency-Key: del_01H8R4Y...

Delivery & retries

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
Requests 1,000 / min 429 on excess. Retry after the Retry-After header.
In-flight deployments 10 concurrent Standard plan. Priority plans lift this. Raise via dashboard or email.
Webhook retries 6 attempts / 11h Then 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"
  }
}
Status Code Meaning
400 invalid_request Body validation failed. The message field names the offending field.
401 authentication_failed Missing, expired, or revoked API key.
402 credits_exhausted Workspace credit balance too low to reserve for this deployment.
404 not_found No deployment / expert / webhook with that ID in your workspace.
409 idempotency_conflict Same Idempotency-Key used with a different request body.
422 expert_unavailable No experts matching the requested skills are currently available. Retry with different skills or relaxed urgency.
429 rate_limited Rate limit hit. Wait Retry-After seconds.
500 internal_error Something broke on our side. Include request_id if you ping us.
503 service_unavailable Maintenance window. Retry-After set.

Idempotency

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.

Request access