Appen Upload API

File upload operations for importing datasets and data into your projects and jobs. - **Dataset Upload Process:** - **Upload Files**: Send CSV files containing your data to existing projects - **Status Monitoring**: Track upload progress and completion status - **File Validation**: Automatic validation of CSV format, headers, and content - **Supported File Formats:** - **CSV Files**: Primary format for data import - **Encoding**: UTF-8 encoding recommended - **Headers**: Required column headers for data organization - **Data Types**: Text, numeric, date, and structured data support - **Upload Workflow:** 1. **File Preparation**: Ensure CSV format with proper headers 2. **Upload Initiation**: Send file to project with metadata 3. **Processing**: System validates and processes the data 4. **Status Polling**: Monitor status until completion 5. **Data Integration**: Units become available for job assignments - **Key Features:** - **Batch Processing**: Handle large datasets efficiently - **Progress Tracking**: Real-time upload status monitoring - **Error Handling**: Detailed validation error messages - **File Management**: Track uploaded files and their metadata - **Integration Points:** - **Project Association**: Uploads are linked to specific projects - **Unit Creation**: Each row becomes a unit for annotation - **Job Routing**: Units can be sent to jobs for contributor work

Operations 2

POST /v3/jobs/upload.json Upload unit data to an existing project #
GET /v3/jobs/upload/status Get the status of an uploaded file/dataset #

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-upload-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-upload-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Appen AI Data Annotation Platform (ADAP) Upload 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: Upload
  description: File upload operations for importing datasets and data into your projects and jobs.
