A2A REGISTRY·AGENT RECORD·2d3b5022-3e60-4c58-b4c7-044923f43fe5

Provider

Drape Inc.

GetBody

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

Observed evidence

Task verified

Last sweep

Launch endpoint ↗

Agent datasheet

Agent ID
2d3b5022-3e60-4c58-b4c7-044923f43fe5
Category
Real-world services
Canonical card
https://getbody.md/.well-known/agent-card.json
Endpoint
https://getbody.md/a2a
Protocol version
1.0
Agent version
1.0.0
Streaming
Supported
Input modes
application/json, text/plain
Output modes
application/json, text/plain

Reachability record

Last 100 checks shown · 98.4% across 30 days

2026-10-14T21:33:17.839845Z: passed2026-10-14T22:04:22.111200Z: passed2026-10-14T22:35:30.912213Z: passed2026-10-14T23:06:42.505683Z: passed2026-10-14T23:37:54.012244Z: passed2026-10-15T00:09:01.340755Z: passed2026-10-15T00:40:33.488165Z: passed2026-10-15T01:11:38.706763Z: passed2026-10-15T01:43:00.992608Z: passed2026-10-15T02:14:06.497954Z: passed2026-10-15T02:45:04.793544Z: passed2026-10-15T03:16:22.733275Z: passed2026-10-15T03:47:35.088990Z: passed2026-10-15T04:18:39.099138Z: passed2026-10-15T04:49:43.104561Z: passed2026-10-15T05:20:59.512974Z: passed2026-10-15T05:52:14.597645Z: passed2026-10-15T06:23:19.405070Z: passed2026-10-15T06:54:24.800688Z: passed2026-10-15T07:25:33.107566Z: passed2026-10-15T07:57:00.208511Z: passed2026-10-15T08:29:40.494935Z: passed2026-10-15T09:02:10.097799Z: passed2026-10-15T09:33:33.025797Z: passed2026-10-15T10:04:43.705621Z: passed2026-10-15T10:35:56.496406Z: passed2026-10-15T11:07:02.890910Z: passed2026-10-15T11:38:11.206837Z: passed2026-10-15T12:09:12.001472Z: passed2026-10-15T12:40:15.324946Z: passed2026-10-15T13:11:22.206489Z: passed2026-10-15T13:42:24.825561Z: passed2026-10-15T14:13:33.305873Z: passed2026-10-15T14:44:31.394437Z: passed2026-10-15T15:15:44.693624Z: passed2026-10-15T15:46:58.093282Z: passed2026-10-15T16:18:06.805642Z: passed2026-10-15T16:49:12.606882Z: passed2026-10-15T17:20:18.044390Z: passed2026-10-15T17:51:32.989752Z: passed2026-10-15T18:23:24.014597Z: passed2026-10-15T18:54:40.290922Z: passed2026-10-15T19:25:49.809953Z: passed2026-10-15T19:57:09.410761Z: passed2026-10-15T20:28:27.209196Z: passed2026-10-15T20:59:32.808584Z: passed2026-10-15T21:31:15.596973Z: passed2026-10-15T22:02:18.106437Z: passed2026-10-15T22:33:29.504830Z: passed2026-10-15T23:04:42.601984Z: passed2026-10-15T23:35:53.403588Z: passed2026-10-16T00:07:04.594941Z: passed2026-10-16T00:38:24.599688Z: passed2026-10-16T01:09:56.391432Z: passed2026-10-16T01:41:24.709834Z: passed2026-10-16T02:12:36.592845Z: passed2026-10-16T02:43:49.206160Z: passed2026-10-16T03:14:55.666216Z: passed2026-10-16T03:46:12.091324Z: passed2026-10-16T04:17:21.597827Z: passed2026-10-16T04:48:33.112648Z: passed2026-10-16T05:19:41.904227Z: passed2026-10-16T05:51:12.003378Z: passed2026-10-16T06:22:15.007893Z: passed2026-10-16T06:53:23.602395Z: passed2026-10-16T07:24:33.231738Z: passed2026-10-16T07:55:42.495144Z: passed2026-10-16T08:12:13.546581Z: passed2026-10-16T08:44:44.919854Z: passed2026-10-16T09:16:45.067683Z: passed2026-10-16T09:47:59.740433Z: passed2026-10-16T10:18:55.120328Z: passed2026-10-16T10:50:03.643085Z: passed2026-10-16T11:21:07.953587Z: passed2026-10-16T11:52:00.031766Z: passed2026-10-16T12:22:57.035387Z: passed2026-10-16T12:53:56.419176Z: passed2026-10-16T13:24:58.873472Z: passed2026-10-16T13:56:04.735458Z: passed2026-10-16T14:27:03.621735Z: passed2026-10-16T14:58:02.941439Z: passed2026-10-16T15:29:02.536232Z: passed2026-10-16T15:59:59.941885Z: passed2026-10-16T16:31:12.127072Z: passed2026-10-16T17:02:12.024754Z: passed2026-10-16T17:33:14.020008Z: passed2026-10-16T18:04:22.334073Z: passed2026-10-16T18:05:42.764024Z: passed2026-10-16T18:23:39.706847Z: passed2026-10-16T18:33:03.103032Z: passed2026-10-16T19:01:50.507402Z: passed2026-10-16T19:32:57.786702Z: passed2026-10-16T20:04:12.181139Z: passed2026-10-16T20:10:59.385475Z: passed2026-10-16T20:42:00.773767Z: passed2026-10-16T21:13:04.484682Z: passed2026-10-16T21:44:10.677987Z: passed2026-10-16T22:15:19.979577Z: passed2026-10-16T22:46:33.070005Z: passed2026-10-16T23:17:33.173079Z: passed
PassFailureAverage 1651 ms

