Properties
| Name | Type | Description |
|---|---|---|
| title | string | |
| instructions | string | The steps, one per line. `**bold**` and `*italic*` render; nothing else does. |
| category_id | integer | |
| proofs | array | |
| reward_minor | integer | Pay per approved worker, in cents. The floor is `min_reward_minor` on /version, or `min_reward_screenshot_minor` when the task asks for a screenshot or a file. |
| slots_total | integer | How many workers. |
| auto_approve_hours | integer | Defaults to 0 when omitted, and is never more than 24: a larger value is accepted and stored as 24. Proof is paid as soon as the automatic checks are clear; anything they question is paid within 24 h |
| target_countries | array | Only workers in these countries. Empty = anywhere. |
| target_devices | array | Only workers on these devices — the device they open and claim the task on. `windows` and `mac` are computers running that system (`desktop` is any computer). Empty, or android + ios + a computer, = a |
| audience | string | `my_workers`: only the workers you saved from your own tasks' review page can see and claim it (funding answers 409 `team_empty` until you have saved one). `project`: your project's team first (needs |
| hiring | boolean | A test task: you are choosing workers from it for more work. Workers see it on the task. |
| project_id | integer | One of your projects (not archived; 404 `project_not_found` otherwise). The task is listed on the project; with `audience: "project"` its team gets it first. |
| backup_hours | integer | For `audience: "project"`: hours after funding before the spots the team has not taken open to everyone. 0 = never. |
| max_per_country | integernull | At most this many of the workers from any one country — counted by the country each worker connects from when they start the task. null (or omitted) = no limit; a value at or above `slots_total` limit |
| target_profile | object | |
| verify_method | string | `telegram_join`: the platform checks the join itself. `postback`: your server confirms each conversion with POST /conversions, and that pays the worker. |
| verify_target | string | Required with verify_method. For telegram_join the group or channel (@mygroup); for postback the https landing URL each worker starts from. |
| x_check | boolean | Check each worker's X work automatically: that the X account in their proof follows the account your steps link to, and reposted, replied to or quoted the post they link to (likes cannot be checked — |
| expires_at | string |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/microworker/main/json-schema/microworker-task-create-schema.json",
"title": "TaskCreate",
"x-generated": "2026-10-22",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/_original/microworker-v1-openapi.json#/components/schemas/TaskCreate",
"type": "object",
"required": [
"title",
"instructions",
"reward_minor",
"slots_total"
],
"properties": {
"title": {
"type": "string",
"minLength": 5,
"maxLength": 140
},
"instructions": {
"type": "string",
"minLength": 20,
"maxLength": 8000,
"description": "The steps, one per line. `**bold**` and `*italic*` render; nothing else does."
},
"category_id": {
"type": "integer"
},
"proofs": {
"type": "array",
"minItems": 1,
"maxItems": 5,
"items": {
"$ref": "#/$defs/ProofRequirement"
}
},
"reward_minor": {
"type": "integer",
"minimum": 1,
"maximum": 100000,
"description": "Pay per approved worker, in cents. The floor is `min_reward_minor` on /version, or `min_reward_screenshot_minor` when the task asks for a screenshot or a file."
},
"slots_total": {
"type": "integer",
"minimum": 1,
"maximum": 100000,
"description": "How many workers."
},
"auto_approve_hours": {
"type": "integer",
"minimum": 0,
"maximum": 720,
"default": 0,
"description": "Defaults to 0 when omitted, and is never more than 24: a larger value is accepted and stored as 24. Proof is paid as soon as the automatic checks are clear; anything they question is paid within 24 h unless you reject it first (sooner when this window is shorter); held proofs wait for a person. 0 = instant review. GET /version `payment` has the current figures."
},
"target_countries": {
"type": "array",
"maxItems": 60,
"items": {
"type": "string",
"description": "ISO 3166-1 alpha-2"
},
"description": "Only workers in these countries. Empty = anywhere."
},
"target_devices": {
"type": "array",
"maxItems": 5,
"items": {
"type": "string",
"enum": [
"android",
"ios",
"desktop",
"windows",
"mac"
]
},
"description": "Only workers on these devices — the device they open and claim the task on. `windows` and `mac` are computers running that system (`desktop` is any computer). Empty, or android + ios + a computer, = any device."
},
"audience": {
"type": "string",
"enum": [
"everyone",
"my_workers",
"project"
],
"default": "everyone",
"description": "`my_workers`: only the workers you saved from your own tasks' review page can see and claim it (funding answers 409 `team_empty` until you have saved one). `project`: your project's team first (needs `project_id`; 400 `project_required` without one), then everyone after `backup_hours`."
},
"hiring": {
"type": "boolean",
"default": false,
"description": "A test task: you are choosing workers from it for more work. Workers see it on the task."
},
"project_id": {
"type": "integer",
"description": "One of your projects (not archived; 404 `project_not_found` otherwise). The task is listed on the project; with `audience: \"project\"` its team gets it first."
},
"backup_hours": {
"type": "integer",
"enum": [
0,
6,
24,
72
],
"default": 24,
"description": "For `audience: \"project\"`: hours after funding before the spots the team has not taken open to everyone. 0 = never."
},
"max_per_country": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "At most this many of the workers from any one country — counted by the country each worker connects from when they start the task. null (or omitted) = no limit; a value at or above `slots_total` limits nothing and is stored as null. A worker whose country's places are all taken is refused with 403 `country_quota_full`."
},
"target_profile": {
"$ref": "#/$defs/TargetProfile"
},
"verify_method": {
"type": "string",
"enum": [
"telegram_join",
"postback"
],
"description": "`telegram_join`: the platform checks the join itself. `postback`: your server confirms each conversion with POST /conversions, and that pays the worker."
},
"verify_target": {
"type": "string",
"maxLength": 500,
"description": "Required with verify_method. For telegram_join the group or channel (@mygroup); for postback the https landing URL each worker starts from."
},
"x_check": {
"type": "boolean",
"default": false,
"description": "Check each worker's X work automatically: that the X account in their proof follows the account your steps link to, and reposted, replied to or quoted the post they link to (likes cannot be checked — X keeps them private). A task asking only for follows and reposts is paid on X's answer; otherwise the answer is given to our proof reviewer, and work X shows not done is sent back for a fix. Costs `x_check.price_per_worker_micro` (GET /version, micro-dollars) per worker place, rounded up to the cent, added to the fee — never waived by a plan. Not on conversion (postback) tasks."
},
"expires_at": {
"type": "string",
"format": "date-time"
}
},
"$defs": {
"ProofRequirement": {
"type": "object",
"required": [
"type"
],
"properties": {
"must_show": {
"type": "string",
"maxLength": 100,
"description": "Screenshot rows only: text the screenshot must show (a group or channel name, a username). We read each screenshot on our own server and hold a submission that does not show it."
},
"type": {
"type": "string",
"enum": [
"screenshot",
"text",
"url",
"file",
"code"
],
"description": "`code`: a completion code you show at the end of your own flow; a matching code pays on the spot. At most one per task."
},
"note": {
"type": "string",
"maxLength": 500,
"description": "What the proof must show. Workers are judged against it."
},
"answer": {
"type": "string",
"maxLength": 200,
"writeOnly": true,
"description": "For `code` only: the code (5–64 letters or digits). Stored hashed and never returned; on an edit, omit it to keep the stored one."
}
}
},
"TargetProfile": {
"type": [
"object",
"null"
],
"description": "Who can do this (2026-10-07): only workers whose Skills & assets match see the task and can claim it (others get 403 `profile_not_matching`). Within a part ANY choice will do; every part given must be met. null or every part empty = anybody. Each part given raises the price guide ×1.2, at most ×2.",
"properties": {
"languages": {
"type": "array",
"maxItems": 5,
"items": {
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"enum": [
"en",
"ar",
"arq",
"arz",
"ary",
"kab",
"tzm",
"fr",
"es",
"pt",
"de",
"it",
"nl",
"pl",
"ro",
"ru",
"uk",
"tr",
"fa",
"ps",
"ur",
"sd",
"pa",
"hi",
"bn",
"ne",
"si",
"ta",
"te",
"mr",
"gu",
"ml",
"kn",
"id",
"ms",
"fil",
"vi",
"th",
"my",
"zh",
"ja",
"ko",
"sw",
"ha",
"yo",
"ig",
"pcm",
"am",
"so",
"om",
"zu",
"xh",
"af",
"tw"
]
},
"min": {
"type": "string",
"enum": [
"basic",
"good",
"fluent",
"native"
],
"default": "good",
"description": "This level or better."
}
}
}
},
"skills": {
"type": "array",
"items": {
"type": "string",
"enum": [
"video_editing",
"graphic_design",
"writing",
"translation",
"transcription",
"voice",
"photos",
"data_entry",
"research",
"social_media",
"app_testing",
"ai_rating",
"coding"
]
}
},
"wants": {
"type": "array",
"items": {
"type": "string",
"enum": [
"games",
"surveys",
"social",
"signups",
"testing",
"videos",
"clipping",
"ai_data",
"writing",
"research"
]
},
"description": "The kinds of work they asked for."
},
"game_platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"android",
"ios",
"pc",
"console"
]
}
},
"apps": {
"type": "array",
"items": {
"type": "string",
"enum": [
"tiktok",
"instagram",
"youtube",
"facebook",
"x",
"telegram",
"whatsapp",
"snapchat",
"discord",
"reddit",
"linkedin",
"pinterest",
"threads",
"twitch"
]
}
},
"channel": {
"type": [
"object",
"null"
],
"description": "Runs a page or channel of at least `min_followers` (a band), on one of `platforms` (empty = any).",
"properties": {
"platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"youtube",
"tiktok",
"instagram",
"facebook",
"x",
"telegram",
"twitch",
"snapchat",
"other"
]
}
},
"min_followers": {
"type": "string",
"enum": [
"under_1k",
"1k_10k",
"10k_100k",
"100k_1m",
"over_1m"
],
"default": "under_1k"
}
}
}
}
}
}
}
Work with this as data
Every JSON Schema 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 schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema 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 JSON Schema
curl "https://apis.io/api/v1/json-schemas/microworker-task-create"
All schemas
curl "https://apis.io/api/v1/json-schemas?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.