paths:
  /v3/jobs/upload.json:
    post:
      tags:
      - Upload
      summary: Upload unit data to an existing project
      description: 'Uploads a CSV file to an existing project. The API requires `projectId` and `fileName` as query parameters. Returns upload status and file metadata, including a status polling URL.


        **Supported Data Types:**

        - **Units**: Individual data rows for annotation tasks

        - **Unit Groups**: Collections of related units that can be processed together


        **Date Format Support:**

        Only CSV files with following date formats are supported:

        - `yyyy/MM/dd` (e.g., 2025/03/14)

        - `yyyy/MM/dd HH:mm:ss` (e.g., 2025/03/14 07:52:46)

        - `yyyy-MM-dd` (e.g., 2025-03-14)

        - `yyyy-MM-ddTHH:mm:ss` (e.g., 2025-03-14T07:52:46)


        The status of the upload can be checked by triggering the **Get the status of an uploaded file/dataset API**.'
      operationId: uploadDatasetToProject
      parameters:
      - name: projectId
        in: query
        required: true
        schema:
          type: string
        description: Project identifier
        example: eb4bba9b-1e0b-4565-a74b-0db3820b8d8c
      - name: fileName
        in: query
        required: true
        schema:
          type: string
        description: Name of the file uploaded
        example: abc.csv
      x-codeSamples:
      - lang: curl
        label: cURL
        source: 'curl -X POST "https://api.appen.com/v3/jobs/upload.json?projectId=<projectId>&fileName=<fileName>" \

          -H "Authorization: Token token=<your-api-key>" \

          -H "Content-Type: text/csv" \

          -T "@/path/to/your/file.csv"

          '
      responses:
        '201':
          description: DataSet Upload is Triggered
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                    example: 201
                  details:
                    type: string
                    example: DATASET UPLOAD IS TRIGGERED. Please use Status Poll URL to check the upload status
                  fileId:
                    type: string
                    example: 26eaf8c2-a608-4f4d-aa5d-baebc489bc19
                  projectId:
                    type: string
                    example: eb4bba9b-1e0b-4565-a74b-0db3820b8d8c
                  batchNum:
                    type: integer
                    example: 1
                  statusPollUrl:
                    type: string
                    example: /jobs/upload/status?fileId=26eaf8c2-a608-4f4d-aa5d-baebc489bc19&teamId=d124fcdf-3707-4caf-babb-3da1f5f1ec1e
                  teamId:
                    type: string
                    example: d124fcdf-3707-4caf-babb-3da1f5f1ec1e
                  fileName:
                    type: string
                    example: abc.csv
                  createdAt:
                    type: string
                    format: date-time
                    example: '2025-07-03T19:13:45.456074Z'
                  updatedAt:
                    type: string
                    format: date-time
                    example: '2025-07-03T19:21:23.743529Z'
        '400':
          description: Bad request - Missing file or invalid CSV
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                unsupportedFormat:
                  summary: Unsupported file format
                  value:
                    status: 400
                    errorCode: 2003
                    errorMessage: Unsupported file format. Please upload a CSV file.
                    traceId: 4a4ce5fc11ccf8423f8fc55921d93f7b
                    timestamp: '2025-07-07T06:30:14.774186Z'
                fileNotFound:
                  summary: File not uploaded
                  value:
                    status: 400
                    errorCode: 2018
                    errorMessage: CSV File Not Found in the request/Uploaded CSV File is Empty. Please upload a valid non-empty CSV file.
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
                invalidDateFormat:
                  summary: Invalid date format found in the CSV file
                  value:
                    status: 400
                    errorCode: 2006
                    errorMessage: 'Invalid date format in row {0} column ''{1}'': ''{2}''. Allowed formats: yyyy/MM/dd, yyyy/MM/dd HH:mm:ss, yyyy-MM-dd, yyyy-MM-ddTHH:mm:ss'
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
                UploadNotInitiatedError:
                  summary: Missing Required parameter in the request
                  value:
                    status: 400
                    errorCode: 2007
                    errorMessage: 'missing required parameter: '
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
                fileHeaderEmptyInFile:
                  summary: File Headers are empty
                  value:
                    status: 400
                    errorCode: 2008
                    errorMessage: File Headers are empty
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
                fileHeaderContainsEmptyColumns:
                  summary: File Header contains empty columns
                  value:
                    status: 400
                    errorCode: 2009
                    errorMessage: File Header contains empty columns
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
                fileHeaderContainsDuplicateColumns:
                  summary: File Header contains duplicate columns
                  value:
                    status: 400
                    errorCode: 2010
                    errorMessage: File Header contains duplicate columns
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
                fileHeaderExceedMaxLimit:
                  summary: File Headers Max Limit Exceeded
                  value:
                    status: 400
                    errorCode: 2011
                    errorMessage: File Headers Max Limit Exceeded
                    traceId: e1b2c3d4f5a6b7c8d9e0f1a2b3c4d5e6
                    timestamp: '2025-07-07T06:31:00.000000Z'
        '401':
          description: Unauthorized - Authentication failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleError'
              example:
                error: You need to sign in or sign up before continuing.
        '403':
          description: Forbidden - Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleError'
              example:
                error: Access denied. Check your privileges.
        '409':
          description: A file is already being uploaded to this project. Please try again in sometime.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConflictResponse'
              example:
                code: DATASET_UPLOAD_FAILED
                message: A file is already being uploaded to this project 9034a037-9ee3-4e75-9ec9-d01f73928422. Please try again later.
        '422':
          description: Unsupported file format
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                unsupportedFormat:
                  summary: Unit Limit Reached in CSV File
                  value:
                    status: 422
                    errorCode: 2001
                    errorMessage: Unit Limit Reached. You have uploaded the maximum amount of units (250000) allowed in job.
                    traceId: aedc22fa7ff72c8086a11e69c2c7209c
                    timestamp: '2025-07-07T06:51:46.626387Z'
                csvFileValidationError:
                  summary: CSV File Validation Error
                  value:
                    status: 422
                    errorCode: 2002
                    errorMessage: 'Validation Error: {0}'
                    traceId: aedc22fa7ff72c8086a11e69c2c7209c
                    timestamp: '2025-07-07T06:51:46.626387Z'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                status: 500
                errorMessage: Internal server error.
                traceId: b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6
                timestamp: '2025-07-07T07:00:00.000000Z'
  /v3/jobs/upload/status:
    get:
      tags:
      - Upload
      summary: Get the status of an uploaded file/dataset
      description: Returns the status and metadata for a previously uploaded file. Use the statusPollUrl / Use fileId, teamId from the upload response to poll for status.
      operationId: getUploadStatus
      parameters:
      - name: fileId
        in: query
        required: true
        schema:
          type: string
        description: File identifier
        example: 26eaf8c2-a608-4f4d-aa5d-baebc489bc19
      - name: teamId
        in: query
        required: true
        schema:
          type: string
        description: Team identifier
        example: d124fcdf-3707-4caf-babb-3da1f5f1ec1e
      x-codeSamples:
      - lang: curl
        label: Get Upload Status
        source: "curl -X GET \"https://api.appen.com/v3/jobs/upload/status?fileId=<fileId>&teamId=<teamId>\" \\\n  -H \"Authorization: Token token=<your-api-key>\"\n"
      responses:
        '200':
          description: Upload completed
          content:
            application/json:
              schema:
                type: object
                properties:
                  fileId:
                    type: string
                    example: 26eaf8c2-a608-4f4d-aa5d-baebc489bc19
                  teamId:
                    type: string
                    example: d124fcdf-3707-4caf-babb-3da1f5f1ec1e
                  status:
                    type: string
                    example: UPLOADED
                  details:
                    type: string
                    example: Dataset Uploaded Successfully
                  fileName:
                    type: string
                    example: abc.csv
                  createdAt:
                    type: string
                    format: date-time
                    example: '2025-07-03T19:13:45.456074Z'
                  updatedAt:
                    type: string
                    format: date-time
                    example: '2025-07-03T19:21:23.743529Z'
        '202':
          description: Upload in progress
          content:
            application/json:
              schema:
                type: object
                properties:
                  fileId:
                    type: string
                  teamId:
                    type: string
                  status:
                    type: string
                  details:
                    type: string
                  fileName:
                    type: string
                  createdAt:
                    type: string
                    format: date-time
                  updatedAt:
                    type: string
                    format: date-time
              example:
                fileId: 9fddf60d-9efa-429c-b84e-b4bb9d9bf807
                teamId: d124fcdf-3707-4caf-babb-3da1f5f1ec1e
                status: UPLOADING
                details: Upload in progress
                fileName: newfile.csv
                createdAt: '2025-07-07T07:28:21.409970Z'
                updatedAt: '2025-07-07T07:28:41.553288Z'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: integer
                  errorMessage:
                    type: string
                  traceId:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
              example:
                status: 400
                errorMessage: 'Upload not initiated: missing required parameter: fileId'
                traceId: 2ccc9b70af6feeeb177190672fb3e69c
                timestamp: '2025-07-07T07:30:32.557052Z'
        '403':
          description: Forbidden - Access denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: Access denied. Check your privileges.
        '404':
          description: File not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                  fileId:
                    type: string
                  teamId:
                    type: string
                  status:
                    type: string
                  details:
                    type: string
              example:
                statusCode: 404
                fileId: 9fddf60d-9efa-429c-b84e-b4bb9d9bf807
                teamId: d124fcdf-3707-4caf-babb-3da1f5f1ec1e
                status: UPLOAD_FAILED
                details: File not found or inaccessible.
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: integer
                  errorMessage:
                    type: string
                  traceId:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
              example:
                status: 500
                errorMessage: Internal Server Error.
                traceId: e7f6d4c3b2a1f09876543210abcdef12
                timestamp: '2025-07-07T07:05:00.000000Z'
components:
  schemas:
    SimpleError:
      type: object
      required:
      - error
      properties:
        error:
          type: string
    ConflictResponse:
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
        message:
          type: string
    ErrorResponse:
      type: object
      required:
      - status
      - errorMessage
      - traceId
      - timestamp
      properties:
        status:
          type: integer
        errorMessage:
          type: string
        traceId:
          type: string
        timestamp:
          type: string
          format: date-time
  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`

        '