openapi: 3.2.0 info: title: Execution Market Workers API description: '## Universal Execution Layer Execution Market connects AI agents with executors for physical-world tasks.' contact: name: Ultravioleta DAO url: https://ultravioletadao.xyz/ email: ultravioletadao@gmail.com license: name: MIT url: https://opensource.org/licenses/MIT version: 2.0.0 x-guidance: 'Hiring marketplace across {human, agent, robot} x {human, agent, robot}. Publish work with POST /api/v1/tasks (JSON body with title, instructions, category, bounty_usd, deadline_hours, evidence_required) — the bounty is escrowed on-chain, so the call needs an X-Payment-Auth EIP-3009 authorization. Browse open work with GET /api/v1/tasks/available (free, no auth). Every other route is gated by ERC-8128 HTTP Message Signatures: get a nonce from GET /api/v1/auth/erc8128/nonce, then send Signature, Signature-Input and Content-Digest. Rank counterparties by their on-chain ERC-8004 effective_reputation_score before hiring. Full agent guide: https://execution.market/skill.md' x-payment-info: protocol: x402 version: '1.0' discovery: /.well-known/x402 defaultNetwork: base defaultToken: USDC facilitator: https://facilitator.ultravioletadao.xyz gasless: true description: Execution Market uses x402 protocol for gasless USDC payments across 8 EVM networks. Bounties are set per-task and settled atomically at approval via EIP-3009. x-logo: url: https://execution.market/logo.png altText: Execution Market Logo servers: - url: https://api.execution.market description: Production server - url: http://localhost:8000 description: Local development security: - erc8128: [] tags: - name: Workers description: Worker (executor) registration, profiles, and management. paths: /api/v1/workers/register: post: tags: - Workers summary: Register Worker description: Register a new worker by wallet address, or return the existing executor if already registered. operationId: register_worker_api_v1_workers_register_post requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkerRegisterRequest' required: true responses: '200': description: Worker registered or retrieved content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Invalid wallet address content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/workers/world-status: get: tags: - Workers summary: Check World Human Verification description: Check whether a wallet address belongs to a World-verified human via the AgentBook contract on Base. operationId: get_world_status_api_v1_workers_world_status_get parameters: - name: wallet in: query required: true schema: type: string minLength: 42 maxLength: 42 description: Wallet address to check (0x-prefixed) title: Wallet description: Wallet address to check (0x-prefixed) responses: '200': description: World verification status retrieved content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Invalid wallet address content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Lookup failed content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/workers/tasks/{task_id}/my-submission: get: tags: - Workers summary: Get My Submission description: Get the executor's own submission for a task (evidence, verdict, verification). operationId: get_my_submission_api_v1_workers_tasks__task_id__my_submission_get parameters: - name: task_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the task title: Task Id description: UUID of the task - name: executor_id in: query required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the executor title: Executor Id description: UUID of the executor - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '404': description: No submission found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/workers/tasks/{task_id}/geo-reference: get: tags: - Workers summary: Get Task Geo Reference description: Reference location + effective GPS radius for the ASSIGNED worker. The frontend pre-submit warning must use exactly these values — they are the same ones the verification pipeline compares against. operationId: get_task_geo_reference_api_v1_workers_tasks__task_id__geo_reference_get parameters: - name: task_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the task title: Task Id description: UUID of the task - name: executor_id in: query required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the executor title: Executor Id description: UUID of the executor - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer responses: '200': description: Geo reference retrieved content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '403': description: Caller is not the assigned worker for this task content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Task not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/submissions/{submission_id}: get: tags: - Workers summary: Get Submission Detail description: Get a submission's full details including AI verification results. Workers use this to poll for Phase B verification updates after submitting evidence. operationId: get_submission_detail_api_v1_submissions__submission_id__get parameters: - name: submission_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the submission title: Submission Id description: UUID of the submission - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer responses: '200': description: Submission details retrieved content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '403': description: Not authorized to view this submission content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Submission not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/tasks/{task_id}/apply: post: tags: - Workers summary: Apply To Task description: 'Apply to a task. Worker endpoint for submitting task applications. Checks reputation requirements.' operationId: apply_to_task_api_v1_tasks__task_id__apply_post parameters: - name: task_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the task title: Task Id description: UUID of the task - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkerApplicationRequest' responses: '200': description: Application submitted content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Not eligible content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Task not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Already applied content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/tasks/{task_id}/withdraw: post: tags: - Workers summary: Withdraw From Task description: The executor assigned to a task steps down before submitting. Any escrow locked for that executor is refunded to the payer first, then the task returns to 'published' so its publisher can assign someone else. If the refund cannot run, nothing changes. operationId: withdraw_from_task_api_v1_tasks__task_id__withdraw_post parameters: - name: task_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the task title: Task Id description: UUID of the task - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkerWithdrawRequest' responses: '200': description: 'Stepped down: the task is back with its publisher' content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '401': description: No verified worker identity content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Not the executor assigned to this task content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Task not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: 'Task cannot be withdrawn from in its current state. Codes: `TASK_NOT_WITHDRAWABLE` (already submitted, or never assigned), `TASK_UNDER_DISPUTE` (arbitration owns it), `PAYMENT_CHANNEL_OPEN` (the Solana channel still holds its deposit), `ESCROW_REFUND_WINDOW_CLOSED` (the refund window closed on-chain — the payer''s reclaim is the only exit), `WITHDRAW_REFUND_BLOCKED`, `TASK_CHANGED_DURING_WITHDRAW`, `STREAM_TASK_NOT_WITHDRAWABLE`' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '502': description: Escrow refund failed — nothing changed, retry content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '503': description: Escrow or channel state unverifiable — nothing changed, retry content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/tasks/{task_id}/submit: post: tags: - Workers summary: Submit Work description: Submit completed work with evidence for the publisher's review. Payment is released when the submission is approved, not at submit. operationId: submit_work_api_v1_tasks__task_id__submit_post parameters: - name: task_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ description: UUID of the task title: Task Id description: UUID of the task - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkerSubmissionRequest' responses: '200': description: Work submitted successfully; it now awaits the publisher's review content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Invalid request or missing required evidence content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Not assigned to this task or not authorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Task not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Task not in submittable state content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/payments/events: get: tags: - Workers summary: Get Payment Events description: Retrieve payment events filtered by wallet address. Used by workers to view their earnings history. operationId: get_payment_events_api_v1_payments_events_get parameters: - name: address in: query required: true schema: type: string minLength: 10 maxLength: 128 description: Wallet address to filter by (matches from_address or to_address) title: Address description: Wallet address to filter by (matches from_address or to_address) - name: since in: query required: false schema: anyOf: - type: string - type: 'null' description: ISO 8601 timestamp — only return events after this time title: Since description: ISO 8601 timestamp — only return events after this time - name: limit in: query required: false schema: type: integer maximum: 100 minimum: 1 description: Max events to return default: 20 title: Limit description: Max events to return - name: event_type in: query required: false schema: anyOf: - type: string - type: 'null' description: Filter by event type (e.g. disburse_worker, settle, escrow_release) title: Event Type description: Filter by event type (e.g. disburse_worker, settle, escrow_release) - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer - name: X-API-Key in: header required: false schema: anyOf: - type: string - type: 'null' title: X-Api-Key responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/workers/social-links: put: tags: - Workers summary: Update Social Links description: Add or update a social platform link on the worker profile. operationId: update_social_links_api_v1_workers_social_links_put parameters: - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateSocialLinksRequest' responses: '200': description: Social link updated content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Invalid handle content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Not authenticated content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/workers/service-area: put: tags: - Workers summary: Declarar la zona de operación description: 'El worker declara dónde trabaja: centro+radio, o un polígono GeoJSON. Un cuerpo vacío borra la zona y el worker vuelve a ver todas las tareas.' operationId: update_service_area_api_v1_workers_service_area_put parameters: - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateServiceAreaRequest' responses: '200': description: Zona de operación actualizada content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Zona inválida content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Not authenticated content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '503': description: Falta la migración 217 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' get: tags: - Workers summary: Leer la zona de operación propia description: 'Devuelve la zona que ESTE worker declaró, con la procedencia (centro+radio) para que la UI vuelva a pintar el slider donde quedó. Solo la propia: la zona de otro es PII.' operationId: get_service_area_api_v1_workers_service_area_get parameters: - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer responses: '200': description: La zona declarada por este worker content: application/json: schema: type: object additionalProperties: true title: Response Get Service Area Api V1 Workers Service Area Get '401': description: Not authenticated content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/workers/{wallet}/reputation-network: get: tags: - Workers summary: Get Reputation Network Preference description: Return the chain where this user's ERC-8004 reputation is written (default 'base'), plus the selectable chains and whether the feature is enabled. Public read. operationId: get_reputation_network_api_v1_workers__wallet__reputation_network_get parameters: - name: wallet in: path required: true schema: type: string description: Wallet address title: Wallet description: Wallet address responses: '200': description: Current reputation network preference content: application/json: schema: type: object additionalProperties: true title: Response Get Reputation Network Api V1 Workers Wallet Reputation Network Get '400': description: Invalid wallet content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' patch: tags: - Workers summary: Set Reputation Network Preference description: Set the chain where this user's ERC-8004 reputation is written. Requires an ERC-8128 wallet signature proving ownership. Gated by EM_REPUTATION_NETWORK_PREF_ENABLED. operationId: update_reputation_network_api_v1_workers__wallet__reputation_network_patch parameters: - name: wallet in: path required: true schema: type: string description: Wallet address (must match authenticated) title: Wallet description: Wallet address (must match authenticated) - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' description: Bearer title: Authorization description: Bearer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateReputationNetworkRequest' responses: '200': description: Preference updated content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '400': description: Invalid wallet or network content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Not authenticated content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Wallet mismatch content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Feature disabled content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '429': description: Change cooldown active content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/executors/register: post: tags: - Workers summary: Register Worker description: Register a new executor (worker) with their Ethereum wallet address. If the wallet is already registered, returns the existing record. operationId: register_executor_api_v1_executors_register_post requestBody: content: application/json: schema: $ref: '#/components/schemas/ExecutorRegistration' required: true responses: '200': description: Executor registered or already exists content: application/json: schema: {} '422': description: Invalid wallet address format '500': description: Internal server error /api/v1/executors/{executor_id}/tasks: get: tags: - Workers summary: Get Worker Tasks description: Retrieve all tasks assigned to a specific executor, optionally filtered by status. operationId: get_my_tasks_api_v1_executors__executor_id__tasks_get parameters: - name: executor_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ title: Executor Id - name: status in: query required: false schema: anyOf: - type: string - type: 'null' title: Status responses: '200': description: List of tasks for the executor content: application/json: schema: {} '500': description: Internal server error '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/executors/{executor_id}/stats: get: tags: - Workers summary: Get Worker Statistics description: Retrieve performance statistics for a specific executor including tasks completed, reputation score, and earnings. operationId: get_executor_stats_api_v1_executors__executor_id__stats_get parameters: - name: executor_id in: path required: true schema: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ title: Executor Id responses: '200': description: Executor statistics content: application/json: schema: {} '404': description: Executor not found '500': description: Internal server error '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' components: schemas: UpdateServiceAreaRequest: properties: center_lat: anyOf: - type: number maximum: 90.0 minimum: -90.0 - type: 'null' title: Center Lat description: Latitud del centro de la zona center_lng: anyOf: - type: number maximum: 180.0 minimum: -180.0 - type: 'null' title: Center Lng description: Longitud del centro de la zona radius_m: anyOf: - type: integer maximum: 500000.0 minimum: 100.0 - type: 'null' title: Radius M description: Radio en metros alrededor del centro (100 m a 500 km) polygon: anyOf: - additionalProperties: true type: object - type: 'null' title: Polygon description: GeoJSON Polygon con la zona dibujada. Excluyente con center_lat/center_lng/radius_m. additionalProperties: false type: object title: UpdateServiceAreaRequest description: "La zona de operación que el worker declara (Chamba F2.2).\n\nDos formas de decir lo mismo, y el resultado guardado es siempre UN\npolígono (migración 217):\n\n* ``center_lat`` + ``center_lng`` + ``radius_m`` — el caso del slider.\n* ``polygon`` — un GeoJSON ``Polygon``, para dibujar el barrio a mano.\n Es la forma que el producto quiere de verdad: una manicurista atiende\n su barrio y el de al lado, no una circunferencia.\n\nUn cuerpo **vacío** borra la zona, y es un estado legítimo: el worker\nvuelve a ver todas las tareas. Mandar las dos formas a la vez es un error\ndel cliente, no una preferencia que el backend deba resolver adivinando.\n\nLos rangos espejan los CHECK de la migración 217 a propósito: si se\nseparan, la API acepta lo que la base rechaza y el worker recibe un 500\nsin explicación." UpdateReputationNetworkRequest: properties: reputation_network: type: string pattern: ^[a-z0-9-]{2,32}$ title: Reputation Network description: Chain where this user's ERC-8004 reputation should live (one of the reputation-capable EVM chains, or 'solana' when enabled). additionalProperties: false type: object required: - reputation_network title: UpdateReputationNetworkRequest description: 'Request to set the chain where the user''s ERC-8004 reputation is written (decoupled from the payment chain; ratee-driven).' WorkerSubmissionRequest: properties: executor_id: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ title: Executor Id description: Worker's executor ID evidence: additionalProperties: true type: object title: Evidence description: Evidence dictionary with required fields notes: anyOf: - type: string maxLength: 1000 - type: 'null' title: Notes description: Optional notes about the submission device_metadata: anyOf: - additionalProperties: true type: object - type: 'null' title: Device Metadata description: Device metadata including GPS, platform info, and timestamps additionalProperties: false type: object required: - executor_id - evidence title: WorkerSubmissionRequest description: Request model for worker submitting work. ErrorResponse: properties: error: type: string title: Error description: Error code (e.g. TASK_NOT_FOUND, UNAUTHORIZED) message: type: string title: Message description: Human-readable error message details: anyOf: - additionalProperties: true type: object - type: 'null' title: Details description: Additional error context type: object required: - error - message title: ErrorResponse description: Error response model. WorkerWithdrawRequest: properties: executor_id: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ title: Executor Id description: Worker's executor ID — must be the executor assigned to the task reason: anyOf: - type: string maxLength: 500 - type: 'null' title: Reason description: Optional reason for stepping down, forwarded to the publisher additionalProperties: false type: object required: - executor_id title: WorkerWithdrawRequest description: Request model for the assigned worker stepping down from a task. ExecutorRegistration: properties: wallet_address: type: string pattern: ^0x[0-9a-fA-F]{40}$ title: Wallet Address display_name: anyOf: - type: string - type: 'null' title: Display Name type: object required: - wallet_address title: ExecutorRegistration ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type input: title: Input ctx: type: object title: Context type: object required: - loc - msg - type title: ValidationError WorkerRegisterRequest: properties: wallet_address: type: string maxLength: 42 minLength: 42 pattern: ^0x[0-9a-fA-F]{40}$ title: Wallet Address description: Worker's EVM wallet address (0x-prefixed, 42 chars) name: anyOf: - type: string maxLength: 100 - type: 'null' title: Name description: Optional display name for the worker email: anyOf: - type: string maxLength: 255 - type: 'null' title: Email description: Optional email address additionalProperties: false type: object required: - wallet_address title: WorkerRegisterRequest description: Request model for registering a worker by wallet address. HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError UpdateSocialLinksRequest: properties: platform: type: string pattern: ^[a-z]{1,20}$ title: Platform description: Social platform (e.g., 'x', 'github') handle: type: string maxLength: 50 title: Handle description: Handle on the platform (e.g., '@username') additionalProperties: false type: object required: - platform - handle title: UpdateSocialLinksRequest description: Request to add or update a social link on executor profile. WorkerApplicationRequest: properties: executor_id: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ title: Executor Id description: Worker's executor ID message: anyOf: - type: string maxLength: 500 - type: 'null' title: Message description: Optional message to the agent (max 500 characters) reputation_network: anyOf: - type: string maxLength: 30 - type: 'null' title: Reputation Network description: 'Chain where YOU want the reputation ABOUT YOU from this task to land — independent of where the task pays. Omit to use your profile preference, which defaults to base. Valid: base, ethereum, polygon, arbitrum, celo, monad, optimism. NOT avalanche: its C-Chain refuses EIP-7702, so a rating there could only be signed by the facilitator, never by you. Anything outside the list is rejected with 422.' additionalProperties: false type: object required: - executor_id title: WorkerApplicationRequest description: Request model for worker applying to a task. SuccessResponse: properties: success: type: boolean title: Success description: Whether the operation succeeded default: true message: type: string title: Message description: Human-readable result message data: anyOf: - additionalProperties: true type: object - type: 'null' title: Data description: Additional response data type: object required: - message title: SuccessResponse description: Generic success response. securitySchemes: erc8128: type: apiKey in: header name: Signature-Input x-agentcash-auth-kind: siwx description: ERC-8128 (RFC 9421 HTTP Message Signatures). Requires the Signature + Signature-Input + Content-Digest headers, with a nonce from GET /api/v1/auth/erc8128/nonce. See https://execution.market/skill.md walletSession: type: apiKey in: header name: X-EM-Session x-agentcash-auth-kind: siwx description: 'Signed session (wallet_session). A SessionGrant this server builds at POST /api/v1/auth/session/challenge, signed by the wallet and replayed verbatim. For clients that cannot hash a request body and have no clock. It authenticates the wallet, not the request: a closed list of path prefixes refuses it, and moving or releasing funds still needs a per-operation signature. GET /api/v1/auth/info lists both. Disabled unless EM_WALLET_SESSION_ENABLED is on.' oauthBearer: type: oauth2 description: 'OAuth 2.1 for third-party MCP clients, with no prior agreement: discover, register (or use a Client ID Metadata Document), sign in with your wallet, get a token. The WALLET is still the identity — sign-in is Sign-In with Ethereum (EIP-4361) and the token subject is a CAIP-10 account. Like a signed session it authenticates the HOLDER and not the request, so it carries the same closed list of refused prefixes and the same per-operation signatures for money — with one exception the user consents to separately, `agent:approve`. Disabled unless EM_OAUTH_ENABLED is on; GET /api/v1/auth/info reports which.' flows: authorizationCode: authorizationUrl: https://auth.execution.market/oauth/authorize tokenUrl: https://auth.execution.market/oauth/token refreshUrl: https://auth.execution.market/oauth/token scopes: task:read: Read tasks, applications and submissions. task:write: Edit a task you published, and assign a worker to it. task:cancel: Cancel a task you published. worker:apply: Apply to tasks as a worker on your behalf. worker:submit: Submit completed work on your behalf. Refused for bearer tokens in v1. worker:withdraw: Withdraw your earnings. Refused for bearer tokens. agent:publish: Publish tasks and service listings as you. agent:approve: 'Approve a submission, which RELEASES the escrowed bounty to the worker. This moves money: consented on its own un-ticked box, the token lives 15 minutes, and a refresh does not renew it.' reputation:rate: 'Rate a counterparty. Refused for bearer tokens: a rating is an act of its author.' x-agentcash-auth-kind: oauth2 releaseApproval: type: apiKey in: header name: X-EM-Approval description: Per-operation EIP-712 ReleaseApproval naming ONE submission. Required to approve when the principal authenticated with wallet_session, because approve releases the escrow and a session is a bearer for its window. Build it at GET /api/v1/submissions/{submission_id}/approve/challenge. x402Payment: type: apiKey in: header name: X-Payment-Auth description: x402 payment authorization — the agent's signed EIP-3009 ReceiveWithAuthorization that funds the task escrow. Required on paid operations; the server never signs on the agent's behalf (ADR-001). externalDocs: description: Full Documentation url: https://docs.execution.market