Appen · Schema

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

Artificial IntelligenceDataAnnotationTraining DataEnterprise

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.
View JSON Schema on GitHub

JSON Schema

appen-job-dto-schema.json Raw ↑
{
  "$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.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/appen-job-dto"
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.