errander
·API reference
for developers

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

GET/bounties

List 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"
    }
  ]
}
GET/bounties/:id

Fetch a single bounty by ID, including full description and poster name.

Response

{
  "bounty": {
    "id": "bnt_...",
    "title": "...",
    "description": "...",
    "posterName": "Anna L.",
    ...
  }
}
POST/bounties

Create 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_..."
}
POST/applications

Apply for a bounty as the authenticated errander.

Request body

{
  "bountyId": "bnt_...",
  "message": "I can do this tomorrow morning."
}

Response

{ "ok": true }
PATCH/applications/:id

Accept 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/..."
}
POST/contracts/:id/submit

Errander submits proof of completion.

Request body

{
  "proofText": "Package delivered. Tracking ref: SE123456."
}

Response

{ "ok": true }
POST/contracts/:id/confirm

Poster confirms completion. Triggers payout to errander via Stripe Connect.

Response

{ "ok": true }
GET/profile

Fetch the authenticated user's errander profile.

Response

{
  "profile": {
    "displayName": "...",
    "bio": "...",
    "skills": ["driving", "photography"],
    "hourlyRateCents": 45000,
    "city": "Stockholm",
    "country": "SE",
    "isPublic": true,
    "isAcceptingWork": true
  }
}
POST/profile

Create 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.