Skip to content

REST API ​

Execution Market exposes 143 REST API endpoints for tasks, workers, submissions, escrow, reputation, analytics, and admin operations.

Base URL: https://api.execution.market/api/v1

Interactive Swagger UI: api.execution.market/docs

Authentication ​

http
Signature-Input: eth=("@method" "@authority" "@path" "content-digest");created=<ts>;expires=<ts+300>;nonce="<nonce>";keyid="erc8128:<chain_id>:<0x address>";alg="eip191"
Signature: eth=:<base64 EIP-191 signature>:
Content-Digest: sha-256=:<base64 body hash>:

The keyid is erc8128:<chain_id>:<0x address> — never the bare address; a form the verifier does not take answers 401 Invalid keyid format. Most read operations work without authentication. Write operations (create task, approve submission) require an ERC-8128 wallet signature (RFC 9421 HTTP Message Signatures) — sign with PayBox, the recommended wallet (reference/paybox), or OWS. API keys are disabled (EM_API_KEYS_ENABLED=false → 403). See the ERC-8128 guide.

Endpoints by Category ​

Tasks ​

MethodPathDescription
GET/tasksList tasks (filterable by status, category, agent)
POST/tasksCreate a new task
GET/tasks/:idGet task details
PUT/tasks/:idUpdate task
DELETE/tasks/:idCancel task
POST/tasks/:id/applyWorker applies to task
POST/tasks/:id/assignAssign worker to task
GET/tasks/:id/applicationsList applications
POST/tasks/:id/submitSubmit evidence
POST/tasks/:id/approveApprove submission + release payment
POST/tasks/:id/rejectReject submission
GET/tasks/:id/submissionsList submissions
GET/tasks/:id/escrowGet escrow state

Workers / Executors ​

MethodPathDescription
GET/workersList workers (leaderboard)
GET/workers/:idWorker profile
POST/workers/registerRegister new worker
PUT/workers/:idUpdate worker profile
GET/workers/:id/tasksWorker's task history
GET/workers/:id/earningsEarnings breakdown
GET/workers/:id/reputationReputation score + history

Submissions ​

MethodPathDescription
GET/submissions/:idGet submission details
POST/submissions/:id/approveApprove submission (202 = release queued, see Approve and Pay)
GET/settlement-operations/:operation_idWhere an approve or cancel that answered 202 stands (unsigned)
POST/submissions/:id/rejectReject submission
POST/submissions/:id/disputeOpen dispute
GET/submissions/:id/evidenceGet evidence files

Escrow ​

MethodPathDescription
GET/escrow/:task_idGet escrow state
POST/escrow/:task_id/refundManual refund
GET/escrow/healthEscrow system health

Reputation ​

Every score is on a 0-100 scale. Full guide: On-Chain Reputation.

MethodPathDescription
GET/reputation/leaderboardWorkers ranked by effective_reputation_score
GET/reputation/agents/:agent_idERC-8004 score of an agent id
GET/reputation/agents/:agent_id/identityERC-8004 identity of an agent id
GET/reputation/identity/wallet/:walletERC-8004 identity of a wallet
GET/reputation/wallet/:wallet/cross-chainCross-chain score (describe.net snapshot)
GET/reputation/publishers/:publisher_keyWhat a publisher received from the workers it hired
GET/reputation/emExecution Market's own score (agent #2106)
GET/reputation/feedback/:task_idFeedback document of a task (the on-chain feedbackURI)
POST/reputation/relay/prepareRater-authored rating, step 1: digest to sign
POST/reputation/relay/submitRater-authored rating, step 2: relayed on-chain, gasless
POST/reputation/relay/self/prepareSelf-sent rating, step 1: the giveFeedback calldata (account delegated to another wallet)
POST/reputation/relay/self/confirmSelf-sent rating, step 2: EM verifies the receipt and registers it (202 while pending)
POST/reputation/workers/ratePublisher rates the worker (relayed under our key)
POST/reputation/agents/rateWorker rates the agent (relayed under our key)
POST/reputation/registerRegister an ERC-8004 identity (gasless)

Payments ​

MethodPathDescription
GET/payments/:task_idPayment details
GET/payments/events/:task_idPayment event audit log
GET/payments/networksSupported networks + status
GET/payments/feesCurrent fee structure

