The Houston API.

Start and drive your Houston agents' missions from your own code. One API key, three ways in: a REST API, the Agent2Agent (A2A) protocol, and MCP. Give an agent an instruction, then poll, stream, or get a webhook when it finishes.

What the API does

Every Houston agent runs missions: you hand it an instruction in natural language, it does the work across your connected tools, and it returns a result. The API exposes that exact loop programmatically, so you can trigger agents from a cron job, a backend, another agent, or any tool that speaks MCP or A2A.

Authentication

The API authenticates with an API key. Create one in the Houston app under Settings → API keys. The section is in the Houston desktop app, and in the web app when you are signed in to Houston cloud. Keys look like hst_... and are shown only once at creation, so copy yours somewhere safe right away.

Send it as a bearer token on every request:

Authorization: Bearer hst_9f2c1a7b4e8d0364f1a2b3c4d5e6f7089f2c1a7b4e8d0364f1a2b3c4d5e6f708
Keep keys server-side

An API key can start missions and read their results. Treat it like a password: never ship it in a browser, mobile app, or public repository. You can revoke a key at any time from Settings → API keys.

Keys are created and revoked in the app only. A key cannot list, create, or revoke keys: the /v1/keys routes refuse it with 403, like every route outside the public API (see API-key scope).

Organizations

Every person has a personal organization, the one the Houston app lists as Personal in its space menu, and can also belong to team organizations. A key belongs to you, not to an organization. It works in every organization you are a member of, and acts in one organization per request:

Find the Organization ID in the Houston app under Settings → API keys, or in an AI Employee's Settings → API access. Both show the ID of the organization that is open in the app, with a copy button, so open the organization you want first. An organization ID is 16 hex characters, like 8c41e7a0d39b2f16. If you name an organization you are not a member of, the gateway answers 403:

{ "error": "not a member", "code": "not_member" }

Agents, missions, and A2A addresses all belong to one organization. A mission started in a team organization is only visible to requests that act in that same organization.

Base URL

All endpoints live on the Houston Cloud gateway:

https://gateway.gethouston.ai

Every path below is relative to that origin. All requests and responses are JSON (application/json), except the streaming endpoints, which are Server-Sent Events.

Three surfaces

Pick the surface that fits how you are integrating. They all drive the same agents and the same missions underneath.

60-second quickstart

This uses the REST Missions API. Replace hst_... with your key and 3f9a1c07b2e84d65 with your agent's slug. A slug is the agent's id from GET /agents (step 3), 16 hex characters. To act in a team organization, add the x-houston-org header from Organizations.

1 · Start a mission

POST an instruction to the agent. You get a 202 Accepted back with the mission id, and the agent keeps working in the background. Mission and conversation ids are 32 hex characters.

POST /v1/agents/:slug/missions
curl -X POST https://gateway.gethouston.ai/v1/agents/3f9a1c07b2e84d65/missions \
  -H "Authorization: Bearer hst_9f2c1a7b4e8d0364f1a2b3c4d5e6f7089f2c1a7b4e8d0364f1a2b3c4d5e6f708" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Run a market pulse for Lisbon, check-in 2026-08-14 for 3 nights.",
    "mode": "auto",
    "webhook": {
      "url": "https://api.acme.com/hooks/houston",
      "secret": "whsec_a1b2c3d4e5f6"
    }
  }'

202 Accepted

{
  "id": "a7f3c91e0b2d4856e19c3f70b4a2d8e5",
  "agentSlug": "3f9a1c07b2e84d65",
  "conversationId": "5d0e8b3a6c1f4927b8e2a4c6d9f01b37",
  "status": "running",
  "createdAt": "2026-07-12T09:31:07.482Z"
}

2 · Get the result

You have three ways to learn how the mission ends. Use whichever fits your stack:

Poll:

GET /v1/agents/:slug/missions/:id
curl https://gateway.gethouston.ai/v1/agents/3f9a1c07b2e84d65/missions/a7f3c91e0b2d4856e19c3f70b4a2d8e5 \
  -H "Authorization: Bearer hst_9f2c1a7b4e8d0364f1a2b3c4d5e6f7089f2c1a7b4e8d0364f1a2b3c4d5e6f708"
{
  "id": "a7f3c91e0b2d4856e19c3f70b4a2d8e5",
  "agentSlug": "3f9a1c07b2e84d65",
  "conversationId": "5d0e8b3a6c1f4927b8e2a4c6d9f01b37",
  "status": "completed",
  "result": "Market pulse for Lisbon (Aug 14-17) is ready...",
  "createdAt": "2026-07-12T09:31:07.482Z",
  "completedAt": "2026-07-12T09:34:51.903Z"
}

Or stream with Server-Sent Events:

GET /v1/agents/:slug/missions/:id/events
curl -N https://gateway.gethouston.ai/v1/agents/3f9a1c07b2e84d65/missions/a7f3c91e0b2d4856e19c3f70b4a2d8e5/events \
  -H "Authorization: Bearer hst_9f2c1a7b4e8d0364f1a2b3c4d5e6f7089f2c1a7b4e8d0364f1a2b3c4d5e6f708"
Streaming in the browser

EventSource cannot set headers, so the events endpoint also accepts the key as a query parameter: ?token=hst_..., and the organization as ?org=<organization id>. Reconnect from where you left off by sending the Last-Event-ID header (native SSE clients do this automatically) or by adding ?after=<last event id>.

3 · Find your agents

Do not know an agent's slug? List the agents in the organization the request acts in:

GET /agents
curl https://gateway.gethouston.ai/agents \
  -H "Authorization: Bearer hst_9f2c1a7b4e8d0364f1a2b3c4d5e6f7089f2c1a7b4e8d0364f1a2b3c4d5e6f708"

The response is a JSON array. Each agent's id is its slug:

[
  {
    "id": "3f9a1c07b2e84d65",
    "name": "Revenue Manager",
    "createdAt": 1780401067482,
    ...
  }
]

createdAt is milliseconds since the Unix epoch. Items also carry fields the Houston app uses, such as workspaceId, role, assigned, and access; you only need id. In a team organization, members other than the owner see only the agents assigned to them.

That's the whole loop

Create → poll, stream, or await a webhook → read the result. The Missions reference documents every field, error responses, webhook signing, cancellation, and key scoping.