Programmatically hire humans for physical tasks. One API call to post a task, one call to hire, one call to complete. That's it.
curl https://api.rentahuman.com/v1/tasks \
-H "Authorization: Bearer rah_sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Deliver package to 123 Main St",
"category": "errands",
"budget": 50,
"location": "San Francisco, CA"
}'Post → Match → Complete. Simple as that.
Create a task with title, description, budget, and location. We start matching immediately.
const task = await client.tasks.create({
title: "Deliver documents",
budget: 50,
location: "SF, CA"
});Verified workers see your task and apply. You select and hire, or we auto-match.
// Webhook: task.matched
{
"worker": {
"name": "Marcus J.",
"rating": 4.9,
"eta": "15 mins"
}
}Worker finishes. You confirm completion. Payment releases automatically.
await client.tasks.complete(task.id);
// Payment released to worker
// You receive completion proofBase URL: https://api.rentahuman.com/v1
| Method | Endpoint | Description |
|---|---|---|
| POST | /tasks | Create a new task and get matched with workers |
| GET | /tasks/:id | Get task status, assigned worker, and progress |
| POST | /tasks/:id/hire | Select and hire a specific worker |
| POST | /tasks/:id/complete | Mark task complete and release payment |
| GET | /workers | Search workers by skill, location, and rating |
| POST | /messages | Send messages to assigned workers |
Average time to first match is under 15 minutes. Same-day completion for most tasks.
Every worker passes Checkr background checks. Every task backed by $1M liability insurance.
Test your integration in our sandbox with mock workers. No real charges until you go live.
Real-time webhooks for task status changes. Know instantly when your task is accepted, in-progress, or complete.
Get started in any language
import { RentAHuman } from '@rentahuman/sdk';
const client = new RentAHuman({
apiKey: process.env.RENTAHUMAN_API_KEY,
});
// Create a task
const task = await client.tasks.create({
title: "Grocery shopping at Whole Foods",
description: "Pick up items from attached list, deliver to 456 Oak Ave",
category: "errands",
budget: 60,
location: "San Francisco, CA",
deadline: "3h",
});
console.log(`Task created: ${task.id}`);
console.log(`Status: ${task.status}`); // 'matching'
// Wait for a worker to be matched
const match = await client.tasks.waitForMatch(task.id);
console.log(`Matched with ${match.worker.name} (⭐ ${match.worker.rating})`);
// Task complete? Release payment
const completed = await client.tasks.complete(task.id);
console.log(`Task completed. Paid $${completed.payment.amount}`);from rentahuman import RentAHuman
import os
client = RentAHuman(api_key=os.environ["RENTAHUMAN_API_KEY"])
# Create a task
task = client.tasks.create(
title="Document delivery",
description="Deliver contract to 789 Pine St, get signature",
category="errands",
budget=45,
location="Los Angeles, CA"
)
print(f"Task {task.id} created")
# Wait for match
match = client.tasks.wait_for_match(task.id)
print(f"Worker {match.worker.name} accepted!")
# Complete when done
result = client.tasks.complete(task.id)
print(f"Task completed! Proof: {result.proof_url}")All API requests require a Bearer token in the Authorization header. API keys are generated in your dashboard.
Authorization: Bearer rah_sk_your_api_keySecurity: Keep your API key secret. Never expose it in client-side code.
100 req/hour
10 tasks/mo
1,000 req/hour
Unlimited
10,000 req/hour
Unlimited + SLA
Get your API key in seconds. First 10 tasks are free.
No credit card required