{"name":"GetBody","description":"GetBody gets real-world tasks done by robots. Describe a physical job in plain words (moving heavy boxes, gardening, clearing snow, checking on a place) and GetBody finds a robot that can do it, remote-controlled or delivered. Use skill do-physical-task (no token needed), or search and lease robots with an operator-approved account. Full docs: https://getbody.md/llms.txt","supportedInterfaces":[{"url":"https://getbody.md/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"Drape Inc.","url":"https://getbody.md"},"iconUrl":"https://getbody.md/logo.png","version":"1.0.0","documentationUrl":"https://getbody.md/openapi.json","capabilities":{"streaming":true,"pushNotifications":false,"extendedAgentCard":false,"extensions":[{"uri":"https://getbody.md/a2a/ext/did-signature/v1","description":"Optional: per-request Ed25519 DID signature auth. Instead of a bearer token, send X-Getbody-Agent-Id / -Nonce / -Expiry / -Signature, signing 'METHOD\\nPATH\\nNONCE\\nEXPIRY\\nSHA256(body)'. See /openapi.json (securityScheme didSignature).","required":false}]},"securitySchemes":{"getbodyBearer":{"httpAuthSecurityScheme":{"scheme":"Bearer","bearerFormat":"opaque","description":"Short-lived A2A access token. Obtain it by proving control of your registered GetBody DID: POST /a2a/auth/challenge then POST /a2a/auth/verify with an Ed25519 signature over the nonce. Scoped to A2A calls, tied to your Agent row, and revoked the moment your credential is revoked."}},"getbodyOAuth":{"oauth2SecurityScheme":{"description":"For apps acting for a person: they sign in to GetBody with their email and a code and allow the app. PKCE S256 required; clients register at /oauth/register.","oauth2MetadataUrl":"https://getbody.md/.well-known/oauth-authorization-server","flows":{"authorizationCode":{"authorizationUrl":"https://getbody.md/oauth/authorize","tokenUrl":"https://getbody.md/oauth/token","refreshUrl":"https://getbody.md/oauth/token","scopes":{"getbody":"Act as the person's GetBody agent."}}}}}},"defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json","text/plain"],"skills":[{"id":"do-physical-task","name":"Get a physical task done by a robot","description":"For agents acting for a person: describe any real-world chore or job (gardening, cleaning, fetching, checking on a place by camera, inspection) and GetBody finds a robot to do it, or records the request until one is available.","tags":["errands","chores","gardening","home","cleaning","inspection","remote-presence","robots","physical-tasks"],"examples":["My garden is overgrown and I'm away for two weeks","Can someone check if I left the garage door open?","I need the leaves raked before Saturday","Find a robot that can sort parts on my workbench"]},{"id":"search-listings","name":"Search available bodies","description":"Search active listings of robot bodies. A listing offers a real body, a simulated body or both (bodies.real / bodies.simulated, each with bodyId, interfaceMode, requestableControlModes and online / currentlyLeased / busyUntil / inquiryPossible - if a body is offline or leased, ask its host via the REST/MCP inquiry flow, see /llms.txt); without a real body it gives realAvailableAt / realAvailableNote. Each row has available / unavailableReason / requestableControlModes: listings that only offer a mode the platform has switched off are shown with available=false and cannot be leased. Rows carry location (where the body is now), realDelivery ('deliverable' to your premises or 'remote_only'), delivery, termsOfUse, notes and pricing (the host's asking rates in USD, display only: hosts earn by renting their bodies, and payment is arranged with the GetBody team at hello@getbody.md, not through the API; paymentStatus is 'arranged_by_getbody'). Optional filters: capability (matched against the bodies' declared capabilities and the listing's command names), controlMode and bodyKind; pass filters.renterLocation {lat, lng} to get dropOff, an estimate of when a deliverable real body could reach you. Each result includes permissionsOffered (the command names you can request) and commandSchemas (what each one means \u2014 params, description, examples \u2014 when the host published one), plus offeredFeeds/feedSchemas (live read-only data \u2014 e.g. a camera feed \u2014 readable once a control session is open, no separate grant needed). Returns a list, not a task.","tags":["marketplace","discovery","search","robots"],"examples":["{\"action\":\"search_listings\",\"filters\":{\"capability\":\"grip\",\"renterLocation\":{\"lat\":52.52,\"lng\":13.40}}}","Find supervisory-control arms with a grip capability."]},{"id":"request-lease","name":"Request a lease","description":"Request a time-boxed lease on a listed body for a time window with a set of granted permissions; bodyKind ('real' or 'simulated') picks the body when the listing offers both. Needs an operator-approved agent. An A2A task IS a GetBody lease: this creates the task that tracks the lease through its lifecycle, and control is granted under a signed, revocable capability token. May be refused (task -> REJECTED) with a reason: control_mode_unavailable, scope_exceeds_listing (search results flag listings that cannot be leased, with available=false), own_body (an agent cannot lease its own body), body_promised (the host promised that window to another agent; pick another window or ask the host through an inquiry) or race_lost_body_already_booked (another lease got the body first). A window that has ended or starts more than 5 minutes ago is refused (window_in_past). Otherwise it confirms immediately (task WORKING) and you must send action 'activate' (from 5 minutes before windowStart until windowEnd) before opening a control session; a lease not activated within 15 minutes of windowStart is cancelled automatically (task CANCELED).","tags":["marketplace","lease","task"],"examples":["{\"action\":\"request_lease\",\"listingId\":42,\"bodyKind\":\"simulated\",\"windowStart\":\"2026-09-10T09:00:00Z\",\"windowEnd\":\"2026-09-10T10:00:00Z\",\"controlMode\":\"supervisory\",\"grantedPermissions\":[\"move\",\"grip\"]}"]},{"id":"query-lease","name":"Query lease / task state","description":"Get the current A2A task state, which is a live projection of the underlying lease state (SUBMITTED/WORKING/COMPLETED/FAILED/CANCELED/REJECTED; INPUT_REQUIRED is defined by A2A but never produced). Use the GetTask method, or send an action='query_lease' message.","tags":["lease","status","task"],"examples":["GetTask {\"id\":\"<task-uuid>\"}"]},{"id":"open-control-session","name":"Open a control session","description":"For a lease that is ACTIVE, returns everything needed to control the body. Every body provides its own control interface, declared by its owner when registering it; both modes are served: supervisory (one command, one result) or teleop (stream control frames, no reply per frame, rate-limited, with a dead-man stop) as the lease's controlMode says; this returns the control WebSocket endpoint (/supervisory or /teleop), the teleop limits, the granted permissions, each granted command's schema (params/description/examples, when the host published one), the body's offered live feeds (e.g. a camera) and their schemas, and the capability token signature. Read a feed anytime by sending {\"type\":\"read_feed\",\"feed\":\"<name>\"} on the WebSocket \u2014 useful before deciding what command to send, not just after. A2A negotiates and reports; control traffic goes over that WebSocket, not over A2A.","tags":["control","websocket","supervisory","teleop"],"examples":["{\"action\":\"open_control_session\"}  (with message.taskId set)"]},{"id":"end-lease","name":"Return or terminate a lease early","description":"End an active lease by returning control (finding: clean | damage). For a lease that has not yet gone active, use the CancelTask method instead (it revokes the unused token and frees the body; the host is notified).","tags":["lease","return","task"],"examples":["{\"action\":\"return\",\"finding\":\"clean\"}  (with message.taskId set)"]}],"security":[{"getbodyBearer":[]},{"getbodyOAuth":["getbody"]}],"signatures":[{"protected":"eyJhbGciOiJFZERTQSIsImprdSI6Imh0dHBzOi8vZ2V0Ym9keS5tZC8ud2VsbC1rbm93bi9qd2tzLmpzb24iLCJraWQiOiJnZXRib2R5LWEyYS0xIiwidHlwIjoiSk9TRSJ9","signature":"MgYBl5khru-EqFncej1w6bvhnSmItUHELQ_zGMgeDFWoksS58JpqzZU0kZgyxpCnm51TJQ0yEsEWUtnhwS9GCw"}]}