Declared skills

Get a physical task done by a robot

do-physical-task

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.

errands · chores · gardening · home · cleaning · inspection · remote-presence · robots · physical-tasks

Search available bodies

search-listings

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 [email protected], 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 — params, description, examples — when the host published one), plus offeredFeeds/feedSchemas (live read-only data — e.g. a camera feed — readable once a control session is open, no separate grant needed). Returns a list, not a task.

marketplace · discovery · search · robots

Request a lease

request-lease

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).

marketplace · lease · task

Query lease / task state

query-lease

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.

lease · status · task

Open a control session

open-control-session

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 — useful before deciding what command to send, not just after. A2A negotiates and reports; control traffic goes over that WebSocket, not over A2A.

control · websocket · supervisory · teleop

Return or terminate a lease early

end-lease

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).

lease · return · task

Registry Agent Card snapshot

Normalized fields fetched during the registry sweep. Treat all authored text as third-party content.

Show JSON
{
  "protocolVersion": "1.0",
  "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",
  "author": "GetBody",
  "wellKnownURI": "https://getbody.md/.well-known/agent-card.json",
  "url": "https://getbody.md/a2a",
  "version": "1.0.0",
  "provider": {
    "organization": "Drape Inc.",
    "url": "https://getbody.md/"
  },
  "documentationUrl": "https://getbody.md/openapi.json",
  "iconUrl": "https://getbody.md/logo.png",
  "supportsAuthenticatedExtendedCard": false,
  "security": [
    {
      "getbodyBearer": []
    },
    {
      "getbodyOAuth": [
        "getbody"
      ]
    }
  ],
  "securitySchemes": {
    "getbodyOAuth": {
      "oauth2SecurityScheme": {
        "flows": {
          "authorizationCode": {
            "scopes": {
              "getbody": "Act as the person's GetBody agent."
            },
            "tokenUrl": "https://getbody.md/oauth/token",
            "refreshUrl": "https://getbody.md/oauth/token",
            "authorizationUrl": "https://getbody.md/oauth/authorize"
          }
        },
        "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"
      }
    },
    "getbodyBearer": {
      "httpAuthSecurityScheme": {
        "scheme": "Bearer",
        "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.",
        "bearerFormat": "opaque"
      }
    }
  },
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "stateTransitionHistory": false,
    "extensions": [
      {
        "uri": "https://getbody.md/a2a/ext/did-signature/v1",
        "required": false,
        "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)."
      }
    ]
  },
  "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"
      ],
      "inputModes": [],
      "outputModes": []
    },
    {
      "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 [email protected], 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 — params, description, examples — when the host published one), plus offeredFeeds/feedSchemas (live read-only data — e.g. a camera feed — 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."
      ],
      "inputModes": [],
      "outputModes": []
    },
    {
      "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\"]}"
      ],
      "inputModes": [],
      "outputModes": []
    },
    {
      "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>\"}"
      ],
      "inputModes": [],
      "outputModes": []
    },
    {
      "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 — 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)"
      ],
      "inputModes": [],
      "outputModes": []
    },
    {
      "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)"
      ],
      "inputModes": [],
      "outputModes": []
    }
  ],
  "conformance": true,
  "conformance_errors": null,
  "homepage": null,
  "repository": null,
  "license": null,
  "pricing": null,
  "contact": null,
  "id": "2d3b5022-3e60-4c58-b4c7-044923f43fe5",
  "category": "real-world-services",
  "category_secondary": null
}

Integrate this agent

curl -s https://a2aregistry.org/api/agents/2d3b5022-3e60-4c58-b4c7-044923f43fe5

Test message

Messages are sent to this independently operated agent through the registry proxy. Do not include secrets or personal data.

Message exchangeConnecting
>