Appen Route Units API

Unit management operations for handling individual data rows and their distribution across jobs. - **Unit Operations:** - **List Units**: Retrieve and filter units within a project with pagination capabilities - **Send Units to Job**: Route units from projects to specific jobs for annotation work - **Unit Filtering**: Filter units by job status, dataset row type, and other criteria - **Bulk Operations**: Handle multiple units simultaneously for efficient workflow management - **Unit Types:** - **Individual Units**: Single data rows ready for annotation - **Unit Groups**: Collections of related units that can be processed together - **Dataset Rows**: Structured data from uploaded CSV files - **Key Features:** - **Advanced Filtering**: Filter by job status, dataset type - **Pagination Support**: Handle large datasets with efficient pagination - **Sorting Options**: Customizable sorting for better data organization - **Status Tracking**: Monitor unit status across different job assignments - **Unit Lifecycle Management:** 1. **Creation**: Units are created when data is uploaded to projects 2. **Assignment**: Units are distributed to jobs for contributor work 3. **Processing**: Contributors annotate units and submit judgments 4. **Routing**: Units can be moved between jobs (e.g., work to QA) 5. **Completion**: Units receive required judgments and are marked complete

Operations 2

POST /v3/project-flow/projects/units List units in a project #
POST /v3/project-flow/projects/send-to-job Send units to job #

Work with this as data

Every API 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 apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • 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 API
curl "https://apis.io/api/v1/apis/appen:appen-route-units-api"
All apis
curl "https://apis.io/api/v1/apis?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.

OpenAPI Specification

appen-route-units-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Appen AI Data Annotation Platform (ADAP) Route Units API
  description: '# Introduction


    The Appen AI Data Annotation Platform (ADAP) APIs offer a structured, automated approach to ensure high-quality data labeling on a scale.'
servers:
- url: https://api.appen.com/
  description: Production environment
security:
- TokenAuth: []
tags:
- name: Route Units
  description: Unit management operations for handling individual data rows and their distribution across jobs.
