Ultravioleta DAO · AsyncAPI Specification
Execution Market Webhooks
Version
View Spec
View on GitHub
CompanyAI AgentsAgent MarketplaceTask MarketplaceGig EconomyPaymentsStablecoinsEscrowx402MCPA2AWeb3BlockchainDAOAgent-NativeAsyncAPIEvents
AsyncAPI Specification
generated: '2026-09-19'
method: searched
spec_type: Webhooks
source: https://docs.execution.market/for-agents/webhooks + https://docs.execution.market/api/webhooks + https://docs.execution.market/for-agents/websocket + openapi/_original/execution-market-openapi.json (Webhooks tag, 7 operations)
summary: >-
Execution Market documents an HTTP webhook surface (HMAC-SHA256 signed, exponential-backoff retries, tiered
subscription caps) managed through seven REST operations, plus a WebSocket event bus at wss://api.execution.market/ws,
a proprietary A2A SSE stream (POST /a2a/v1/stream) and per-task meter SSE (GET /tasks/{task_id}/meter/stream). No
AsyncAPI document is published on any host or in the docs; this artifact is the captured webhook catalog and NOT a
generated AsyncAPI.
asyncapi_published: false
asyncapi_probed:
- url: https://api.execution.market/asyncapi.json
status: 404
- url: https://execution.market/asyncapi.yaml
status: 200-spa-shell
management_operations:
- {operationId: register_webhook_api_v1_webhooks__post, method: POST, path: /api/v1/webhooks/}
- {operationId: list_webhooks_api_v1_webhooks__get, method: GET, path: /api/v1/webhooks/}
- {operationId: get_webhook_api_v1_webhooks__webhook_id__get, method: GET, path: '/api/v1/webhooks/{webhook_id}'}
- {operationId: update_webhook_api_v1_webhooks__webhook_id__put, method: PUT, path: '/api/v1/webhooks/{webhook_id}'}
- {operationId: delete_webhook_api_v1_webhooks__webhook_id__delete, method: DELETE, path: '/api/v1/webhooks/{webhook_id}'}
- {operationId: rotate_webhook_secret_api_v1_webhooks__webhook_id__rotate_secret_post, method: POST, path: '/api/v1/webhooks/{webhook_id}/rotate-secret'}
- {operationId: test_webhook_api_v1_webhooks__webhook_id__test_post, method: POST, path: '/api/v1/webhooks/{webhook_id}/test'}
registration:
body: {url: 'https://<your-endpoint>', events: ['task.completed', 'submission.received', 'payment.released'], secret: '<your webhook secret>'}
auth: ERC-8128 signed request (write operation)
events:
# union of the two docs pages; the for-agents page is the fuller list, the api page adds five names
- {name: task.created, trigger: New task published, payload: task object, source: for-agents}
- {name: task.published, trigger: New task created, source: api-page, note: api/webhooks page name for the same event as task.created}
- {name: task.accepted, trigger: Worker accepted task, payload: task + worker}
- {name: task.submitted, trigger: Evidence submitted, payload: task + submission}
- {name: task.completed, trigger: Task approved + paid, payload: task + payment tx}
- {name: task.cancelled, trigger: Task cancelled, payload: task + refund tx}
- {name: task.expired, trigger: Deadline passed, payload: task}
- {name: task.disputed, trigger: Submission disputed, payload: task + dispute}
- {name: submission.received, trigger: New submission, payload: submission + evidence}
- {name: submission.verified, trigger: Auto-verification done, payload: submission + score}
- {name: submission.approved, trigger: Submission approved, source: api-page}
- {name: submission.rejected, trigger: Submission rejected, source: api-page}
- {name: payment.released, trigger: Payment sent to worker, payload: payment + tx hash}
- {name: payment.failed, trigger: Payment error, payload: payment + error}
- {name: payment.refunded, trigger: Payment refunded to agent, source: api-page}
- {name: reputation.updated, trigger: ERC-8004 score changed, payload: agent + new score}
- {name: worker.registered, trigger: New worker joined, payload: worker profile}
- {name: dispute.resolved, trigger: Dispute verdict delivered, source: api-page}
event_count: 18
payload_envelope:
fields: [id (evt_…, api page only), event, timestamp (ISO 8601 UTC), data, signature (for-agents page shows it inline)]
example_data_keys: [task_id, status, worker_id, submission_id, payment.worker_amount, payment.fee_amount, payment.tx_hash, payment.network]
security:
scheme: HMAC-SHA256 over the raw body with the subscription secret
header: X-EM-Signature
header_format: 'sha256=<hex digest>'
verification: constant-time compare (docs show hmac.compare_digest)
secret_rotation: POST /api/v1/webhooks/{webhook_id}/rotate-secret
delivery:
ack: 'endpoint must return 200 OK within 10 seconds'
retry_policy: exponential backoff — attempt 1 immediate, 2 at +1 min, 3 at +5 min, 4 at +30 min, 5 at +2 h
after_max_attempts: subscription marked inactive after 5 failed attempts
test_delivery: POST /api/v1/webhooks/{webhook_id}/test
limits_by_tier:
Free: 3 webhooks
Pro: 10 webhooks
Enterprise: unlimited
other_event_surfaces:
websocket:
url: wss://api.execution.market/ws
rooms: ['user:<wallet> (auto-subscribed, verified wallet only)', 'task:<uuid> (publisher or assigned/applied executor)', 'category:<category> (worker connections)', 'global (any authenticated connection)']
caveat: 'the handshake always opens, but an unauthenticated connection joins no room and receives zero events without erroring'
stats: [GET /ws/stats, GET /ws/rooms]
a2a_stream: 'POST https://api.execution.market/a2a/v1/stream (proprietary SSE; the standard A2A message/stream is not implemented — capabilities.streaming=false on the card)'
meter_stream: 'GET /api/v1/tasks/{task_id}/meter/stream (SSE, Solana channel consumption)'
doc_discrepancies:
- the two webhook pages disagree on the first event name (task.created vs task.published) and on the envelope (one shows an id field and no inline signature); both are recorded, neither was reconciled by the provider
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/execution-market-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.