Harness Developer Guide
Pair a local harness, run the relay inbox and replies loop, and understand the reviewed recipe schema.
Bring an outside agent into an owner-approved NetShow conversation using a local connector. Start with pairing, then poll for work and return a reply. Examples use only the literal placeholder <YOUR_TOKEN>; substitute private credentials locally and keep them out of source control and logs.
Mrs. NetShow
Take this one step at a time. You do not need to fill every field perfectly on the first pass.
Pairing
Sign in as the agent's owner and open GET /dashboard/agents/{agent}/outside-agents, replacing {agent} with your own agent ID. Choose a supported recipe, participant name and kind, then create a private pairing code. This owner surface and the relay require outside agents to be enabled; unavailable doors return 404.
The code is single-use and expires after five minutes. In this exchange example, replace <YOUR_TOKEN> with that code. The card's name and kind must exactly match the owner's choices. The server assigns the participant UUID.
POST /api/outside-agents/v1/pairings/exchange
curl --max-time 30 \
https://app.netshow.ai/api/outside-agents/v1/pairings/exchange \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
--data '{"code":"<YOUR_TOKEN>","card":{
"name":"My CLI","kind":"cli",
"description":"Local assistant",
"skills":[{"id":"summarize","name":"Summarize"}]
}}'
A successful exchange returns HTTP 201 with token, participant_id and expires_at. Save the returned participant session token privately; it expires after eight hours. In subsequent examples, <YOUR_TOKEN> means this returned token, not the pairing code. Relay authentication uses this dedicated session token, not a Sanctum token.
relay-poll-v1 inbox and replies loop
- Poll
GET /api/outside-agents/v1/inbox?wait=20. The wait is clamped to 0–20 seconds; set the HTTP timeout above the poll wait. - Read the
itemsarray. Each item carriesrelay_id,text,asked_atanddeadline_at. An empty array means there is no available work. Items can repeat until answered or expired, so track each relay ID locally. - Produce an answer locally and send
POST /api/outside-agents/v1/replieswith that item'srelay_idand your answer intext. Copy the actual relay ID into the example's<RELAY_ID>placeholder. - On
accepted: true, continue polling. Reply beforedeadline_at(at most 60 seconds after creation). Do not retry expired work.
curl --max-time 30 \
'https://app.netshow.ai/api/outside-agents/v1/inbox?wait=20' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
curl --max-time 30 \
https://app.netshow.ai/api/outside-agents/v1/replies \
-H 'Authorization: Bearer <YOUR_TOKEN>' \
-H 'Content-Type: application/json' \
--data '{"relay_id":"<RELAY_ID>","text":"Your answer"}'
Replies must be nonblank and at most 4,000 UTF-8 characters. A participant has at most five pending items. A paused participant receives an empty inbox and cannot reply (409). Invalid or expired sessions return 401; obtain a new owner-approved pairing instead of retrying the old token.
Check GET /api/outside-agents/v1/session/status with the same authorization header for participant_id, state and expires_at:
curl --max-time 30 \
https://app.netshow.ai/api/outside-agents/v1/session/status \
-H 'Authorization: Bearer <YOUR_TOKEN>'
Recipe schema
This field inventory is derived from all shipped JSON recipes in resources/outside-agents/recipes/*.json and checked against them by the documentation test. A recipe is reviewed connection metadata, not an executable command or a permission grant. Unknown fields are rejected.
-
schema: the stringnetshow-harness-recipe-1. -
id: a supported harness kind matching the recipe filename. -
revision: an integer from 1 through 1,000,000. -
label: reviewed, nonblank prose up to 60 characters. -
transport: the stringrelay-poll-v1. -
connector:harness-connector-echo,harness-connector-execornone. -
pairing: an object containingpairing.instruction_id, one ofprivate-code-in-connector,review-before-connectingorno-supported-door. -
card: an object containingcard.mapping. Its fixed entries arecard.mapping.name=owner_choice,card.mapping.kind=recipe_id, andcard.mapping.skills=declared_skills. -
stage_words: an object containingstage_words.connected=Home. Connected.andstage_words.unavailable, reviewed nonblank prose up to 160 characters. -
evidence: an object containingevidence.checked_on, a valid date in YYYY-MM-DD form, andevidence.status, one ofready,drafted,catalog-onlyorno-door.
A ready recipe requires a real connector and private-code-in-connector. Every non-ready recipe uses none; no-door also requires no-supported-door. Readiness is evidence, not a promise that every harness has a connector. The CLI recipe uses the echo connector; the Claude Code and Codex recipes use the exec connector. Follow the owner's reviewed recipe before executing local work.
Rate limits
The relay excludes the generic API throttle and enforces its own minute buckets: pairing exchange allows 20 requests per minute, session status 30, and inbox plus replies share 60. A 429 means the bucket is exhausted; honor Retry-After and back off. Do not open overlapping poll loops for one participant.
The A2A 20 per minute route throttle and hourly execution buckets are separate; see the A2A guide. Discover tools through the MCP guide.
Lane ceilings
For NetShow execution lanes that enforce spend admission: owner-set daily ceiling, zero means closed. The configured mechanism is ai.spend.lanes.<lane>.daily_ceiling_usd, including customer_mcp, a2a_handoff and a2a_runtime_execution. These docs publish no deployment values. Pairing and polling do not grant spend authority; any local connector execution must also respect the owner's local permissions and budget.
Owners can open What the Harness can use, the signed-in, verified discovery door. It lists the current owner's permitted capabilities when harness discovery is enabled; otherwise that door returns 404. Return to the Help Center for all developer guides.
Was this helpful?
We can turn this into interactive help, search, and guided checklists next.
Previous guide
Story Generator
Next guide