Every API here is available over the APIs.io API and to AI agents over MCP.
{"openapi":"3.1.0","info":{"title":"Microworker API","version":"1.0.0","description":"Post and fund tasks, track automatic payments and reject submissions from your own server.\n\nAuthenticate with an API key from https://microworker.app/developers/ — send it as `Authorization: Bearer mwk_…` (or `X-API-Key`). Keys are for servers: never put one in a web page or an app.\n\nA key has scopes: `read` (always), `tasks` (create and edit tasks; pause, resume, cancel, edit, slow down and post notes on live ones), `fund` (publish using your balance, and change a live task's places and pay), `review` (reject submissions only) and `conversions` (confirm sign-ups for automatic payment on postback tasks). Employers cannot manually approve submissions. Existing Review keys need a new key with `conversions` to confirm sign-ups.\n\nMoney is in integer cents (`*_minor`). The platform fee is 5% plus $1.00 per task; verified employers pay no fee. Rewards start at $0.02 per worker ($0.05 when the task asks for a screenshot or a file). Current figures are always on GET https://microworker.app/api/version.\n\nLimits: 120 requests a minute per key, 30 of them for funding, changing a live task's places and pay, rejection and conversion confirmations. Errors are `{ \"error\": \"<code>\" }` with an HTTP status.\n\nWebhooks: add an https endpoint and we POST signed events to it — see the webhooks section and the WebhookEvent schema. Conversion postbacks: post a task with verify_method \"postback\" and confirm each real sign-up with POST /conversions — it pays at once; check it later and ask for a fix (POST /submissions/{id}/revise) or take the pay back (POST /submissions/{id}/reverse).","contact":{"email":"contact@microworker.xyz","url":"https://microworker.app/developers/"},"termsOfService":"https://microworker.app/terms/","license":{"name":"Proprietary","url":"https://microworker.app/terms/"},"x-logo":{"url":"https://microworker.app/android-chrome-512x512.png","backgroundColor":"#FFFFFF","altText":"Microworker"}},"externalDocs":{"description":"Guides, examples and API keys","url":"https://microworker.app/developers/"},"servers":[{"url":"https://microworker.app/api/v1"}],"security":[{"apiKey":[]},{"apiKeyHeader":[]}],"tags":[{"name":"Account","description":"Who the key belongs to, and the task categories."},{"name":"Pricing","description":"What to pay per worker, before you post."},{"name":"Tasks","description":"Create, edit, fund, pause and cancel your tasks."},{"name":"Live tasks","description":"A funded task while it runs: change its words, slow it down, post notes to the people working on it, change its places and pay. Pause, resume and cancel are PATCH /tasks/{id}."},{"name":"Review","description":"Follow submissions, reject proof and confirm conversions. Approved work is paid automatically."},{"name":"Money","description":"Your balance, ledger and funding invoices. Funds are added on the website."},{"name":"Webhooks","description":"Signed events sent to your server."}],"paths":{"/me":{"get":{"tags":["Account"],"operationId":"getMe","summary":"The account and key making this call","description":"Who the key belongs to, the scopes it carries and its rate limits. Every key has `read`, so this is a cheap way to check that a key works.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/categories":{"get":{"tags":["Account"],"operationId":"listCategories","summary":"Task categories","description":"The `id`s accepted as `category_id` when creating a task.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/pricing/guide":{"post":{"tags":["Pricing"],"operationId":"priceGuide","summary":"Recommend a reward per worker","description":"What similar work pays, from the posting itself: what it asks for (tests, surveys, sign-ups, installs, joins, follows…), how many steps and proofs it has, a duration it states, where workers must be, the devices they must be on, and whether it is only for your own workers. Screenshot and file proofs include estimated capture/upload handling, even for the first proof and on duration-based recommendations; text, URLs and copied codes have no media handling premium. Every factor comes back in `reasons`. A recommendation only — you set the price, from the floor (`floor_minor`) up. The same guide is on the website's Post a task page.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceGuideRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceGuide"}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limit_exceeded` — see the RateLimit headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/wallet":{"get":{"tags":["Money"],"operationId":"getWallet","summary":"Balance and the 50 newest ledger entries","description":"Balances in minor units: `available_minor` can fund tasks; `escrowed_minor` is held for tasks that are live. Funds are added on the website (crypto, via the hosted checkout) — the API spends them.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletResponse"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/tasks":{"get":{"tags":["Tasks"],"operationId":"listTasks","summary":"Your tasks, newest first","description":"Every task this account has posted, drafts included, newest first. `total` counts the tasks that match `status`. `pending_count` is work waiting for review; `held_count` is the part of it the automatic checks held, which is not paid unless you look at it.","parameters":[{"name":"status","in":"query","description":"Only tasks in this status. Leave it out for every status; an unrecognised value is ignored.","schema":{"type":"string","enum":["draft","open","paused","completed","cancelled","expired"]}},{"name":"page","in":"query","description":"Page number, from 1.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","description":"Tasks per page, 5–100. A value outside the range is clamped to it.","schema":{"type":"integer","minimum":5,"maximum":100,"default":25}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"$ref":"#/components/schemas/TaskSummary"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"}}}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]},"post":{"tags":["Tasks"],"operationId":"createTask","summary":"Create a task (as a draft)","description":"Creates a DRAFT: nothing is charged and no worker can see it until you fund it. `fee_minor` in the answer is a preview; the fee actually charged is worked out again when you fund. With `x_check: true` each worker's X work is checked automatically and `fee_minor` includes the charge for it (`x_check_fee_minor`): 503 `x_check_unavailable` when X checks are off (GET /version `verification.x_check`), 422 `x_check_no_target` when the task names nothing on X a check can see, 422 `x_check_not_for_postback` on a conversion task.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreated"}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Refused by a rule: `content_policy_violation` (with `category` and sometimes `reason`), `code_answer_required`, `verify_chat_not_found`, …","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limit_exceeded` — see the RateLimit headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Switched off for maintenance, e.g. `live_jobs_unavailable` for the live-task calls. Try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"tasks","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/tasks/{id}":{"get":{"tags":["Tasks"],"operationId":"getTask","summary":"One of your tasks, with submission counts","description":"The whole task (instructions, proof requirements, targeting and attachments, and once it is live your `notes`, its `pace` and when its words last changed, `edited_at`) and how many of its submissions are in each state; `approved` includes automatic approvals. A task that is not yours answers 404 `task_not_found`.","parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"},"counts":{"$ref":"#/components/schemas/SubmissionCounts"}}}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]},"patch":{"tags":["Tasks"],"operationId":"updateTask","summary":"Edit a draft, or pause / resume / cancel a task","description":"Field edits are accepted while the task is a draft; on a live task they answer 409 `invalid_task_state` — its words, pace, notes, places and pay have calls of their own (the Live tasks section).\n\nOn a live task send only `action` (other fields sent with it are ignored):\n- `pause` — an open task leaves the board and nobody new can start it. Workers who already started can still send their proof.\n- `unpause` — resume a paused task. It goes through the funding checks again first: 422 `task_link_broken` (with `url`, `kind` and `detail`) when a link no longer works, 422 `task_other_platform` (with `names`) or `task_material_missing` (with `material`) when a worker here could not do it — fix it with POST /tasks/{id}/edit, then resume. 409 `task_under_review` while staff hold it.\n- `cancel` — end a draft, open or paused task and refund the unspent escrow to your balance. Refused with 409 `cannot_cancel_with_pending_submissions` while proof waits for its review, and `cannot_cancel_with_open_disputes` while a dispute is open.","parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"refunded_minor":{"type":"integer","description":"On cancel: what came back to your balance."},"match_credit_returned_minor":{"type":"integer","description":"On cancel, when switch-offer match credit was left in the task: it goes back to your offer, not your balance."},"proofs":{"type":"array","items":{"$ref":"#/components/schemas/ProofRequirement"}}}}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`invalid_task_state` (a field edit on a live task, pausing a task that is not open, resuming one that is not paused), `task_under_review`, `cannot_cancel_with_pending_submissions`, `cannot_cancel_with_open_disputes`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"`task_link_broken` with `url`, `kind` and `detail`, `task_other_platform` with `names`, `task_material_missing` with `material` — resuming a task that still does not work. It stays paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limit_exceeded` — see the RateLimit headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"tasks","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/tasks/{id}/media":{"post":{"tags":["Tasks"],"operationId":"addTaskMedia","summary":"Attach pictures or video to a draft","description":"multipart/form-data with one or more `media` files. Workers see them with the instructions. Limits (count, size, types) are in `task_media` on GET https://microworker.app/api/version.","parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"media":{"type":"array","items":{"type":"string","format":"binary"}},"step_index":{"type":"array","items":{"type":"integer"},"description":"Optional, one per file: the instruction step (0-based) the file belongs to."}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"media":{"type":"array","items":{"$ref":"#/components/schemas/Media"}}}}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The object is in the wrong state for this call, e.g. `invalid_task_state`, `submission_not_pending`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"tasks","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/tasks/{id}/media/{mediaId}":{"delete":{"tags":["Tasks"],"operationId":"removeTaskMedia","summary":"Remove an attachment from a draft","description":"Drafts only: a funded task's attachments cannot change (409 `invalid_task_state`). Answers with the draft's remaining attachments.","parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer","minimum":1}},{"name":"mediaId","in":"path","required":true,"description":"Media id","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"media":{"type":"array","items":{"$ref":"#/components/schemas/Media"}}}}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The object is in the wrong state for this call, e.g. `invalid_task_state`, `submission_not_pending`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"tasks","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/tasks/{id}/fund":{"post":{"tags":["Tasks"],"operationId":"fundTask","summary":"Fund a draft and publish it","description":"Moves reward × workers + the platform fee from your available balance into escrow and publishes the task. The posting is screened first: a refusal is a 422 `content_policy_violation` and no money moves. Some kinds of task (gambling, software downloads, and categories with a `min_plan`) need a live plan: without one the answer is a 403 `verified_required` with `category` and `plan`, and the task stays a draft. A task for `my_workers` answers 409 `team_empty` while you have saved no worker, and a task for a project's team (`audience: \"project\"`) while its project has nobody in it; nothing is charged. A team-first task opens to everyone `backup_hours` after funding (`open_to_all_at`). A `max_per_country` at or above the worker count being funded is cleared, since it would limit nothing. A first task, or one the screen flags, may publish with `under_review: true`. When our AI reviewer refuses a posting a person may still approve, an account without a plan gets a 403 `verified_required` with `review: true` and the reviewer's `reason`; with a plan it is funded and held for a person (`under_review: true`, `review: \"person\"`) until our team approves it or declines it (the escrow comes back). A task with `x_check` also escrows the X-check charge for every place, at today's price (frozen on the task; never waived by a plan): 503 `x_check_unavailable` when X checks are off, 422 `x_check_no_target` when the draft no longer names anything on X. Needs the `fund` scope.","parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"escrow_minor":{"type":"integer"},"under_review":{"type":"boolean"},"match_credit_minor":{"type":"integer","description":"Present only when switch-offer match credit (microworker.app/migrate) paid part of the worker pay."}}}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`insufficient_balance` — add funds on the website first. `earnings_cannot_fund` (with `added_minor` — what of your balance can pay for jobs: money you added and credit — and `needed_minor`): money you EARNED doing tasks cannot pay for jobs; add funds. Or `verified_plan_required` when API access needs the verified plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The object is in the wrong state for this call, e.g. `invalid_task_state`, `submission_not_pending`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Refused by a rule: `content_policy_violation` (with `category` and sometimes `reason`), `code_answer_required`, `verify_chat_not_found`, …","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limit_exceeded` — see the RateLimit headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"fund","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/tasks/{id}/submissions":{"get":{"tags":["Review"],"operationId":"listSubmissions","summary":"Submissions on one of your tasks","description":"Each carries the automatic checks' verdict: `check_status` is `clear`, `warn` or `hold` (held proof is excluded from automatic payment), and `check_flags` says what was found. The `approved` filter includes automatic approvals; `auto_approved` selects only automatic approvals. Screenshot paths are fetched with GET /proofs/{file}.","parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer","minimum":1}},{"name":"status","in":"query","description":"Only submissions in this status: `approved` includes automatic approvals, `auto_approved` selects only those. Leave it out for every status.","schema":{"type":"string","enum":["claimed","pending","approved","rejected","auto_approved"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"integer"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/Submission"}}}}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"read","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/submissions/{id}/reject":{"post":{"tags":["Review"],"operationId":"rejectSubmission","summary":"Reject a submission","description":"No money moves and the slot goes back to the pool for another worker. Say why — the worker sees `rejection_reason`.","parameters":[{"name":"id","in":"path","required":true,"description":"Submission id","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"rejection_reason":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The object is in the wrong state for this call, e.g. `invalid_task_state`, `submission_not_pending`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limit_exceeded` — see the RateLimit headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"review","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/submissions/{id}/revise":{"post":{"tags":["Review"],"operationId":"askForFix","summary":"Ask the worker to fix conversion work","description":"On your own conversion (postback) task: send the work back with a note the worker reads as written, and a time to fix it (`hours`, 1–24, the default; more is cut to it). Their personal link keeps working. On work not paid yet (claimed, or \"I've finished\") nothing is paid until you confirm it with POST /conversions. On PAID work (up to 30 days after it was paid) the pay stays — confirm it again with the same click before `fix.due_at` and it is kept, or it is taken back automatically as not done, with your note as the reason. At most 2 fix requests per submission; a new one replaces an open one. Proof tasks are checked by the platform, which asks for fixes itself.","parameters":[{"name":"id","in":"path","required":true,"description":"Submission id","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["note"],"properties":{"note":{"type":"string","minLength":5,"maxLength":500},"hours":{"type":"integer","minimum":1}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"submission_id":{"type":"integer"},"status":{"type":"string"},"fix":{"$ref":"#/components/schemas/ConversionFix"}}}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`submission_not_revisable` (not a conversion task, or work that can no longer be fixed), `fix_limit_reached`, `reverse_window_closed` (paid too long ago) or `task_not_open`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limit_exceeded` — see the RateLimit headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`conversions_unavailable` — switched off for maintenance. Nothing changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-scope":"review","security":[{"apiKey":[]},{"apiKeyHeader":[]}]}},"/submissions/{id}/reverse":{"post":{"tags":["Review"],"operationId":"reverseConversion","summary":"Take back the pay for conversion work that was not done","description":"On your own conversion (postback) task, for work you confirmed and we paid, up to 30 days after it was paid: your later check found it not done (the follow is not in the follower list). The pay comes back — to the task, with the place reopened, while it is live; else to your balance — and the submission becomes rejected with your `reason`, which the worker reads. There is no fine. If the worker's earned balance cannot cover it, the rest is kept from their next pay. The worker can dispute it, and a person decides; if they side with the worker the pay is restored. Once per submission.","parameters":[{"name":"id","in":"path","required":true,"description":"Submission id","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","minLength":5,"maxLength":500}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"submission_id":{"type":"integer"},"status":{"type":"string","enum":["rejected"]},"took_minor":{"type":"integer","description":"What the work had paid, decided to come back."},"taken_minor":{"type":"integer","description":"What came back at once; the rest (`debt_minor`) comes from the worker's next pay."},"debt_minor":{"type":"integer"},"back_to":{"type":["string","null"],"enum":["escrow","balance",null],"description":"`escrow`: back in the task, its place open again; `balance`: back in your balance."},"reopened":{"type":"boolean"}}}}}},"400":{"description":"Invalid input (`validation_failed`, with zod `issues`), or a named rule such as `reward_below_minimum`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`api_key_required` or `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope` (the key lacks the scope named in `required`), `account_banned`, `account_suspended` or `email_not_verified`. Funding answers `verified_required` (with `category` and `plan`) for a kind of task only a plan may post — and, with `review: true` and the reviewer's `reason`, for a posting our AI reviewer refused that a person may still approve once you have the plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours — the API never confirms that another account's object exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`submission_not_reversible` (not paid conversion work, already taken back once, or a dispute was decided for the worker) or `reverse_window_closed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"
# --- truncated at 32 KB (93 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/microworker/refs/heads/main/openapi/_original/microworker-v1-openapi.json