paths:
  /v3/project-flow/projects/units:
    post:
      tags:
      - Route Units
      summary: List units in a project
      description: 'Retrieves a paginated list of units that match the specified filters. This endpoint supports filtering, sorting, and pagination to help you query units within a project.

        The filterModel in the request body can be used to specify job status values.


        **Supported jobStatus Values**

        - NEW

        - JUDGABLE

        - SUBMITTED

        - WORKING

        - ABANDONED'
      operationId: listProjectUnits
      parameters:
      - name: projectId
        in: query
        required: true
        description: The project ID to retrieve units from
        schema:
          type: string
          format: uuid
        example: faecd4fa-683f-402e-b7ea-8a904ae92021
      - name: teamId
        in: query
        required: true
        description: The team ID that owns the project
        schema:
          type: string
          format: uuid
        example: f6c0b8cb-de69-495c-980b-2b0e0a6ca288
      requestBody:
        required: true
        description: 'Request body for filtering, sorting, and paginating units. The includeFields parameter is automatically set by the API to return only jobStatus, unitId, and source._golden fields.

          '
        content:
          application/json:
            schema:
              type: object
              required:
              - startRow
              - endRow
              properties:
                startRow:
                  type: integer
                  description: Starting row index for pagination (0-based)
                  example: 0
                endRow:
                  type: integer
                  description: Ending row index for pagination (inclusive)
                  example: 29
                filterModel:
                  type: object
                  description: 'Map of column filters. Each key is a column name, and the value is a filter object.

                    Supported filter types include SET for filtering by specific values.

                    '
                  additionalProperties:
                    type: object
                    properties:
                      filterType:
                        type: string
                        example: SET
                      values:
                        type: array
                        items:
                          type: string
                        example:
                        - NEW
                  example:
                    jobStatus:
                      filterType: SET
                      values:
                      - NEW
                    datasetRowType:
                      filterType: SET
                      values:
                      - UNIT
                      - ''
                sortModel:
                  type: array
                  description: Array of sort models for ordering results
                  items:
                    type: object
                  example: []
                queryString:
                  type: string
                  description: Optional query string for text search
                  example: ''
            examples:
              minimal:
                summary: Minimal request (pagination only)
                value:
                  startRow: 0
                  endRow: 1
              full:
                summary: Full request with filters
                value:
                  startRow: 0
                  endRow: 29
                  filterModel:
                    jobStatus:
                      filterType: SET
                      values:
                      - NEW
                    datasetRowType:
                      filterType: SET
                      values:
                      - UNIT
                      - ''
                  sortModel: []
                  queryString: ''
      x-codeSamples:
      - lang: curl
        label: List Units in Project (Mandatory Fields Only)
        source: "curl -X POST \"https://api.appen.com/v3/project-flow/projects/units?projectId=faecd4fa-683f-402e-b7ea-8a904ae92021&teamId=f6c0b8cb-de69-495c-980b-2b0e0a6ca288\" \\\n  -H \"Authorization: Token token=<your-api-key>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"startRow\": 0,\n    \"endRow\": 1\n  }'\n"
      - lang: curl
        label: List Units in Project (Full Example)
        source: "curl -X POST \"https://api.appen.com/v3/project-flow/projects/units?projectId=faecd4fa-683f-402e-b7ea-8a904ae92021&teamId=f6c0b8cb-de69-495c-980b-2b0e0a6ca288\" \\\n-H \"Authorization: Token token=<your-api-key>\" \\\n-H \"Content-Type: application/json\" \\\n-d '{\n\"startRow\": 0,\n\"endRow\": 29,\n\"filterModel\": {\n  \"jobStatus\": {\n    \"filterType\": \"SET\",\n    \"values\": [\"NEW\"]\n  },\n  \"datasetRowType\": {\n    \"filterType\": \"SET\",\n    \"values\": [\"UNIT\", \"\"]\n  }\n},\n\"sortModel\": [],\n\"queryString\": \"\"\n}'\n"
      - lang: curl
        label: List Units in Project (With Golden Units filter)
        source: "curl -X POST \"https://api.appen.com/v3/project-flow/projects/units?projectId=faecd4fa-683f-402e-b7ea-8a904ae92021&teamId=f6c0b8cb-de69-495c-980b-2b0e0a6ca288\" \\\n-H \"Authorization: Token token=<your-api-key>\" \\\n-H \"Content-Type: application/json\" \\\n-d '{\n   \"startRow\": 0,\n   \"endRow\": 29,\n  \"filterModel\": {\n      \"datasetRowType\": {\n      \"filterType\": \"SET\",\n      \"values\": [\"UNIT\", \"\"]\n        },\n     \"source._golden\": {\n     \"filterType\": \"SET\",\n     \"values\": [\"TRUE\"]\n        }\n    },\n  \"sortModel\": [],\n  \"queryString\": \"\"\n    }'\n"
      responses:
        '200':
          description: Units retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Response message
                    example: success
                  code:
                    type: integer
                    description: Response code
                    example: 200
                  data:
                    type: object
                    description: Response data containing units and pagination information
                    properties:
                      units:
                        type: array
                        description: "Array of unit objects. Each unit is represented as a map where keys are field names \n(e.g., \"jobStatus\", \"unitId\", \"source._golden\") and values are arrays of UnitValueDTO objects.\n"
                        items:
                          type: object
                          additionalProperties:
                            type: array
                            items:
                              type: object
                              properties:
                                value:
                                  type: string
                                  description: The actual value of the field
                                link:
                                  type:
                                  - string
                                  - 'null'
                                  description: Optional link associated with the value
                                tagType:
                                  type:
                                  - string
                                  - 'null'
                                  description: Optional tag type for the value
                      lastRow:
                        type: integer
                        description: Index of the last row returned (0-based)
                        example: 0
                      secondaryColumnFields:
                        type:
                        - array
                        - 'null'
                        description: Secondary column fields if any
                        items:
                          type: string
                      totalElementsInData:
                        type: integer
                        description: Total number of elements in the dataset
                        example: 24
                      totalElements:
                        type: integer
                        description: Total number of elements matching the filter
                        example: 24
                      returnedUnitsCount:
                        type: integer
                        description: Number of units returned in this response
                        example: 10
                  traceId:
                    type: string
                    description: Trace ID for request tracking
                    example: e51daa97-060e-4708-bddc-5d4f63204064
                  time:
                    type: string
                    format: date-time
                    description: Timestamp of the response
                    example: '2025-08-14T10:37:19.129178Z'
              example:
                message: success
                code: 200
                data:
                  units:
                  - jobStatus:
                    - value: JUDGABLE
                      link: null
                      tagType: null
                    unitId:
                    - value: d6325518-6c56-4895-9385-b6da7eb81ccd
                      link: null
                      tagType: null
                    source._golden:
                    - value: 'FALSE'
                      link: null
                      tagType: null
                  lastRow: 0
                  secondaryColumnFields: null
                  totalElementsInData: 24
                  totalElements: 24
                  returnedUnitsCount: 10
                traceId: e51daa97-060e-4708-bddc-5d4f63204064
                time: '2025-08-14T10:37:19.129178Z'
        '400':
          description: Bad request - Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                timestamp: '2025-07-01T10:28:59.893+00:00'
                status: 400
                error: Bad Request
                message: Invalid project ID
                path: /v3/project-flow/projects/units
        '403':
          description: Forbidden - Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                timestamp: '2025-07-01T10:28:59.893+00:00'
                status: 403
                error: Forbidden
                message: Access denied. Check your privileges.
                path: /v3/project-flow/projects/units
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                timestamp: '2025-07-01T10:28:59.893+00:00'
                status: 500
                error: Internal Server Error
                message: Failed to retrieve units
                path: /v3/project-flow/projects/units
      security:
      - TokenAuth: []
  /v3/project-flow/projects/send-to-job:
    post:
      tags:
      - Route Units
      summary: Send units to job
      description: 'Sends units from a project to a specific job. You can send specific units by ID or a percentage of units, with options to carry judgments and handle conflicts.


        ## Request Body Parameters


        - **projectId** (required): The source project identifier

        - **unitIds** (optional): List of specific unit IDs to send. Omit if using `sendEntireGroup: true` to send all units in the project.

        **Note**: You can obtain unitIds from the List units in a project API response. Each unit in the response contains a `unitId` field that can be extracted and used here.

        - **percentage** (optional): Percent of units to send (1-100). Used when sending a subset of units

        - **sendEntireGroup** (optional): If `true`, sends all units in the unit groups to which the specified units belong to. When `true`, `unitIds` is ignored

        - **carryJudgment** (optional): If `true`, existing judgments from previous jobs (e.g., work job) will be carried over to the target job (e.g., QA job). This is useful for routing judgments from work to QA jobs.

        - **overwriteJudgment** (optional): If `true`, the target job (e.g., QA job) can edit/modify the carried judgments. If `false`, judgments are read-only.


        ## Use Cases


        - **Work to QA Routing**: Set `carryJudgment: true` and `overwriteJudgment: true` to route units with their judgments from a work job to a QA job where QA can review and modify the judgments

        - **Data Transfer**: Set `carryJudgment: false` to send units without any existing judgment data

        - **Read-only Review**: Set `carryJudgment: true` and `overwriteJudgment: false` to allow viewing but not editing of carried judgments


        ## Related APIs


        - **List units in a project**: Use the List units in a project API to retrieve available units and extract their `unitId` values for use in this endpoint.


        **Note:**

        - Invoke ‘Pause Job’ API at first before actually sending units to Job. The units can be retrieved using the ‘List units in a project’ API'
      operationId: sendUnitsToJob
      parameters:
      - name: jobId
        in: query
        required: true
        schema:
          type: string
          format: uuid
        description: The target job's ID
        example: 68624cd9-8899-4107-bc3a-f69d91db4d3e
      - name: ignoreConflict
        in: query
        required: true
        schema:
          type: boolean
        description: If true, units already in another job will be moved to this job; otherwise, conflicts cause errors
        example: false
      x-codeSamples:
      - lang: curl
        label: Send Units to Job
        source: "curl -X POST \"https://api.appen.com/v3/project-flow/projects/send-to-job?jobId=<jobId>&ignoreConflict=false\" \\\n  -H \"Authorization: Token token=<your-api-key>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"projectId\": \"aeeabc7b-2e0e-4325-a9c2-e8d33eb3c20c\",\n    \"unitIds\": [\n      \"6206f273-9a6f-43f6-9111-8db2d6c7dcb8\",\n      \"2afcca3f-0fa6-46d3-ac1b-97c734e8521e\",\n      \"a92c1ee2-1cc1-4f44-b847-b2f778d4eb88\",\n      \"929256b6-98b6-469b-8397-cfa7d117c6c3\"\n    ],\n    \"percentage\": 100,\n    \"sendEntireGroup\": false,\n    \"carryJudgment\": true,\n    \"overwriteJudgment\": true\n  }'\n"
      - lang: curl
        label: Send All Units in the Project to a Job
        source: "curl -X POST \"https://api.appen.com/v3/project-flow/projects/send-to-job?jobId=<jobId>&ignoreConflict=false\" \\\n  -H \"Authorization: Token token=<your-api-key>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n      \"projectId\": \"aeeabc7b-2e0e-4325-a9c2-e8d33eb3c20c\",\n      \"filterModel\": {},\n      \"queryString\": \"\",\n      \"percentage\": 100,\n      \"sendEntireGroup\": false,\n      \"carryJudgment\": true,\n      \"overwriteJudgment\": true\n      }'\n"
      - lang: curl
        label: Send Only Specific Units to a Job
        source: "curl -X POST \"https://api.appen.com/v3/project-flow/projects/send-to-job?jobId=<jobId>&ignoreConflict=false\" \\\n  -H \"Authorization: Token token=<your-api-key>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n      \"projectId\": \"aeeabc7b-2e0e-4325-a9c2-e8d33eb3c20c\",\n       \"filterModel\": {\n        \"rowNumber\": {\n          \"filterType\": \"NUMBER\",\n          \"values\": [21],\n          \"criteria\": \"greaterThanOrEqual\"\n           },\n        \"sourceFileBatchNumber\": {\n          \"filterType\": \"NUMBER\",\n          \"values\": [1],\n          \"criteria\": \"equals\"\n           },\n        \"datasetRowType\": {\n          \"filterType\": \"SET\",\n          \"values\": [\"UNIT\"]\n           }\n            },\n      \"queryString\": \"\",\n      \"percentage\": 100,\n      \"sendEntireGroup\": false,\n      \"carryJudgment\": true,\n      \"overwriteJudgment\": true\n      }'\n"
      responses:
        '200':
          description: Units sent to job successfully
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/Response'
                - type: object
                  properties:
                    data:
                      type: object
                      properties:
                        conflictJobNames:
                          type: array
                          items:
                            type: string
                          description: Any job names where conflicts occurred (if ignored)
                          example: []
                        warnings:
                          type:
                          - string
                          - 'null'
                          example: null
                        total:
                          type:
                          - integer
                          - 'null'
                          example: null
                        error:
                          type: boolean
                          example: false
              example:
                message: success
                code: 200
                data:
                  conflictJobNames: []
                  warnings: null
                  total: null
                  error: false
                traceId: trace-123
                time: '2025-07-17T09:22:18.194069Z'
        '400':
          description: Bad request - Conflict or validation errors
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/Response'
                - type: object
                  properties:
                    data:
                      type:
                      - object
                      - 'null'
              example:
                message: Exist conflict jobs.
                code: 400
                data: null
                traceId: trace-123
                time: '2025-07-17T09:22:49.237368Z'
        '403':
          description: Forbidden - Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                timestamp: '2025-07-01T10:28:59.893+00:00'
                status: 403
                error: Forbidden
                message: Access denied. Check your privileges.
                path: /v3/project-flow/projects/send-to-job
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                timestamp: '2025-07-01T10:28:59.893+00:00'
                status: 500
                error: Internal Server Error
                message: Failed to send units to job
                path: /v3/project-flow/projects/send-to-job
      security:
      - TokenAuth: []
