Back to App Store

Rent A Human

Rent A Human · io.pilot.rentahuman
Hire a real person for a physical-world task, in plain language, and talk to ops until it is done.
Work & ResearchLive on catalogue
Install
pilotctl appstore install io.pilot.rentahuman
v0.2.0
Version
5
Methods
Size
shareable
Sandbox
macOS · Linux
Platforms

About Rent A Human

Rent A Human gives an agent hands in the physical world. Describe a task the way a person would — "deep clean a 2-bedroom apartment in the Mission by Friday, budget $150" — and a human ops coordinator at RentAHuman sources and vets a real person to do it. Everything after that happens on a message thread your agent polls.

This is the Partner API, not the marketplace. There is no account for your user to create, no profile to browse, and no escrow for your agent to manage. One call creates a request; ops does the sourcing, vetting and scheduling; your agent reads status and messages and answers questions. When work is priced, a payment link comes back for your agent to relay.

Your agent is the only channel. RentAHuman never contacts your end customer. Quotes, questions, status changes and payment links are all addressed to your agent, even when the wording reads like "tell the customer…". You decide whether, when and how to relay each one. Nothing reaches your customer unless your agent sends it.

The loop. create_request returns a requestId. Poll get_request and branch on status: received means ops has not replied yet; needs_info means they asked a question and progress is blocked until you answer with send_message; quoted means a price and usually a payment link are waiting to be relayed; then scheduled, in_progress, completed. list_requests shows everything in flight.

Edge cases. task and details are moderated, so rejected text returns 400 with an explanation and should be rewritten rather than retried. requesterPhoneNumber must be E.164 and is customer PII. budgetUsd is the budget before fees. A requestId you do not own returns 404, exactly like one that does not exist, so ids cannot be enumerated. list_bounties needs the referrals capability and otherwise returns 403.

Methods · 5

rentahuman.create_request
START HERE. Ask for a human to do something in the physical world, in plain language. A real ops coordinator reads it, sources and vets a person, and replies on a message thread you poll with get_request. Returns {requestId, status:"received", request}. Keep the requestId — every other method hangs off it. task and details pass a content-moderation check; rejected text returns 400 with an explanation, so rewrite rather than retry. The more context you give (access notes, preferences, constraints) the fewer needs_info round-trips.
rentahuman.get_request
Read one request: its current status and the full message thread with the ops coordinator. THIS IS THE POLL TARGET after create_request. Branch on status, not on success: received (logged, ops has not replied — tell the customer it is in, nothing else) | needs_info (ops asked a question and progress is BLOCKED until you answer via send_message) | quoted (a price, usually with paymentLinks[].url, is waiting — relay it verbatim) | scheduled (booked) | in_progress (someone is on it) | completed (terminal) | cancelled (terminal, read the final message for the reason). A requestId you do not own returns 404, identical to one that does not exist.
rentahuman.send_message
Send a follow-up message to the ops coordinator on a request — answer their question, or relay your customer's decision. This is the way out of a needs_info status. The message goes to OPS, not to your customer: nothing here is seen by the person who asked. Max 5,000 characters, moderated.
rentahuman.list_requests
List your requests, newest first, so an agent can see everything in flight at once. Cursor-paginated: pass the previous response's nextCursor, which is null on the last page. There is no server-side status filter — read the status field on each item and act on the ones that block, which are needs_info and quoted.
rentahuman.list_bounties
List open marketplace bounties, each with a tracked referral URL, for agents that want to surface paid real-world work rather than commission it. Requires the referrals capability on the account; without it this returns 403, which is a permission fact rather than a transient error.

Full usage demo

When a task needs hands in the physical world — a clean, a pickup, an errand, an on-site check — and your agent needs a real person to do it and report back.

Run this first — Ask for a human to do something, in plain language
Call
pilotctl appstore call io.pilot.rentahuman rentahuman.create_request '{"task":"Deep clean a 2-bedroom apartment","externalChatId":"thread-9f2a41c7","requesterPhoneNumber":"+14155550100","budgetUsd":150,"location":"Mission District, San Francisco, CA"}'
{"success":true,"requestId":"8FQxJ0N2VvR5aYc31TZk","status":"received","request":{...}}

A human ops coordinator picks this up and sources a vetted person. Keep the requestId — everything else hangs off it.

Worked examples

Poll the request and read the thread
Call
pilotctl appstore call io.pilot.rentahuman rentahuman.get_request '{"requestId":"8FQxJ0N2VvR5aYc31TZk"}'
{"success":true,"request":{"status":"quoted","paymentLinks":[{"url":"https://..."}]}}

received -> needs_info -> quoted -> scheduled -> in_progress -> completed. needs_info BLOCKS until you answer; quoted means relay the price and payment link.

Answer an ops question
Call
pilotctl appstore call io.pilot.rentahuman rentahuman.send_message '{"requestId":"8FQxJ0N2VvR5aYc31TZk","message":"Customer confirms 8pm tomorrow works, and there is a cat."}'
{"success":true,"messageId":"3NcVb8sDf1gHj6kQw0Pz"}

This goes to the ops coordinator, not to your customer. Nothing you send here reaches them.

See everything in flight
Call
pilotctl appstore call io.pilot.rentahuman rentahuman.list_requests '{"limit":20}'
{"success":true,"requests":[{"requestId":"...","status":"quoted"}],"nextCursor":null}

Newest first, cursor-paginated. No server-side status filter — read status per item.

Good to know

  • Nothing reaches your customer unless YOU send it. Ops replies, quotes and payment links are all addressed to your agent.
  • Branch on status, not success. needs_info blocks progress until you answer; quoted means a price and link are waiting.
  • requesterPhoneNumber is customer PII — keep it server-side, out of logs and URLs.
  • task and details are moderated. A 400 means rewrite, not retry.
  • budgetUsd is before fees (1-100000). Always pass dueBy if the customer gave a deadline.

Next

  • io.pilot.rentahuman rentahuman.help '{}'

What’s New

v0.2.0Latest
  • First release on the Pilot app store.

Platform Compatibility

macOSApple Silicon
Supported
macOSIntel
Supported
Linuxarm64
Supported
Linuxamd64
Supported
You might also like

More in Work & Research