openapi: 3.0.0
info:
  title: Trigger.dev API
  description: API for triggering events in Trigger.dev
  version: 1.0.0
servers:
  - url: https://api.trigger.dev
    description: Trigger.dev API server
security:
  - BearerAuth: []
paths:
  /api/v1/events:
    post:
      operationId: sendEvent
      externalDocs:
        description: Find more info here
        url: "https://trigger.dev/docs/api/events/send-event"
      tags:
        - Events
      summary: Create an event
      description: Send an event to Trigger.dev to trigger job runs through eventTrigger()
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EventRequest"
      responses:
        "200":
          description: Event successfully sent
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EventResponse"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized - API key is missing or invalid
        "422":
          description: Invalid request body
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /api/v3/batches:
    post:
      operationId: createBatch
      externalDocs:
        description: Find more info here
        url: "https://trigger.dev/docs/triggering"
      tags:
        - Batches
      summary: Create a batch (Phase 1)
      description: |
        Phase 1 of 2-phase batch API. Creates a batch record and optionally blocks the parent run for batchTriggerAndWait.
        After creating a batch, stream items via POST /api/v3/batches/{batchId}/items.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateBatchRequest"
      responses:
        "202":
          description: Batch successfully created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateBatchResponse"
          headers:
            x-trigger-jwt-claims:
              description: JWT claims for the batch
              schema:
                type: string
            x-trigger-jwt:
              description: JWT token for browser clients
              schema:
                type: string
        "400":
          description: Invalid request (e.g., runCount <= 0 or exceeds maximum)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized - API key is missing or invalid
        "422":
          description: Validation error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: Rate limit exceeded
          headers:
            X-RateLimit-Limit:
              description: Maximum number of requests allowed
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Number of requests remaining
              schema:
                type: integer
            X-RateLimit-Reset:
              description: Unix timestamp when the rate limit resets
              schema:
                type: integer
            Retry-After:
              description: Seconds to wait before retrying
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /api/v3/batches/{batchId}/items:
    post:
      operationId: streamBatchItems
      externalDocs:
        description: Find more info here
        url: "https://trigger.dev/docs/triggering"
      tags:
        - Batches
      summary: Stream batch items (Phase 2)
      description: |
        Phase 2 of 2-phase batch API. Accepts an NDJSON stream of batch items and enqueues them.
        Each line in the body should be a valid BatchItemNDJSON object.
        The stream is processed with backpressure - items are enqueued as they arrive.
        The batch is sealed when the stream completes successfully.
      parameters:
        - name: batchId
          in: path
          required: true
          description: The batch ID returned from POST /api/v3/batches
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/x-ndjson:
            schema:
              type: string
              description: |
                NDJSON (newline-delimited JSON) stream where each line is a BatchItemNDJSON object.
                Example:
                {"index":0,"task":"my-task","payload":{"key":"value1"}}
                {"index":1,"task":"my-task","payload":{"key":"value2"}}
          application/ndjson:
            schema:
              type: string
              description: |
                NDJSON (newline-delimited JSON) stream where each line is a BatchItemNDJSON object.
      responses:
        "200":
          description: Items successfully processed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StreamBatchItemsResponse"
        "400":
          description: Invalid request (e.g., invalid JSON, item exceeds maximum size)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized - API key is missing or invalid
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "415":
          description: Unsupported Media Type - Content-Type must be application/x-ndjson or application/ndjson
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "422":
          description: Validation error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

components:
  schemas:
    Error:
      type: object
      properties:
        message:
          type: string
    EventRequest:
      type: object
      properties:
        event:
          type: object
          required:
            - name
          properties:
            name:
              type: string
              description: The name of the event
            payload:
              type: object
              additionalProperties: true
              description: The payload of the event
            context:
              type: object
              additionalProperties: true
              description: An optional context object
            id:
              type: string
              description: Unique identifier for the event. Auto-generated if not provided. If you provide an ID that already exists, the event will not be redelivered.
            timestamp:
              type: string
              format: date-time
              description: Event timestamp. Defaults to current timestamp if not provided.
            source:
              type: string
              description: Event source, default is 'trigger.dev'.
        options:
          type: object
          properties:
            deliverAt:
              type: string
              format: date-time
              description: Optional Date to deliver the event.
            deliverAfter:
              type: integer
              description: Optional delay in seconds before delivering the event.
            accountId:
              type: string
              description: Optional account ID to associate with the event.
    EventResponse:
      type: object
      properties:
        id:
          type: string
          description: The ID of the event that was sent.
        name:
          type: string
          description: The name of the event that was sent.
        payload:
          $ref: "#/components/schemas/DeserializedJson"
        context:
          $ref: "#/components/schemas/DeserializedJson"
          nullable: true
          description: The context of the event that was sent. Null if no context was set.
        timestamp:
          type: string
          format: date-time
          description: The timestamp of the event that was sent.
        deliverAt:
          type: string
          format: date-time
          nullable: true
          description: The timestamp when the event will be delivered. Null if not applicable.
        deliveredAt:
          type: string
          format: date-time
          nullable: true
          description: The timestamp when the event was delivered. Null if not applicable.
        cancelledAt:
          type: string
          format: date-time
          nullable: true
          description: The timestamp when the event was cancelled. Null if the event wasn't cancelled.
    DeserializedJson:
      type: object
      additionalProperties: true
      description: A JSON object that represents the deserialized payload or context.
    CreateBatchRequest:
      type: object
      required:
        - runCount
      properties:
        runCount:
          type: integer
          minimum: 1
          description: Expected number of items in the batch. Must be a positive integer.
        parentRunId:
          type: string
          description: Parent run ID (friendly ID) for batchTriggerAndWait.
        resumeParentOnCompletion:
          type: boolean
          description: Whether to resume parent on completion. Set to true for batchTriggerAndWait.
        idempotencyKey:
          type: string
          description: Idempotency key for the batch. If provided and a batch with this key already exists, the existing batch will be returned.
    CreateBatchResponse:
      type: object
      required:
        - id
        - runCount
        - isCached
      properties:
        id:
          type: string
          description: The batch ID (friendly ID). Use this to stream items via POST /api/v3/batches/{batchId}/items.
        runCount:
          type: integer
          description: The expected run count.
        isCached:
          type: boolean
          description: Whether this response came from a cached/idempotent batch.
        idempotencyKey:
          type: string
          description: The idempotency key if provided.
    BatchItemNDJSON:
      type: object
      required:
        - index
        - task
      properties:
        index:
          type: integer
          minimum: 0
          description: Zero-based index of this item. Used for idempotency and ordering.
        task:
          type: string
          description: The task identifier to trigger.
        payload:
          description: The payload for this task run. Can be any JSON value.
        options:
          type: object
          additionalProperties: true
          description: Options for this specific item.
    StreamBatchItemsResponse:
      type: object
      required:
        - id
        - itemsAccepted
        - itemsDeduplicated
        - sealed
      properties:
        id:
          type: string
          description: The batch ID.
        itemsAccepted:
          type: integer
          description: Number of items successfully accepted.
        itemsDeduplicated:
          type: integer
          description: Number of items that were deduplicated (already enqueued).
        sealed:
          type: boolean
          description: |
            Whether the batch was sealed and is ready for processing.
            If false, the batch needs more items before processing can start.
            Clients should check this field and retry with missing items if needed.
        enqueuedCount:
          type: integer
          description: Total items currently enqueued. Only present when sealed=false to help with retries.
        expectedCount:
          type: integer
          description: Expected total item count. Only present when sealed=false to help with retries.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