components:
  schemas:
    Error:
      type: object
      required:
      - timestamp
      - status
      - error
      - message
      - path
      properties:
        timestamp:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the error occurred
        status:
          type: integer
          description: HTTP status code
        error:
          type: string
          description: HTTP status text
        message:
          type: string
          description: Human-readable error message
        path:
          type: string
          description: API endpoint path that generated the error
        trace:
          type: string
          description: Stack trace (only in development)
      example:
        timestamp: '2025-07-01T10:28:59.893+00:00'
        status: 500
        error: Internal Server Error
        message: Failed to update job
        path: /publicapi/work-service/jobs
    Response:
      type: object
      required:
      - message
      - code
      - data
      - time
      properties:
        message:
          type: string
          description: Response message
          example: success
        code:
          type: integer
          description: HTTP status code
          example: 200
        data:
          description: Response data (type varies by endpoint)
        traceId:
          type:
          - string
          - 'null'
          description: Request trace identifier for debugging
          example: null
        time:
          type: string
          format: date-time
          description: Response timestamp
          example: '2025-07-02T10:02:04.813876Z'
  securitySchemes:
    TokenAuth:
      type: http
      scheme: bearer
      bearerFormat: Token
      description: 'API Token authentication. Pass your API token in the Authorization header:

        `Authorization: Token token=your-api-token-here`

        '