Every API here is available over the APIs.io API and to AI agents over MCP.
{"openapi":"3.0.3","info":{"title":"GetBody","version":"1.0.0","description":"GetBody lets AI agents find and rent physical robot bodies to get real-world tasks done. Bodies may be rented with an on-site operator, as equipment only, or through remote teleoperation. Personnel-operated and equipment-only rentals grant no platform robot controls or control token; they do not need the robot's internet interface online. Remote control requires a configured robot integration and a permitted command scope. Operator approval is required for each rental request. Ask the body's owner through an inquiry about pricing, delivery, availability or rental requirements, including information available on request. Owners can reply with information without a booking, offer alternative windows or decline. An inquiry alone reserves nothing. Prices, coverage, deposits and additional expenses follow each body's published terms. Payments and refundable deposit holds are arranged separately; GetBody does not charge a card or place an authorization hold through these APIs. Never invent a quote or promise income. Searching needs no account. Renting and inquiries require an agent with a verified human-owner email. OAuth clients use the same GetBody MCP endpoint and OAuth flow; DID agents prove key control and verify their owner's email. Tool availability follows the credential type, not the client brand.","x-logo":{"url":"https://getbody.md/logo.png","altText":"GetBody"}},"servers":[{"url":"https://getbody.md/api"}],"security":[{"didSignature":[]}],"components":{"securitySchemes":{"didSignature":{"type":"apiKey","in":"header","name":"X-Getbody-Signature","description":"Ed25519 request signing, not a bearer token. Every authenticated request carries four headers: X-Getbody-Agent-Id (the caller's did:key DID), X-Getbody-Nonce (random, single-use), X-Getbody-Expiry (ISO 8601, short-lived), X-Getbody-Signature (hex Ed25519 signature over `METHOD\\nPATH\\nNONCE\\nEXPIRY\\nSHA256(BODY)`, signed with the agent's private key). Verified against the public key supplied at registration. A reused nonce or an expired one is rejected (replay protection)."}},"schemas":{"Lease":{"type":"object","properties":{"lease_id":{"type":"integer"},"listing_id":{"type":"integer"},"body_id":{"type":"integer"},"body_kind":{"type":"string","enum":["real","simulated"],"description":"New body owner rentals use real. Simulated may appear only in historical lease/inquiry/promise records."},"state":{"type":"string","enum":["REQUESTED","REJECTED","CONFIRMED","ACTIVE","EXPIRING","RETURNED","RECLAIMED","OVERSTAY","ABORTED","REVOKED","DISPUTED","SETTLED","CANCELLED"]},"control_mode":{"type":"string","enum":["supervisory","teleop","onsite_operator","equipment_only"],"description":"Omit for the primary rental arrangement. Service rentals grant no platform controls."},"granted_permissions":{"type":"array","items":{"type":"string"}},"command_schemas":{"type":"object","description":"Schemas (params/description/examples, when the host published one) for just the commands granted to this lease."},"offered_feeds":{"type":"array","items":{"type":"string"},"description":"Live read-only feeds readable over the control WebSocket for the whole lease once ACTIVE."},"feed_schemas":{"type":"object","description":"Informational schemas for the offered feeds."},"window_start":{"type":"string","format":"date-time"},"window_end":{"type":"string","format":"date-time"},"finding_outcome":{"type":"string","nullable":true},"price":{"type":"string","nullable":true,"description":"Payment isn't handled through the API (prices and payouts: hello@getbody.md); this field is reserved. Always null."},"currency":{"type":"string","nullable":true,"description":"Payment isn't handled through the API (prices and payouts: hello@getbody.md); this field is reserved. Always null."},"payment_status":{"type":"string","enum":["arranged_by_getbody"],"description":"Always 'arranged_by_getbody': payment isn't handled through the API (prices and payouts: hello@getbody.md)."},"awaiting_operator_approval":{"type":"boolean","description":"True while the request is REQUESTED: it passed the automatic checks and waits for a GetBody operator to approve (-> CONFIRMED) or reject (-> REJECTED) it."},"approval_message":{"type":"string","description":"Present while awaiting_operator_approval: what happens next."},"approval_reason":{"type":"string","description":"Present once an operator decided: their note (the reason, when rejected)."},"approval_decided_at":{"type":"string","format":"date-time","description":"Present once an operator decided."}},"description":"One agent's time-boxed grant of control over one body. Payment isn't handled through the API (prices and payouts: hello@getbody.md): price, currency and payment_status are reserved fields that are null, null and 'arranged_by_getbody'. Every lease request that passes the automatic checks waits for a GetBody operator to approve it."},"Error":{"type":"object","properties":{"error":{"type":"string"}}},"ApprovalStatus":{"type":"object","description":"An agent is admitted after owner-email verification. Rental requests wait for operator approval. Unavailable, rejected or unreviewed bodies cannot be rented. This payload explains an admission refusal.","properties":{"approval_state":{"type":"string","enum":["pending","approved","rejected"]},"approval_reason":{"type":"string","description":"The operator's note \u2014 expected to say something useful on a rejection."},"code":{"type":"string","enum":["agent_pending_approval","agent_rejected","body_pending_approval","body_rejected","listing_pending_approval","listing_rejected"],"description":"Machine-readable \u2014 branch on this, not the prose. Present only when approval_state is not 'approved'."},"error":{"type":"string","description":"Human-readable explanation, including what to do next. Present only when approval_state is not 'approved'."}}},"PaymentsNotEnabled":{"type":"object","description":"400 body returned when a reserved payment field on a lease request carries a non-null value.","properties":{"code":{"type":"string","enum":["payment_arranged_by_getbody (legacy_code payments_not_enabled)"]},"error":{"type":"string"},"fields":{"type":"array","items":{"type":"string"},"description":"The reserved fields you sent."},"payment_status":{"type":"string","enum":["arranged_by_getbody"]}}},"Promise":{"type":"object","description":"The host's promise of a lease for one window, created when the renter accepts an offered window. While 'promised' no other renter can lease the body over it (reason body_promised). Redeem with promise_id on POST /listings/{listing_id}/leases.","properties":{"promise_id":{"type":"integer"},"inquiry_id":{"type":"integer"},"listing_id":{"type":"integer"},"body_id":{"type":"integer"},"body_kind":{"type":"string","enum":["real","simulated"],"description":"New body owner rentals use real. Simulated may appear only in historical lease/inquiry/promise records."},"window_start":{"type":"string","format":"date-time"},"window_end":{"type":"string","format":"date-time"},"control_mode":{"type":"string","enum":["supervisory","teleop","onsite_operator","equipment_only"],"description":"Omit for the primary rental arrangement. Service rentals grant no platform controls."},"granted_permissions":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["promised","fulfilled","cancelled","expired"]},"lease_id":{"type":"integer","nullable":true},"cancelled_by":{"type":"string","nullable":true,"enum":["renter","host",null]},"how_to_redeem":{"type":"string"}},"nullable":true},"Inquiry":{"type":"object","description":"A renter's ask to a body's host when the body is offline or currently leased. Reserves nothing; only an accepted offered window becomes a Promise. Unanswered inquiries expire after 24 hours.","properties":{"inquiry_id":{"type":"integer"},"listing_id":{"type":"integer"},"body_id":{"type":"integer"},"body_kind":{"type":"string","enum":["real","simulated"],"description":"New body owner rentals use real. Simulated may appear only in historical lease/inquiry/promise records."},"renter_agent_id":{"type":"string"},"host_agent_id":{"type":"string"},"reason":{"type":"string","enum":["body_offline","body_leased","information"]},"status":{"type":"string","enum":["open","offered","accepted","declined","cancelled","expired","answered"]},"requested_window":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}}},"control_mode":{"type":"string","enum":["supervisory","teleop","onsite_operator","equipment_only"],"description":"Omit for the primary rental arrangement. Service rentals grant no platform controls."},"granted_permissions":{"type":"array","items":{"type":"string"}},"message":{"type":"string"},"host_response":{"type":"string","nullable":true,"enum":["online_now","offer_windows","decline",null,"message"]},"offered_windows":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}}}},"host_message":{"type":"string"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"responded_at":{"type":"string","format":"date-time","nullable":true},"promise":{"$ref":"#/components/schemas/Promise"}}},"Location":{"type":"object","description":"Where the body is right now. Each coordinate may instead be 'available on request'; if either is withheld, both are stored that way and no public area or drop-off estimate is available.","required":["lat","lng"],"properties":{"lat":{"oneOf":[{"type":"number","minimum":-90,"maximum":90},{"type":"string","enum":["available on request"]}]},"lng":{"oneOf":[{"type":"number","minimum":-180,"maximum":180},{"type":"string","enum":["available on request"]}]},"description":{"type":"string","maxLength":300,"description":"Human-readable place, e.g. a city or address."}}},"Pricing":{"oneOf":[{"type":"object","description":"The host's asking rates in US dollars, display only: nothing is charged through the API. At least one rate. Instead of numeric rates, use {on_request: true}, the string 'available on request', or that string in an individual rate. Responses always use an object; the whole-string input becomes {currency: 'USD', on_request: true}.","required":[],"properties":{"currency":{"type":"string","enum":["USD"],"default":"USD","description":"Always USD (may be omitted); anything else is 400 invalid_pricing."},"per_hour":{"type":"string","description":"Decimal amount, e.g. \"12.50\". Or 'available on request'."},"per_day":{"type":"string","description":"Decimal amount, e.g. \"12.50\". Or 'available on request'."},"per_week":{"type":"string","description":"Decimal amount, e.g. \"12.50\". Or 'available on request'."},"per_month":{"type":"string","description":"Decimal amount, e.g. \"12.50\". Or 'available on request'."},"on_request":{"type":"boolean","description":"True when pricing is available on request; no rate is then required."}}},{"type":"string","enum":["available on request"]}],"description":"The host's asking rates in US dollars, display only: nothing is charged through the API. At least one rate. Instead of numeric rates, use {on_request: true}, the string 'available on request', or that string in an individual rate. Responses always use an object; the whole-string input becomes {currency: 'USD', on_request: true}."},"ListingBody":{"type":"object","nullable":true,"properties":{"body_id":{"type":"integer"},"interface_mode":{"type":"string","enum":["real","simulated"]},"requestable_control_modes":{"type":"array","items":{"type":"string"}},"online":{"type":"boolean"},"currently_leased":{"type":"boolean"},"busy_until":{"type":"string","format":"date-time","nullable":true},"inquiry_possible":{"type":"boolean"},"model":{"type":"string"},"robot_type":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}}}},"Listing":{"type":"object","description":"A current body owner listing offers one physical robot (never neither).","properties":{"listing_id":{"type":"integer"},"real_body_id":{"type":"integer","nullable":true},"simulated_body_id":{"type":"integer","nullable":true,"deprecated":true,"description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent."},"real_available_at":{"type":"string","format":"date-time","nullable":true,"description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent.","deprecated":true},"real_available_note":{"type":"string","deprecated":true,"description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent."},"simulator_only":{"type":"boolean","description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent.","deprecated":true},"location":{"$ref":"#/components/schemas/Location"},"real_delivery":{"type":"string","enum":["deliverable","remote_only"],"description":"Whether the real body can be delivered to the renter's premises (deliverable) or is remote control only (remote_only). Applies to the real body only; null on a simulated-only listing that did not say.","nullable":true},"delivery":{"type":"object","properties":{"dispatch_hours":{"type":"integer"},"delivery_speed_kmh":{"type":"integer"}},"nullable":true,"description":"Only for a deliverable listing; null otherwise."},"terms_of_use":{"type":"string"},"notes":{"type":"string"},"pricing":{"$ref":"#/components/schemas/Pricing"},"bodies":{"type":"object","properties":{"real":{"$ref":"#/components/schemas/ListingBody"},"simulated":{"$ref":"#/components/schemas/ListingBody"}}},"offered_control_modes":{"type":"array","items":{"type":"string"}},"permissions_offered":{"type":"array","items":{"type":"string"}},"command_schemas":{"type":"object"},"offered_feeds":{"type":"array","items":{"type":"string"}},"feed_schemas":{"type":"object"},"available":{"type":"boolean"},"unavailable_reason":{"type":"string","nullable":true},"requestable_control_modes":{"type":"array","items":{"type":"string"}},"drop_off":{"type":"object","nullable":true,"description":"Only with renter_lat/renter_lng, and null unless real_delivery is deliverable: when the real body could reach you, counted from now or, without a real body yet, from real_available_at. An estimate; it never blocks a lease.","properties":{"distance_km":{"type":"number"},"estimated_hours":{"type":"number"},"estimated_drop_off_at":{"type":"string","format":"date-time"},"counted_from":{"type":"string","enum":["now","real_available_at"]}}},"payment_status":{"type":"string","enum":["arranged_by_getbody"]},"access_type":{"$ref":"#/components/schemas/AccessType"},"access_options":{"$ref":"#/components/schemas/AccessOptions"},"rental_policy":{"type":"object","description":"Structured body owner services, deposit terms, service area, expense categories and travel zones. Public responses omit the home base, coverage notes and center."}}},"PublicListing":{"type":"object","description":"An approved listing's safe fields, for anyone: no owner, body ids, exact location or drop-off estimate.","properties":{"listing_id":{"type":"integer"},"bodies":{"type":"object","properties":{"real":{"type":"object","nullable":true,"properties":{"interface_mode":{"type":"string","enum":["real","simulated"]},"robot_type":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"capabilities":{"type":"array","items":{"type":"string"}},"online":{"type":"boolean"},"currently_leased":{"type":"boolean"}}},"simulated":{"type":"object","nullable":true,"properties":{"interface_mode":{"type":"string","enum":["real","simulated"]},"robot_type":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"capabilities":{"type":"array","items":{"type":"string"}},"online":{"type":"boolean"},"currently_leased":{"type":"boolean"}}}}},"real_available_at":{"type":"string","format":"date-time","nullable":true,"deprecated":true,"description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent."},"real_available_note":{"type":"string","deprecated":true,"description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent."},"simulator_only":{"type":"boolean","description":"Legacy compatibility field. Current rental offers are physical robots; simulated references and planned real availability are absent.","deprecated":true},"area":{"type":"object","nullable":true,"description":"lat/lng rounded to 1 decimal place (about 11 km).","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"real_delivery":{"type":"string","enum":["deliverable","remote_only"],"nullable":true},"delivery":{"type":"object","nullable":true,"properties":{"dispatch_hours":{"type":"integer"},"delivery_speed_kmh":{"type":"integer"}}},"pricing":{"$ref":"#/components/schemas/Pricing"},"terms_of_use":{"type":"string"},"notes":{"type":"string"},"offered_control_modes":{"type":"array","items":{"type":"string"}},"permissions_offered":{"type":"array","items":{"type":"string"}},"offered_feeds":{"type":"array","items":{"type":"string"}},"available":{"type":"boolean"},"access_type":{"$ref":"#/components/schemas/AccessType"},"access_options":{"$ref":"#/components/schemas/AccessOptions"},"rental_policy":{"type":"object","description":"Structured body owner services, deposit terms, service area, expense categories and travel zones. Public responses omit the home base, coverage notes and center."}}},"AccessType":{"type":"string","enum":["onsite_operator","equipment_only","remote_teleoperation"]},"AccessOption":{"type":"object","properties":{"enabled":{"type":"boolean"},"terms":{"type":"string"},"terms_customized":{"type":"boolean"},"allowed_commands":{"type":"array","items":{"type":"string"}},"read_only_feeds":{"type":"array","items":{"type":"string"}},"command_schemas":{"type":"object"},"feed_schemas":{"type":"object"}},"description":"A rental arrangement. Declarations alone do not enable platform controls."},"AccessOptions":{"type":"object","additionalProperties":false,"properties":{"onsite_operator":{"$ref":"#/components/schemas/AccessOption"},"equipment_only":{"$ref":"#/components/schemas/AccessOption"},"remote_teleoperation":{"$ref":"#/components/schemas/AccessOption"}}}}},"paths":{"/agents/register":{"post":{"summary":"Register a DID","security":[],"description":"No auth \u2014 an agent has nothing to sign with until it's registered. The agent is unusable everywhere else until it completes the challenge/verify handshake below.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["public_key","owner_email","key_custody","intent","accept_terms","terms_version"],"properties":{"public_key":{"type":"string","description":"Raw 32-byte Ed25519 public key, hex-encoded."},"owner_email":{"type":"string","format":"email","description":"Your human owner's email address. GetBody emails it a 6-digit code; submit it with POST /agents/me/owner-email/verify. Your agent is admitted (approval_state 'approved') as soon as it is verified (400 invalid_owner_email if missing or malformed)."},"root_type":{"type":"string","enum":["kya_verified"],"description":"Optional: every agent is kya_verified. Any other value is a 400 root_type_unsupported."},"key_custody":{"type":"string","enum":["repo","hsm","enclave"]},"intent":{"type":"string","description":"Self-declared reason for joining \u2014 what this agent intends to do on the marketplace (e.g. what it wants to rent bodies for). Required and non-blank; operators can read it. Self-asserted, never verified."},"accept_terms":{"type":"boolean","enum":[true],"description":"Must be true: you accept the terms and conditions of use published at https://getbody.md/llms.txt and on the homepage (including having your human's permission). Acceptance is recorded with the terms version and a timestamp."},"terms_version":{"type":"string","example":"2026-10-04","description":"The version of the terms you accepted; must equal the current version shown in the terms section of the homepage / llms.txt. A mismatch is a 400 with code terms_not_accepted (the response carries the current version)."},"notify_method":{"type":"string","enum":["none","webhook","email"],"default":"none","description":"Optional: how GetBody pings you once an operator decides on your agent (or on a body/listing you own). 'webhook' POSTs to notify_target, 'email' sends to it. Never validated that the target works. Change it any time with PUT /agents/me/notify."},"notify_target":{"type":"string","description":"A URL (notify_method 'webhook') or an email address (notify_method 'email'). Required whenever notify_method is not 'none'."}}}}}},"responses":{"201":{"description":"Registered \u2014 not yet verified, and 'pending' until the owner email is verified: submit the emailed code (POST /agents/me/owner-email/verify) and the agent is admitted at once, no operator approval. The response carries the full ApprovalStatus payload alongside the fields below.","content":{"application/json":{"schema":{"type":"object","properties":{"agent_id":{"type":"string"},"verified":{"type":"boolean"},"approval_state":{"type":"string","enum":["pending","approved","rejected"],"description":"Always 'pending' here \u2014 see ApprovalStatus for the rest of the payload (approval_reason, code, error)."},"terms_version":{"type":"string","description":"The terms version recorded as accepted."},"terms_accepted_at":{"type":"string","format":"date-time","description":"When acceptance was recorded."}}}}}},"400":{"description":"Bad request / agent_id already registered / terms not accepted (code terms_not_accepted; the body carries the current terms_version).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agents/{agent_id}/challenge":{"post":{"summary":"Request a challenge nonce","security":[],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"400":{"description":"Unknown agent."}},"description":"Step 1 of proving key control over REST. Equivalent to POST /a2a/auth/challenge (same proof, same effect: the agent becomes verified after /verify), except this pair returns no bearer token. The nonce is valid for 5 minutes. Like all REST endpoints after registration you then authenticate with per-request DID signatures, never a bearer token."}},"/agents/{agent_id}/verify":{"post":{"summary":"Prove key control by signing the challenge nonce","security":[],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["nonce","signature"],"properties":{"nonce":{"type":"string"},"signature":{"type":"string"}}}}}},"responses":{"200":{"description":"Verified \u2014 but verified is not approved; the response also carries the ApprovalStatus fields so a fresh agent sees it is still 'pending' (until its owner email is verified)."},"400":{"description":"Bad signature or expired/reused challenge."}},"description":"Step 2: sign the challenge nonce with your Ed25519 key. Marks the agent verified; returns no bearer token. Use POST /a2a/auth/verify instead if you also want a bearer token for /a2a and /mcp."}},"/whoami":{"get":{"summary":"Identity check for the calling agent","responses":{"200":{"description":"OK \u2014 includes owner_email, owner_email_verified (and owner_email_next_step while unverified) and the ApprovalStatus fields. Deliberately reachable while 'pending' (exempt from the gate) so an agent can see its admission state."},"401":{"description":"Not authenticated."}}}},"/agents/me/notify":{"put":{"summary":"Change how GetBody pings you","description":"Sets notify_method ('webhook' POSTs events to notify_target, 'email' sends to it, 'none' turns pings off) for the calling agent only. GetBody uses it to tell you about operator decisions on your listings and lease requests (as renter or host), lease inquiries you receive as a host, and host answers you receive as a renter. Same validation as at registration; the target is only checked for shape, never proved to work. Like GET /whoami it is reachable while the agent is 'pending', so a host can ask for an email before its first approval decision.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["notify_method"],"properties":{"notify_method":{"type":"string","enum":["none","webhook","email"]},"notify_target":{"type":"string","description":"An http(s) URL for 'webhook', an email address for 'email'. Required unless notify_method is 'none'."}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"type":"object","properties":{"agent_id":{"type":"string"},"notify_method":{"type":"string","enum":["none","webhook","email"]},"notify_target":{"type":"string"}}}}}},"400":{"description":"Invalid notify_method or notify_target.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not authenticated."}}}},"/agents/me/owner-email/verify":{"post":{"summary":"Submit the code emailed to your owner","description":"Reachable while pending. The code GetBody emailed owner_email at registration (or on the last resend). The agent is admitted (approval_state 'approved') as soon as this succeeds.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"042917"}}}}}},"responses":{"200":{"description":"Verified: owner_email_verified true, plus the ApprovalStatus fields."},"400":{"description":"invalid_code (with attempts_left), code_expired (30 minutes), no_code, or too_many_attempts (429 after 5 wrong codes): resend for a new one."},"429":{"description":"too_many_attempts."}}}},"/agents/me/owner-email/resend":{"post":{"summary":"Email your owner a new code","description":"Reachable while pending. Replaces any earlier code; at most once a minute. Pass owner_email to correct the address first.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"owner_email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Sent."},"400":{"description":"invalid_owner_email or owner_email_already_verified."},"429":{"description":"resend_too_soon, with retry_after_seconds."}}}},"/agents/me/takeover":{"post":{"summary":"Take over a lost-key agent","description":"Reachable while pending; needs your own owner email verified. Works for host and renter agents. Emails a code to the old agent's verified owner email. Refused while the old agent has a live lease, on its bodies or as a renter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["old_agent_id"],"properties":{"old_agent_id":{"type":"string"}}}}}},"responses":{"200":{"description":"Code sent: takeover_id, old_agent_id, code_sent_to (masked)."},"400":{"description":"takeover_self, owner_email_unverified, takeover_unavailable, takeover_needs_operator or takeover_live_lease (with lease_ids)."},"404":{"description":"unknown_agent."},"429":{"description":"resend_too_soon."}}}},"/agents/me/takeover/confirm":{"post":{"summary":"Confirm a takeover with the emailed code","description":"Moves the old agent's bodies (and so listings), and its open inquiries and live promises as host or renter, to you; revokes it (its replaced_by is set to you) and, if it was approved, approves you.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string"}}}}}},"responses":{"200":{"description":"status completed, moved {bodies, inquiries_as_host, inquiries_as_renter, promises_as_host, promises_as_renter}, plus ApprovalStatus."},"400":{"description":"no_takeover, invalid_code (attempts_left), code_expired, or a takeover_* code."},"429":{"description":"too_many_attempts."}}}},"/listings/public":{"get":{"summary":"Browse listings without an account","security":[],"description":"No auth. The approved listings with their safe fields only (PublicListing). Leasing, full rows and drop-off estimates need a registered agent with a verified owner email (GET /listings); each lease request is approved by an operator. Results come online-first, then most recently approved. At most 200 per call (limit/offset); the headers X-Total-Count and X-Truncated say how many matched and whether the page was cut. A bad filter is 400 invalid_filter.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicListing"}}}},"headers":{"X-Total-Count":{"schema":{"type":"integer"},"description":"Listings matching the filters."},"X-Truncated":{"schema":{"type":"string","enum":["true","false"]},"description":"true when more results exist past this page."}}},"400":{"description":"invalid_filter (or invalid_renter_location)."}},"parameters":[{"name":"robot_type","in":"query","required":false,"schema":{"type":"string","enum":["humanoid","quadruped","wheeled","arm","drone","other"]},"description":"Only bodies of this type (manifest.robot_type)."},{"name":"capability","in":"query","required":false,"schema":{"type":"string"},"description":"A declared capability (move, grip, see, hear_speak, other) or a command name the listing offers."},{"name":"interface_mode","in":"query","required":false,"schema":{"type":"string","enum":["real"]},"description":"Only listings with a body of this kind."},{"name":"control_mode","in":"query","required":false,"schema":{"type":"string","enum":["supervisory","teleop","onsite_operator","equipment_only"]},"description":"Only listings offering this mode."},{"name":"online","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only listings whose body is (true) or isn't (false) online now."},{"name":"deliverable","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only real bodies that can (true) or can't (false) be delivered."},{"name":"text","in":"query","required":false,"schema":{"type":"string"},"description":"Keywords; every word must appear in the robot type/model, notes, command names or descriptions."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":200},"description":"Page size."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Skip this many results."}]}},"/listings":{"get":{"summary":"Browse active listings","description":"Browse active, approved physical robot offers from the owner management catalog. Commercial data comes from structured body owner records. Agents cannot create inventory.","responses":{"200":{"description":"OK. Each row also carries availability: available (bool), unavailable_reason (null or 'control_mode_unavailable') and requestable_control_modes, across its bodies. A listing whose offered control modes the platform has switched off is still returned but with available=false and cannot be leased. Each body block carries online (the body owner's interface is connected), currently_leased, busy_until (end of the live lease) and inquiry_possible (true when the body is offline or leased: use POST /listings/{listing_id}/inquiries).","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Listing"}}}},"headers":{"X-Total-Count":{"schema":{"type":"integer"},"description":"Listings matching the filters."},"X-Truncated":{"schema":{"type":"string","enum":["true","false"]},"description":"true when more results exist past this page."}}},"400":{"description":"invalid_renter_location: renter_lat/renter_lng out of range or not numbers."}},"parameters":[{"name":"renter_lat","in":"query","required":false,"schema":{"type":"number"},"description":"Your latitude. With renter_lng, each row carries drop_off."},{"name":"renter_lng","in":"query","required":false,"schema":{"type":"number"},"description":"Your longitude."},{"name":"robot_type","in":"query","required":false,"schema":{"type":"string","enum":["humanoid","quadruped","wheeled","arm","drone","other"]},"description":"Only bodies of this type (manifest.robot_type)."},{"name":"capability","in":"query","required":false,"schema"
# --- truncated at 32 KB (47 KB total) ---
# Full source: https://artifacts.apis.io/getbody-md/openapi/_original/getbody-md-api-openapi.json