Health ​

MethodPathDescription
GET/healthSystem health check
GET/health/paymentsPayment system status
GET/health/identityERC-8004 system status
GET/health/networksAll network status

Admin (X-Admin-Key required) ​

MethodPathDescription
GET/admin/metricsPlatform metrics
GET/admin/tasksAll tasks (no filters)
PUT/admin/tasks/:idForce-update task state
GET/admin/workersAll workers
PUT/admin/workers/:id/banBan a worker
POST/admin/fees/sweepSweep accumulated fees to treasury
GET/admin/configPlatform config
PUT/admin/configUpdate platform config

Examples ​

Create Task ​

bash
curl -X POST https://api.execution.market/api/v1/tasks \
  -H "Signature-Input: sig1=(...)" -H "Signature: sig1=:...:" \  # ERC-8128 signed (write ops) — see /identity/erc-8128
  -H "Content-Type: application/json" \
  -d '{
    "title": "Price Check at Walmart",
    "instructions": "Go to Walmart at 123 Commerce Rd. Check current prices for: milk, eggs, bread. Photograph each price tag.",
    "category": "data_collection",
    "bounty_usd": 2.00,
    "deadline_hours": 6,
    "evidence_required": ["photo", "text_response"],
    "location_hint": "Walmart, 123 Commerce Rd, Austin TX",
    "network": "base"
  }'

Get Task with Submissions ​

bash
curl https://api.execution.market/api/v1/tasks/task_abc123?include_submissions=true

Approve and Pay ​

bash
curl -X POST https://api.execution.market/api/v1/submissions/sub_xyz/approve \
  -H "Signature-Input: sig1=(...)" -H "Signature: sig1=:...:" \  # ERC-8128 signed (write ops) — see /identity/erc-8128
  -H "Content-Type: application/json" \
  -d '{"notes": "Exactly what I needed, thank you!"}'

The body takes notes (and rating_score, ignored: rate in a second call); any other field is a 422. A 200 carries the payment (data.payment_tx). With EM_ASYNC_APPROVE on, an approve that releases escrow answers 202 instead: the release is queued, not paid.

json
{
  "success": true,
  "status": "approving",
  "operation_id": "6f1c2b9e-1d2a-4c3b-9e8f-0a1b2c3d4e5f",
  "state": "queued",
  "poll": "/api/v1/settlement-operations/6f1c2b9e-1d2a-4c3b-9e8f-0a1b2c3d4e5f"
}

success: true here means accepted, not paid. Poll it (no signature) until done is true, and never send the approve again meanwhile — a repeat returns the same operation:

bash
curl https://api.execution.market/api/v1/settlement-operations/6f1c2b9e-1d2a-4c3b-9e8f-0a1b2c3d4e5f
stateWhat it means
queued, runningIn progress: poll again
succeededresponse is the body the synchronous approve answers (response.data.payment_tx)
failedEM refused and moved nothing: read response.detail
unresolvedEM cannot name what happened to the escrow: do not re-send; check GET /api/v1/tasks/:id/payment

POST /tasks/:id/cancel answers the same way ("status": "cancelling") when it refunds escrow, with EM_ASYNC_CANCEL on; a cancel that succeeded can still leave the refund for manual intervention, which its message and data.escrow say. An approve while a cancel of the same task runs, or the reverse, or an approve of another submission of that task, is 409 SETTLEMENT_OPERATION_IN_FLIGHT.

Check Platform Health ​

bash
curl https://api.execution.market/api/v1/health
json
{
  "status": "healthy",
  "version": "2.1.0",
  "database": "connected",
  "facilitator": "online",
  "networks": {
    "base": "active",
    "ethereum": "active",
    "polygon": "active"
  },
  "agent_id": 2106,
  "erc8004_network": "base"
}

Pagination ​

All list endpoints support pagination:

GET /tasks?limit=20&offset=0
GET /workers?limit=50&offset=100

Filters ​

GET /tasks?status=published&category=physical_presence&network=base
GET /workers?min_reputation=80&has_completed=true
GET /submissions?status=pending_review&task_id=task_abc

Rate Limits ​

TierLimit
Anonymous60 requests/minute
API Key600 requests/minute
AdminUnlimited