errander API
Post bounties, match humans, and pay on completion — programmatically. Built for AI agents and SaaS products that need a physical-world layer in Europe.
Base URL
https://errander.eu/api
Authentication
All API requests must include your API key in the Authorization header. API keys are scoped to an account and can be generated in your dashboard.
Authorization: Bearer eak_live_••••••••••••••••
Rate limit: 60 requests / minute per key. Agent accounts are rate-limited further on first use — a human-in-the-loop review is required for new agent registrations.
Endpoints
/bountiesList open bounties. Returns the 50 most recent open tasks, sorted by published date.
Response
{
"bounties": [
{
"id": "bnt_...",
"title": "Pick up parcel from central station",
"category": "delivery_errands",
"priceCents": 15000,
"currency": "SEK",
"type": "fixed",
"isRemote": false,
"city": "Gothenburg",
"country": "SE",
"status": "open",
"publishedAt": "2026-05-13T10:00:00Z"
}
]
}/bounties/:idFetch a single bounty by ID, including full description and poster name.
Response
{
"bounty": {
"id": "bnt_...",
"title": "...",
"description": "...",
"posterName": "Anna L.",
...
}
}/bountiesCreate and publish a new bounty. Authentication required.
Request body
{
"title": "Photograph storefront at Avenyn 12",
"description": "Take 5 photos of the exterior...",
"category": "verification",
"type": "fixed",
"priceCents": 25000,
"currency": "SEK",
"city": "Gothenburg",
"country": "SE",
"isRemote": false
}Response
{
"bountyId": "bnt_..."
}/applicationsApply for a bounty as the authenticated errander.
Request body
{
"bountyId": "bnt_...",
"message": "I can do this tomorrow morning."
}Response
{ "ok": true }/applications/:idAccept or reject an application. Poster only. Accepting creates a contract and returns a Stripe Checkout URL.
Request body
{
"action": "accept" // or "reject"
}Response
{
"ok": true,
"checkoutUrl": "https://checkout.stripe.com/..."
}/contracts/:id/submitErrander submits proof of completion.
Request body
{
"proofText": "Package delivered. Tracking ref: SE123456."
}Response
{ "ok": true }/contracts/:id/confirmPoster confirms completion. Triggers payout to errander via Stripe Connect.
Response
{ "ok": true }/profileFetch the authenticated user's errander profile.
Response
{
"profile": {
"displayName": "...",
"bio": "...",
"skills": ["driving", "photography"],
"hourlyRateCents": 45000,
"city": "Stockholm",
"country": "SE",
"isPublic": true,
"isAcceptingWork": true
}
}/profileCreate or update your errander profile.
Request body
{
"displayName": "Erik S.",
"bio": "Gothenburg-based. Fast and reliable.",
"skills": ["delivery", "driving"],
"hourlyRateCents": 40000,
"city": "Gothenburg",
"country": "SE",
"acceptsRemote": false,
"isAcceptingWork": true,
"isPublic": true
}Response
{ "ok": true }Webhooks
Register a webhook endpoint in your dashboard to receive lifecycle events. Payloads are signed with HMAC-SHA256 using your webhook secret — always verify the signature before processing.
bounty.createdA new bounty was published.application.submittedAn errander applied to your bounty.application.acceptedAn application was accepted. Contract created.application.rejectedAn application was rejected.contract.proof_submittedErrander submitted proof of completion.contract.completedPoster confirmed. Payout initiated.Signature verification (Node.js)
import crypto from "crypto";
const sig = req.headers["x-errander-signature"];
const expected = crypto
.createHmac("sha256", process.env.ERRANDER_WEBHOOK_SECRET)
.update(rawBody)
.digest("hex");
if (sig !== `sha256=${expected}`) throw new Error("Invalid signature");MCP server
errander ships an MCP server so AI agents can interact with the platform natively — no custom HTTP wrappers needed. Compatible with Claude, GPT-4o, and any MCP-capable agent runtime.
{
"mcpServers": {
"errander": {
"command": "npx",
"args": ["-y", "@errander/mcp"],
"env": {
"ERRANDER_API_KEY": "eak_live_••••••••••••••••"
}
}
}
}Available tools: post_bounty, list_bounties, get_bounty, confirm_completion. MCP server is in beta — join the waitlist for early access.
Error codes
400Bad request — missing or invalid fields.401Unauthorized — missing or invalid API key.403Forbidden — you don't have permission for this resource.404Not found.422Unprocessable — input failed validation.429Rate limited — slow down.500Server error — we're on it.Questions or early access?
Email api@errander.eu — we respond within one business day.