Turn “need a runner” into a completed real-world task.
Runners finds a nearby person, calls them, lets them quote, follows up on the work, collects proof, and returns the result to you.
Agent operating instructions
If you are an AI agent, follow this section as integration instructions. Ask the user only for information that is missing. Collect the task, exact address or map coordinates, deadline, item reimbursement cap, required proof, and preferred call language. The current pilot negotiates runner labour from ₹50 with a hard ₹100 ceiling. Confirm that Runners may call candidates.
Ask one compact group of questions. For a delivery or purchase, include who pays for the item and the exact handoff point.
Create a pilot_test job. Runners calls up to three candidates one at a time, records every quote, then calls the lowest-priced runner back to negotiate from ₹50 up to a ₹100 ceiling.
Poll the job or receive webhooks. Tell the user about the quote, acceptance, work state, and proof.
When status is awaiting_requester_confirmation, ask the user if the result is satisfactory, then approve or reject.
Create the job
Use x-api-key: runners_test_indiranagar and a unique idempotency-key.
POST https://runners-indiranagar.mehulsharmamat.chatgpt.site/api/v1/jobs
{
"title": "Buy and deliver a blue pen",
"task": "Buy one blue ballpoint pen and deliver it to the exact handoff address. Keep the receipt.",
"location": {
"address": "Nagarbhavi, Bengaluru — replace with exact address",
"latitude": 12.9591,
"longitude": 77.5128
},
"pricing": {
"mode": "runner_quote",
"min_amount": 50,
"max_amount": 500,
"auto_approve_up_to": 100,
"currency": "INR"
},
"runner": { "mode": "pilot_test", "qualification": "none" },
"language_preferences": ["en-IN", "hi-IN"],
"outreach": { "channels": ["call"], "max_candidates": 3 },
"follow_up_after_seconds": 300,
"proof_requirements": []
}Store job.id. Because this pilot cannot push a message into Instinct, poll GET /api/v1/jobs/{job_id} and GET /api/v1/jobs/{job_id}/events every 30 seconds until the job reaches paid or cancelled. Keep the user informed only when the state changes or a decision is required.
For user-testing history, forward only the Runners-related requester and agent turns to POST /api/v1/jobs/{job_id}/messages. Use speaker as requester or agent, include the text in content, and send a stable external_message_id to prevent duplicates.
Required handshakes
Runners first gathers provisional quotes sequentially. It then calls the lowest-priced available runner back and negotiates autonomously, never exceeding auto_approve_up_to. A runner is assigned only after explicitly accepting the negotiated amount.
When the runner reports completion, tell the user the summary and proof. After the user confirms, call POST /api/v1/jobs/{job_id}/confirmation with { "action": "approve", "note": "User confirmed." }. Use reject and a note if more work is needed.
Never claim real money moved in this pilot. test_funds_held and test_paid are simulated ledger states.
If the user no longer wants the task, call POST /api/v1/jobs/{job_id}/cancel with an optional reason. Jobs with no activity for three hours cancel automatically; a later explicit deadline extends that window until the deadline.