> ## Documentation Index
> Fetch the complete documentation index at: https://unif.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a job

> Runs a search, enrichment or export asynchronously. Use a job when the work exceeds
the synchronous limits: more than 100 enrichment inputs, more than 1,000 search
results, or any export.

The response returns immediately with `status: queued`. Poll
[Get a job](/api-reference/jobs/get-a-job) or subscribe to the `job.completed` webhook.




## OpenAPI

````yaml /api-reference/openapi.yaml post /jobs
openapi: 3.1.0
info:
  title: Unif API
  version: '2026-09-01'
  summary: One schema for commerce data across every channel.
  description: >
    The Unif API returns normalized commerce data — shops, products, creators,
    videos,

    livestreams and categories — through a single schema that does not change
    when the

    underlying data source does.


    Each request runs a cascade across the sources behind a channel, in cost
    order, stopping at

    the first result that verifies. You are charged for the hit, not for the
    attempts. See

    [the waterfall](/docs/concepts/waterfall).


    Every response is denominated in the currency you ask for, scoped to a
    market, and

    measured over a period you control, whichever source answered.


    **Base URL**


    ```

    https://api.unif.dev/v1

    ```


    All requests require a bearer token. See
    [Authentication](/docs/authentication).


    **Conventions**


    - Success and failure are carried by the HTTP status code. There is no
    envelope to unwrap:
      a `200` body is the object itself, and any `4xx` or `5xx` body is an
      [error object](/docs/platform/errors).
    - Lists are cursor-paginated. Read `next_cursor` and stop when `has_more` is
    false.

    - Every response carries `X-Request-Id`. Billable responses also carry
      `X-Unif-Credits-Charged` and `X-Unif-Credits-Remaining`.
    - Monetary fields are converted to the `currency` you request, and every
    object repeats
      the `currency` and `period` it was measured under.
  contact:
    name: Unif Support
    email: support@unif.dev
    url: https://unif.dev/docs
  license:
    name: Proprietary
    url: https://unif.dev/legal/terms
servers:
  - url: https://api.unif.dev/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Meta
    description: Workspace, channel availability and field coverage.
  - name: Shops
    description: Storefronts and sellers.
  - name: Products
    description: Listings, pricing and sales performance.
  - name: Creators
    description: Affiliates and influencers who sell.
  - name: Videos
    description: Short-form video attributed to sales.
  - name: Livestreams
    description: Live selling sessions.
  - name: Categories
    description: The normalized category tree and category-level market data.
  - name: Resolution
    description: Turn a URL, handle or external ID into a Unif entity.
  - name: Jobs
    description: Asynchronous work for large searches, enrichments and exports.
  - name: Lists
    description: Saved sets of entities.
  - name: Trackers
    description: Scheduled re-checks that emit webhook events on change.
  - name: Webhooks
    description: Endpoint registration and delivery settings.
  - name: Usage
    description: Credit balance and per-request consumption.
paths:
  /jobs:
    post:
      tags:
        - Jobs
      summary: Create a job
      description: >
        Runs a search, enrichment or export asynchronously. Use a job when the
        work exceeds

        the synchronous limits: more than 100 enrichment inputs, more than 1,000
        search

        results, or any export.


        The response returns immediately with `status: queued`. Poll

        [Get a job](/api-reference/jobs/get-a-job) or subscribe to the
        `job.completed` webhook.
      operationId: createJob
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JobCreateRequest'
            examples:
              bulkEnrichment:
                summary: Enrich 20,000 shops
                value:
                  type: enrich
                  input:
                    currency: USD
                    period:
                      preset: last_30d
                    fields:
                      - name
                      - metrics.revenue
                      - metrics.revenue_growth_rate
                    inputs_url: https://files.example.com/shops.jsonl
                  webhook_id: whk_01k3m9x7v2q8r4t6y0b1n5d7fa
              exportSearch:
                summary: Export a product search to CSV
                value:
                  type: export
                  input:
                    entity: product
                    format: csv
                    search:
                      market: US
                      period:
                        preset: last_30d
                      filters:
                        revenue:
                          gte: 50000
                      sort:
                        - field: revenue
                          direction: desc
      responses:
        '202':
          description: The job was accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Job'
        '400':
          $ref: '#/components/responses/BadRequest'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      description: >
        A unique key, at most 255 characters. Retrying with the same key returns
        the original

        response instead of doing the work twice. Keys are retained for 24
        hours.
      schema:
        type: string
  schemas:
    JobCreateRequest:
      type: object
      required:
        - type
        - input
      properties:
        type:
          $ref: '#/components/schemas/JobType'
        input:
          type: object
          description: >
            The work to run. The shape depends on `type`:


            - `search` — a search request body, with no `limit` or `cursor`.

            - `enrich` — an enrich request body, or `inputs_url` pointing at a
            JSONL file of inputs.

            - `export` — `entity`, `format` (`csv` or `jsonl`) and a `search`
            body.
          additionalProperties: true
        webhook_id:
          type: string
          description: Notify this endpoint when the job settles. Omit to poll instead.
    Job:
      type: object
      properties:
        id:
          type: string
          examples:
            - job_01k3m9x7v2q8r4t6y0b1n5d7fa
        object:
          type: string
          const: job
        type:
          $ref: '#/components/schemas/JobType'
        status:
          $ref: '#/components/schemas/JobStatus'
        progress:
          type: object
          properties:
            total:
              type:
                - integer
                - 'null'
            completed:
              type: integer
            failed:
              type: integer
        result_count:
          type:
            - integer
            - 'null'
        download_url:
          type:
            - string
            - 'null'
          format: uri
          description: For export jobs, a signed URL valid for 24 hours.
        error:
          $ref: '#/components/schemas/Error'
        credits_charged:
          type: integer
        created_at:
          type: string
          format: date-time
        completed_at:
          type:
            - string
            - 'null'
          format: date-time
    JobType:
      type: string
      enum:
        - search
        - enrich
        - export
    JobStatus:
      type: string
      enum:
        - queued
        - running
        - completed
        - failed
        - cancelled
        - partially_completed
    Error:
      type: object
      properties:
        type:
          type: string
          enum:
            - invalid_request_error
            - authentication_error
            - permission_error
            - not_found_error
            - rate_limit_error
            - billing_error
            - coverage_error
            - api_error
        code:
          type: string
          examples:
            - parameter_invalid
        message:
          type: string
        param:
          type:
            - string
            - 'null'
          description: The offending field
          as a dot-path.: null
        doc_url:
          type: string
          format: uri
        request_id:
          type: string
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/Error'
  responses:
    BadRequest:
      description: The request was malformed or a parameter was invalid.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              type: invalid_request_error
              code: parameter_invalid
              message: filters.revenue.gte must be a non-negative number.
              param: filters.revenue.gte
              doc_url: https://unif.dev/docs/platform/errors#parameter_invalid
              request_id: req_01k3m9x7v2q8r4t6y0b1n5d7fa
    InsufficientCredits:
      description: The workspace has no credits left for this billing period.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              type: billing_error
              code: insufficient_credits
              message: >-
                This request costs 25 credits and 4 remain in the current
                period.
              doc_url: https://unif.dev/docs/platform/credits
              request_id: req_01k3m9x7v2q8r4t6y0b1n5d7fa
  headers:
    RequestId:
      description: Unique ID for this request. Include it in support conversations.
      schema:
        type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Send your workspace API key as a bearer token:


        ```

        Authorization: Bearer unif_sk_live_...

        ```


        Keys are scoped to a single workspace. See
        [Authentication](/docs/authentication).

````