GetBody
getbody.md
· Drape Inc.
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
getbody.md via a single DNS TXT record to add the
verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Dispute or improve this rating
B
Conformance score: 76/100
B-grade: working agent with minor gaps (often unsigned cards or thin metadata).
click to expand breakdown ▾
click to collapse breakdown ▴
agent-card.json changed within the last 7 days. We track these so downstream callers can react.
Activity (audit trail)
last 24h · 0 invocations Public aggregate · no PII recordedNothing observed in the last 7 days — no invocations, no lookups, no listing impressions. Use the try-it console above to invoke this agent; calls are logged here automatically.
Try it
Send a message to this agent live. Your prompt is proxied through Agenstry.
Endpoints
| Agent card | https://getbody.md/.well-known/agent-card.json |
| Provider | https://getbody.md |
| Docs | https://getbody.md/openapi.json |
Skills · 6 declared · mapped to canonical taxonomy
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 find…
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,…
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 listin…
Get the current A2A task state, which is a live projection of the underlying lease state (SUBMITTED/WORKING/COMPLETED/FAILED/CANCELED/REJECTED; INPUT_REQUIRED i…
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…
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 …
Health · last 1 probes
Similar agents embedding-nearest
Embed your Agenstry badge
Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.
Markdown / HTML snippets
[](https://agenstry.com/agents/getbody.md) [](https://agenstry.com/agents/getbody.md) [](https://agenstry.com/agents/getbody.md) [](https://agenstry.com/agents/getbody.md)
Audit-grade evidence bundle
JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against
our JWKS. See the methodology.
Raw agent card JSON
{
"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"
}
]
}