JobDTO
Job Data Transfer Object for updating job settings. ## FIELD OVERVIEW ** REQUIRED (5):** `id`, `projectId`, `teamId`, `title`, `type` ** CORE CONFIG:** `version`, `assignmentLeaseExpiry`, `judgmentsPerRow`, `rowsPerPage`, `displayContributorName`, `judgmentModifiable` ** WORKFLOW:** `state`, `activeStatus`, `feedback`, `sendBackOp`, `unitSegmentType`, `allowSelfQa`, `allowAbandonUnits` ** TIME & LIMITS:** `timeLimitThresholdSec` (0-100%), `enableExpirationTime`, `expirationDurationSet`, `expirationDurationUpdate` ** QUALITY:** `dynamicJudgements` (minimumConfidence 0.0-1.0), `threshold` (0.0-1.0), `maxJudgmentPerContributor` ** FEATURES:** `enableBlueTooth`, `enableShareLink`, `enableExternalAutoAssignJob`, `launchPlatform`, `latestAppVersion` ** SESSION:** `totalSessionNumber`, `reusablePrompt`, `reusablePin`, `maxSkippablePromptNum` ** CONTENT:** `instruction`, `jobCml`, `jobFilter`, `jobCrowd`, `testQuestionSettings` ** BUSINESS:** `payRateType`, `invoiceStatisticsType`, `validationRuleId`, `qaAdvancedOptions` ** METADATA:** `createdAt`, `displayId`, `flowId`, `internalSecret`, `copiedFrom` (read-only fields) ## KEY RULES - TeamId must match query parameter | Job titles must be unique in project - Negative values not allowed for: time, expiration, confidence fields - timeLimitThresholdSec is percentage (0-100), not seconds - When enableExpirationTime > 0, duration fields must be > 0 - WORK jobs cannot have feedback ENABLED
Properties
| Name | Type | Description |
|---|---|---|
| id | string | **REQUIRED**: Unique job identifier (UUID). Identifies the job to update. |
| version | integer | **RECOMMENDED**: Job version for optimistic locking. Prevents conflicting updates. |
| projectId | string | **REQUIRED**: Project identifier (UUID). Must have access to this project. |
| teamId | string | **REQUIRED**: Team identifier (UUID). Must match teamId query parameter. |
| title | string | **REQUIRED**: Job title. Must be unique within project (error 60080 if duplicate). |
| displayId | integer | **READ-ONLY**: Auto-generated human-readable job ID. Default: auto-generated. |
| cycleNumber | integer | **OPTIONAL**: Job cycle number. Default: 0, Range: ≥0. |
| feedback | string | **OPTIONAL**: Contributor feedback setting. Default: DISABLED. WORK jobs cannot have ENABLED. |
| flowId | string | **OPTIONAL**: Workflow identifier (UUID). Default: same as job ID. |
| type | string | **REQUIRED**: Job type. WORK = standard job, QA = quality assurance. WORK jobs cannot have feedback ENABLED. |
| state | string | **OPTIONAL**: Current job state. Controls job execution status. |
| activeStatus | string | **OPTIONAL**: Job active status. Default: ACTIVE. |
| assignmentLeaseExpiry | integer | **RECOMMENDED**: Assignment lease time in seconds. Min: 60, controls how long assignments are held. |
| judgmentsPerRow | integer | **RECOMMENDED**: Judgments required per row. Default: 1, Min: 1. Higher = more consensus. |
| rowsPerPage | integer | **RECOMMENDED**: Rows per assignment page. Min: 1, controls assignment size. |
| displayContributorName | boolean | **OPTIONAL**: Show contributor names. Default: false (anonymous). |
| judgmentModifiable | boolean | **OPTIONAL**: Allow judgment editing after submission. Default: false. |
| sendBackOp | string | **OPTIONAL**: Rejected work handling. Default: SEND_BACK_TO_SAME_CONTRIBUTOR. |
| copiedFrom | stringnull | **READ-ONLY**: ID of job this was copied from (if applicable). - **Default**: null - **Purpose**: Track job lineage for copied jobs - **Note**: Set automatically when copying jobs |
| maxJudgmentPerContributorEnabled | boolean | **OPTIONAL**: Whether to limit judgments per contributor. - **Default**: false - **Purpose**: Enable contributor workload limits - **Related**: Works with maxJudgmentPerContributor field |
| maxJudgmentPerContributor | integer | **OPTIONAL**: Maximum judgments per contributor. - **Default**: 0 (unlimited) - **Range**: ≥ 0 (0 = unlimited, positive values set limit) - **Purpose**: Prevent single contributor from dominating job |
| maxSkippablePromptNum | integer | **OPTIONAL**: Maximum number of skippable prompts. - **Default**: 0 (no skipping allowed) - **Range**: ≥ 0 (0 = no skipping, positive values allow skipping) - **Purpose**: Allow contributors to skip d |
| unitSegmentType | string | **OPTIONAL**: Unit segment type for data presentation. - **Default**: UNIT_ONLY - **Values**: - UNIT_ONLY: Present data as single units - UNIT_SEGMENT: Present data in segments - UNIT_WITH_PREVIEW: In |
| internalSecret | string | **SYSTEM**: Internal secret for job access (auto-generated). - **Default**: Auto-generated secure string - **Purpose**: Internal authentication token - **Note**: Do not modify unless specifically requ |
| createdAt | string | Job creation timestamp |
| allowSelfQa | boolean | Whether self QA is allowed |
| allowAbandonUnits | boolean | Whether units can be abandoned |
| maxNumberOfAllowedAbandonment | integer | Maximum number of allowed abandonments (must be non-negative) |
| sendAbandonedUnitsBackToJob | boolean | Whether abandoned units are sent back to job |
| instruction | string | Job instructions |
| validationRuleId | stringnull | Validation rule identifier |
| enableBlueTooth | boolean | Whether Bluetooth is enabled |
| launchPlatform | array | Launch platforms |
| latestAppVersion | boolean | Whether latest app version is required |
| reusablePrompt | boolean | Whether prompts are reusable |
| reusablePin | boolean | Whether pins are reusable |
| totalSessionNumber | integer | Total number of sessions (0 = no limit, positive values set session limit) |
| firstLaunchTime | stringnull | First launch timestamp |
| promptsEnabling | stringnull | Prompts enabling configuration |
| reviewReasons | string | Review reasons |
| reviewReasonOption | string | Review reason option |
| parentJobId | stringnull | Parent job identifier |
| unitGroupOption | string | Unit group option |
| appendable | boolean | **OPTIONAL**: Allow job data appending. Default: false. |
| enableShareLink | boolean | **OPTIONAL**: Enable job sharing links. Default: false. |
| payRateType | string | **OPTIONAL**: Payment rate type. Default: empty string. |
| invoiceStatisticsType | string | **OPTIONAL**: Invoice statistics calculation type. Default: UNIT_COUNT. |
| operateHistoryId | string | **SYSTEM**: Operation history identifier (auto-generated). |
| jobCml | objectnull | **OPTIONAL**: Job CML (Contributor Markup Language) configuration. |
| jobFilter | objectnull | **OPTIONAL**: Job data filtering configuration. |
| jobCrowd | objectnull | **OPTIONAL**: Job crowd/contributor settings. |
| testQuestionSettings | objectnull | **OPTIONAL**: Test question configuration. jobId and teamId must match main job. |
| timeLimitThresholdSec | integer | **OPTIONAL**: Time limit threshold as percentage (0-100), not seconds. Default: 0 (disabled). |
| enableExternalAutoAssignJob | boolean | **OPTIONAL**: Enable external auto assignment. Default: false. |
| enableExpirationTime | integer | **OPTIONAL**: Expiration control. Default: 0 (disabled). When >0, duration fields must be >0. |
| expirationDurationSet | integer | **OPTIONAL**: Assignment expiration duration (seconds). Default: 0 (disabled), Range: ≥0. |
| expirationDurationUpdate | integer | **OPTIONAL**: Update expiration duration (seconds). Default: 0 (disabled), Range: ≥0. |
| threshold | number | **OPTIONAL**: Job threshold value. Default: 0.0, Range: 0.0-1.0. |
| qaAdvancedOptions | objectnull | **OPTIONAL**: QA advanced configuration options. Default: null. |
| active | boolean | **READ-ONLY**: Whether job is active (computed field). |
| alias | string | **READ-ONLY**: Job alias (auto-generated like W837054 or Q837054). |
| running | boolean | **READ-ONLY**: Whether job is currently running (computed field). |
| draft | boolean | **READ-ONLY**: Whether job is in draft state (computed field). |
| segmented | boolean | **READ-ONLY**: Whether job uses segmentation (computed field). |
| appenConnectCrowd | boolean | **READ-ONLY**: Whether using Appen Connect crowd (computed field). |
| multipleJudgement | boolean | **READ-ONLY**: Whether multiple judgments enabled (computed from judgmentsPerRow > 1). |
| dynamicJudgements | objectnull | **OPTIONAL**: Dynamic judgments configuration. Default: disabled. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/appen/main/json-schema/appen-job-dto-schema.json",
"title": "JobDTO",
"description": "Job Data Transfer Object for updating job settings.\n\n## FIELD OVERVIEW\n\n** REQUIRED (5):** `id`, `projectId`, `teamId`, `title`, `type`\n\n** CORE CONFIG:** `version`, `assignmentLeaseExpiry`, `judgmentsPerRow`, `rowsPerPage`, `displayContributorName`, `judgmentModifiable`\n\n** WORKFLOW:** `state`, `activeStatus`, `feedback`, `sendBackOp`, `unitSegmentType`, `allowSelfQa`, `allowAbandonUnits`\n\n** TIME & LIMITS:** `timeLimitThresholdSec` (0-100%), `enableExpirationTime`, `expirationDurationSet`, `expirationDurationUpdate`\n\n** QUALITY:** `dynamicJudgements` (minimumConfidence 0.0-1.0), `threshold` (0.0-1.0), `maxJudgmentPerContributor`\n\n** FEATURES:** `enableBlueTooth`, `enableShareLink`, `enableExternalAutoAssignJob`, `launchPlatform`, `latestAppVersion`\n\n** SESSION:** `totalSessionNumber`, `reusablePrompt`, `reusablePin`, `maxSkippablePromptNum`\n\n** CONTENT:** `instruction`, `jobCml`, `jobFilter`, `jobCrowd`, `testQuestionSettings`\n\n** BUSINESS:** `payRateType`, `invoiceStatisticsType`, `validationRuleId`, `qaAdvancedOptions`\n\n** METADATA:** `createdAt`, `displayId`, `flowId`, `internalSecret`, `copiedFrom` (read-only fields)\n\n## KEY RULES\n- TeamId must match query parameter | Job titles must be unique in project\n- Negative values not allowed for: time, expiration, confidence fields\n- timeLimitThresholdSec is percentage (0-100), not seconds\n- When enableExpirationTime > 0, duration fields must be > 0\n- WORK jobs cannot have feedback ENABLED\n",
"x-generated": "2026-09-23",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/appen-jobs-api-openapi.yml#/components/schemas/JobDTO",
"type": "object",
"required": [
"id",
"projectId",
"teamId",
"title",
"type"
],
"properties": {
"id": {
"type": "string",
"description": "**REQUIRED**: Unique job identifier (UUID). Identifies the job to update."
},
"version": {
"type": "integer",
"description": "**RECOMMENDED**: Job version for optimistic locking. Prevents conflicting updates."
},
"projectId": {
"type": "string",
"description": "**REQUIRED**: Project identifier (UUID). Must have access to this project."
},
"teamId": {
"type": "string",
"maxLength": 50,
"description": "**REQUIRED**: Team identifier (UUID). Must match teamId query parameter."
},
"title": {
"type": "string",
"description": "**REQUIRED**: Job title. Must be unique within project (error 60080 if duplicate)."
},
"displayId": {
"type": "integer",
"description": "**READ-ONLY**: Auto-generated human-readable job ID. Default: auto-generated."
},
"cycleNumber": {
"type": "integer",
"minimum": 0,
"description": "**OPTIONAL**: Job cycle number. Default: 0, Range: ≥0."
},
"feedback": {
"type": "string",
"enum": [
"ENABLED",
"DISABLED"
],
"description": "**OPTIONAL**: Contributor feedback setting. Default: DISABLED. WORK jobs cannot have ENABLED."
},
"flowId": {
"type": "string",
"description": "**OPTIONAL**: Workflow identifier (UUID). Default: same as job ID."
},
"type": {
"type": "string",
"enum": [
"WORK",
"QA"
],
"description": "**REQUIRED**: Job type. WORK = standard job, QA = quality assurance. WORK jobs cannot have feedback ENABLED."
},
"state": {
"type": "string",
"enum": [
"DRAFT",
"RUNNING",
"PAUSED",
"COMPLETED",
"CANCELLED"
],
"description": "**OPTIONAL**: Current job state. Controls job execution status."
},
"activeStatus": {
"type": "string",
"enum": [
"ACTIVE",
"INACTIVE"
],
"description": "**OPTIONAL**: Job active status. Default: ACTIVE."
},
"assignmentLeaseExpiry": {
"type": "integer",
"minimum": 60,
"description": "**RECOMMENDED**: Assignment lease time in seconds. Min: 60, controls how long assignments are held."
},
"judgmentsPerRow": {
"type": "integer",
"minimum": 1,
"description": "**RECOMMENDED**: Judgments required per row. Default: 1, Min: 1. Higher = more consensus."
},
"rowsPerPage": {
"type": "integer",
"minimum": 1,
"description": "**RECOMMENDED**: Rows per assignment page. Min: 1, controls assignment size."
},
"displayContributorName": {
"type": "boolean",
"description": "**OPTIONAL**: Show contributor names. Default: false (anonymous)."
},
"judgmentModifiable": {
"type": "boolean",
"description": "**OPTIONAL**: Allow judgment editing after submission. Default: false."
},
"sendBackOp": {
"type": "string",
"enum": [
"SEND_BACK_TO_SAME_CONTRIBUTOR",
"SEND_BACK_TO_ANY_CONTRIBUTOR",
"SEND_BACK_TO_POOL",
"IGNORE"
],
"description": "**OPTIONAL**: Rejected work handling. Default: SEND_BACK_TO_SAME_CONTRIBUTOR."
},
"copiedFrom": {
"type": [
"string",
"null"
],
"description": "**READ-ONLY**: ID of job this was copied from (if applicable).\n\n- **Default**: null\n- **Purpose**: Track job lineage for copied jobs\n- **Note**: Set automatically when copying jobs\n"
},
"maxJudgmentPerContributorEnabled": {
"type": "boolean",
"description": "**OPTIONAL**: Whether to limit judgments per contributor.\n\n- **Default**: false\n- **Purpose**: Enable contributor workload limits\n- **Related**: Works with maxJudgmentPerContributor field\n"
},
"maxJudgmentPerContributor": {
"type": "integer",
"minimum": 0,
"description": "**OPTIONAL**: Maximum judgments per contributor.\n\n- **Default**: 0 (unlimited)\n- **Range**: ≥ 0 (0 = unlimited, positive values set limit)\n- **Purpose**: Prevent single contributor from dominating job\n- **Requirement**: Only applies when maxJudgmentPerContributorEnabled = true\n"
},
"maxSkippablePromptNum": {
"type": "integer",
"minimum": 0,
"description": "**OPTIONAL**: Maximum number of skippable prompts.\n\n- **Default**: 0 (no skipping allowed)\n- **Range**: ≥ 0 (0 = no skipping, positive values allow skipping)\n- **Purpose**: Allow contributors to skip difficult assignments\n"
},
"unitSegmentType": {
"type": "string",
"enum": [
"UNIT_ONLY",
"UNIT_SEGMENT",
"UNIT_WITH_PREVIEW"
],
"description": "**OPTIONAL**: Unit segment type for data presentation.\n\n- **Default**: UNIT_ONLY\n- **Values**:\n - UNIT_ONLY: Present data as single units\n - UNIT_SEGMENT: Present data in segments\n - UNIT_WITH_PREVIEW: Include preview capability\n- **Purpose**: Controls how data is structured for contributors\n"
},
"internalSecret": {
"type": "string",
"description": "**SYSTEM**: Internal secret for job access (auto-generated).\n\n- **Default**: Auto-generated secure string\n- **Purpose**: Internal authentication token\n- **Note**: Do not modify unless specifically required\n"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "Job creation timestamp"
},
"allowSelfQa": {
"type": "boolean",
"description": "Whether self QA is allowed"
},
"allowAbandonUnits": {
"type": "boolean",
"description": "Whether units can be abandoned"
},
"maxNumberOfAllowedAbandonment": {
"type": "integer",
"minimum": 0,
"description": "Maximum number of allowed abandonments (must be non-negative)"
},
"sendAbandonedUnitsBackToJob": {
"type": "boolean",
"description": "Whether abandoned units are sent back to job"
},
"instruction": {
"type": "string",
"description": "Job instructions"
},
"validationRuleId": {
"type": [
"string",
"null"
],
"description": "Validation rule identifier"
},
"enableBlueTooth": {
"type": "boolean",
"description": "Whether Bluetooth is enabled"
},
"launchPlatform": {
"type": "array",
"items": {
"type": "string"
},
"description": "Launch platforms"
},
"latestAppVersion": {
"type": "boolean",
"description": "Whether latest app version is required"
},
"reusablePrompt": {
"type": "boolean",
"description": "Whether prompts are reusable"
},
"reusablePin": {
"type": "boolean",
"description": "Whether pins are reusable"
},
"totalSessionNumber": {
"type": "integer",
"minimum": 0,
"description": "Total number of sessions (0 = no limit, positive values set session limit)"
},
"firstLaunchTime": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "First launch timestamp"
},
"promptsEnabling": {
"type": [
"string",
"null"
],
"description": "Prompts enabling configuration"
},
"reviewReasons": {
"type": "string",
"description": "Review reasons"
},
"reviewReasonOption": {
"type": "string",
"description": "Review reason option"
},
"parentJobId": {
"type": [
"string",
"null"
],
"description": "Parent job identifier"
},
"unitGroupOption": {
"type": "string",
"description": "Unit group option"
},
"appendable": {
"type": "boolean",
"description": "**OPTIONAL**: Allow job data appending. Default: false."
},
"enableShareLink": {
"type": "boolean",
"description": "**OPTIONAL**: Enable job sharing links. Default: false."
},
"payRateType": {
"type": "string",
"description": "**OPTIONAL**: Payment rate type. Default: empty string."
},
"invoiceStatisticsType": {
"type": "string",
"enum": [
"UNIT_COUNT",
"JUDGMENT_COUNT",
"TIME_BASED"
],
"description": "**OPTIONAL**: Invoice statistics calculation type. Default: UNIT_COUNT."
},
"operateHistoryId": {
"type": "string",
"description": "**SYSTEM**: Operation history identifier (auto-generated)."
},
"jobCml": {
"type": [
"object",
"null"
],
"description": "**OPTIONAL**: Job CML (Contributor Markup Language) configuration."
},
"jobFilter": {
"type": [
"object",
"null"
],
"description": "**OPTIONAL**: Job data filtering configuration."
},
"jobCrowd": {
"type": [
"object",
"null"
],
"description": "**OPTIONAL**: Job crowd/contributor settings."
},
"testQuestionSettings": {
"type": [
"object",
"null"
],
"description": "**OPTIONAL**: Test question configuration. jobId and teamId must match main job."
},
"timeLimitThresholdSec": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "**OPTIONAL**: Time limit threshold as percentage (0-100), not seconds. Default: 0 (disabled)."
},
"enableExternalAutoAssignJob": {
"type": "boolean",
"description": "**OPTIONAL**: Enable external auto assignment. Default: false."
},
"enableExpirationTime": {
"type": "integer",
"minimum": 0,
"description": "**OPTIONAL**: Expiration control. Default: 0 (disabled). When >0, duration fields must be >0."
},
"expirationDurationSet": {
"type": "integer",
"minimum": 0,
"description": "**OPTIONAL**: Assignment expiration duration (seconds). Default: 0 (disabled), Range: ≥0."
},
"expirationDurationUpdate": {
"type": "integer",
"minimum": 0,
"description": "**OPTIONAL**: Update expiration duration (seconds). Default: 0 (disabled), Range: ≥0."
},
"threshold": {
"type": "number",
"format": "float",
"minimum": 0,
"description": "**OPTIONAL**: Job threshold value. Default: 0.0, Range: 0.0-1.0."
},
"qaAdvancedOptions": {
"type": [
"object",
"null"
],
"description": "**OPTIONAL**: QA advanced configuration options. Default: null."
},
"active": {
"type": "boolean",
"description": "**READ-ONLY**: Whether job is active (computed field)."
},
"alias": {
"type": "string",
"description": "**READ-ONLY**: Job alias (auto-generated like W837054 or Q837054)."
},
"running": {
"type": "boolean",
"description": "**READ-ONLY**: Whether job is currently running (computed field)."
},
"draft": {
"type": "boolean",
"description": "**READ-ONLY**: Whether job is in draft state (computed field)."
},
"segmented": {
"type": "boolean",
"description": "**READ-ONLY**: Whether job uses segmentation (computed field)."
},
"appenConnectCrowd": {
"type": "boolean",
"description": "**READ-ONLY**: Whether using Appen Connect crowd (computed field)."
},
"multipleJudgement": {
"type": "boolean",
"description": "**READ-ONLY**: Whether multiple judgments enabled (computed from judgmentsPerRow > 1)."
},
"dynamicJudgements": {
"type": [
"object",
"null"
],
"description": "**OPTIONAL**: Dynamic judgments configuration. Default: disabled.",
"properties": {
"enableDynamicJudgements": {
"type": "boolean",
"description": "Enable dynamic judgment adjustment. Default: false."
},
"maxDynamicJudgements": {
"type": "integer",
"minimum": 1,
"maximum": 10000,
"description": "Max dynamic judgments allowed. Range: 1-10000."
},
"mode": {
"type": "string",
"enum": [
"MINIMUM_CONFIDENCE",
"MATCHING_JUDGEMENTS"
],
"description": "Dynamic judgment mode. Default: MINIMUM_CONFIDENCE."
},
"minimumConfidence": {
"type": [
"number",
"null"
],
"format": "float",
"minimum": 0,
"maximum": 1.0,
"description": "Confidence threshold. Default: 0.0 (disabled), Range: 0.0-1.0."
},
"matchingJudgements": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Required matching judgments. Min: 1 when used."
},
"enabledQuestions": {
"type": "string",
"description": "JSON string of enabled questions configuration."
},
"id": {
"type": "string",
"description": "Dynamic judgments configuration ID."
},
"version": {
"type": "integer",
"description": "Dynamic judgments configuration version."
}
}
}
}
}
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
curl "https://apis.io/api/v1/json-schemas/appen-job-dto"
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.