{"openapi":"3.1.0","info":{"title":"Rivetplane API","version":"0.1.0","description":"Connect and operate local agent harnesses through an outbound-only runner."},"servers":[{"url":"https://rivetplane.com"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Machines"},{"name":"Harnesses"},{"name":"Sessions"},{"name":"Billing"},{"name":"MCP"}],"paths":{"/v1/machines":{"get":{"tags":["Machines"],"summary":"List paired machines","responses":{"200":{"description":"Machines visible to the token"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/machines/{machine_id}/retire":{"post":{"tags":["Machines"],"summary":"Retire a stale machine","description":"Removes the machine and its sessions from list views without deleting transcript history.","parameters":[{"name":"machine_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Machine retired"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"404":{"description":"Machine not found"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/harness-capabilities":{"get":{"tags":["Harnesses"],"summary":"List reported harness capabilities and model rosters","parameters":[{"name":"machine","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Capability reports"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/machines/{machine_id}/harnesses/{harness}/capabilities":{"get":{"tags":["Harnesses"],"summary":"Get one harness capability report","parameters":[{"name":"machine_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"harness","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Capabilities, directories, and selectable models"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/machines/{machine_id}/harnesses/{harness}/sessions":{"post":{"tags":["Harnesses"],"summary":"Create a session with an explicit reported model","parameters":[{"name":"machine_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"harness","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cwd","model"],"properties":{"cwd":{"type":"string"},"title":{"type":"string"},"model":{"type":"object","required":["provider_id","model_id"],"properties":{"provider_id":{"type":"string"},"model_id":{"type":"string"}}}}}}}},"responses":{"202":{"description":"Creation command accepted"},"400":{"description":"Directory or model was not reported by the harness"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions":{"get":{"tags":["Sessions"],"summary":"List sessions","parameters":[{"name":"machine","in":"query","schema":{"type":"string"}},{"name":"harness","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"cwd","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Sessions visible to the token"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}":{"get":{"tags":["Sessions"],"summary":"Get session detail","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}}],"responses":{"200":{"description":"Session"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"404":{"description":"Session not found"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}/transcript":{"get":{"tags":["Sessions"],"summary":"Get a transcript page","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000}}],"responses":{"200":{"description":"Transcript events and next cursor"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}/transcript/stream":{"get":{"tags":["Sessions"],"summary":"Stream transcript events with SSE","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}}],"responses":{"200":{"description":"text/event-stream","content":{"text/event-stream":{}}},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}/pending":{"get":{"tags":["Sessions"],"summary":"Get the active approval or question","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}}],"responses":{"200":{"description":"Pending interaction or null"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}/messages":{"post":{"tags":["Sessions"],"summary":"Send a user message","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1}}}}}},"responses":{"202":{"description":"Command accepted"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}/pending/respond":{"post":{"tags":["Sessions"],"summary":"Respond to the exact active pending interaction","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pending_id","response"],"properties":{"pending_id":{"type":"string"},"response":{"type":"string"},"scope":{"type":"string","enum":["once","always_this_tool","always_session"]}}}}}},"responses":{"202":{"description":"Response command accepted"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/sessions/{session_id}/interrupt":{"post":{"tags":["Sessions"],"summary":"Interrupt the active turn","description":"The harness can accept this command as a no-op when the session is already idle.","parameters":[{"name":"session_id","in":"path","required":true,"description":"Percent-encoded namespaced session ID: machine/harness/local-session","schema":{"type":"string"}}],"responses":{"202":{"description":"Interrupt command accepted"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}},"/v1/billing/webhook":{"post":{"tags":["Billing"],"summary":"Receive signed Stripe subscription events","security":[],"parameters":[{"name":"Stripe-Signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Event accepted"},"400":{"description":"Signature or payload is not valid"},"503":{"description":"Stripe Billing is not configured"}}}},"/mcp":{"post":{"tags":["MCP"],"summary":"MCP Streamable HTTP endpoint","description":"JSON-RPC endpoint for initialize, tools, and transcript resources.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"JSON-RPC response"},"401":{"description":"Missing or invalid bearer token"},"403":{"description":"Token cannot access the resource"},"409":{"description":"Runner offline, stale pending ID, or invalid state"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"opaque API token"}}}}