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

# List async operations

> List the operations of your async synthesis jobs. The workspace is resolved from your API key, so no workspace id is needed. Use `-` as the `job` segment to list across every one of your async jobs — this is how you find jobs again after losing an operation name. Add `filter=-done` to see only running jobs. Results cover roughly the last 7 days (operations expire with their results), their order is unspecified, and a page can be short or empty while more results remain — keep paginating until the response has no `nextPageToken`. The fully qualified form, `/lro/v1alpha/workspaces/{workspace}/ttsAsyncJobs/{job}/operations`, remains valid.



## OpenAPI

````yaml get /lro/v1alpha/ttsAsyncJobs/{job}/operations
openapi: 3.0.0
info:
  title: Inworld Text-to-Speech API
  version: v1
  contact:
    name: Inworld AI
    url: https://inworld.ai
    email: support@inworld.ai
servers:
  - url: https://api.inworld.ai
security:
  - inworld_basic: []
tags:
  - name: TextToSpeech
  - name: AudioPromptPreparationService
  - name: SpeechToPhonemesService
paths:
  /lro/v1alpha/ttsAsyncJobs/{job}/operations:
    get:
      summary: List async operations
      description: >-
        List the operations of your async synthesis jobs. The workspace is
        resolved from your API key, so no workspace id is needed. Use `-` as the
        `job` segment to list across every one of your async jobs — this is how
        you find jobs again after losing an operation name. Add `filter=-done`
        to see only running jobs. Results cover roughly the last 7 days
        (operations expire with their results), their order is unspecified, and
        a page can be short or empty while more results remain — keep paginating
        until the response has no `nextPageToken`. The fully qualified form,
        `/lro/v1alpha/workspaces/{workspace}/ttsAsyncJobs/{job}/operations`,
        remains valid.
      operationId: Operations_ListAsyncOperations
      parameters:
        - name: job
          in: path
          required: true
          schema:
            type: string
          description: >-
            A specific async job id to list that job's operations, or `-` to
            list operations across every one of your async jobs.
          example: '-'
        - name: filter
          in: query
          required: false
          schema:
            type: string
            enum:
              - done
              - '-done'
              - NOT done
              - done=true
              - done=false
          description: >-
            Optional. `-done` (or `NOT done`, or `done=false`) returns only
            running jobs; `done` (or `done=true`) only finished ones. Omit for
            all. Any other filter is rejected with `INVALID_ARGUMENT`.
        - name: pageSize
          in: query
          required: false
          schema:
            type: integer
            default: 50
            maximum: 1000
          description: >-
            Upper bound on operations scanned per page, before expired or
            filtered-out entries are removed — so a returned page can be
            smaller. Defaults to 50, capped at 1000.
        - name: pageToken
          in: query
          required: false
          schema:
            type: string
          description: >-
            Opaque cursor from a previous response's `nextPageToken`. Treat it
            as a black box.
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/longrunningListOperationsResponse'
              examples:
                running:
                  summary: One running job
                  value:
                    operations:
                      - name: >-
                          workspaces/{workspace}/ttsAsyncJobs/8f14e45f-ceea-4673-93d8-04f724c8a1b2/operations/1784837936461-p0sEhU
                        done: false
                empty:
                  summary: Empty page, more results remain
                  value:
                    nextPageToken: …opaque…
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >-
            # All of your running async jobs

            curl --location
            'https://api.inworld.ai/lro/v1alpha/ttsAsyncJobs/-/operations?filter=-done'
            \

            --header "Authorization: Basic $INWORLD_API_KEY"
        - lang: python
          label: Python
          source: |-
            import requests

            url = "https://api.inworld.ai/lro/v1alpha/ttsAsyncJobs/-/operations"
            headers = {"Authorization": "Basic <api-key>"}

            operations = []
            params = {"filter": "-done"}
            while True:
                page = requests.get(url, headers=headers, params=params).json()
                operations += page.get("operations", [])
                if "nextPageToken" not in page:
                    break  # absent token means no more results; empty pages are normal
                params["pageToken"] = page["nextPageToken"]

            for op in operations:
                print(op["name"])
components:
  schemas:
    longrunningListOperationsResponse:
      type: object
      description: A page of operations. Order is unspecified.
      properties:
        operations:
          type: array
          items:
            $ref: '#/components/schemas/longrunningOperation'
          description: >-
            Operations on this page. May be absent when the page is empty — an
            empty page does not mean the listing is finished.
        nextPageToken:
          type: string
          description: >-
            Cursor for the next page. Absent when there are no further results —
            paginate until this field is missing, not until a page comes back
            short or empty.
    longrunningOperation:
      type: object
      description: >-
        A [google.longrunning.Operation](https://google.aip.dev/151) tracking an
        asynchronous or batch synthesis job.
      properties:
        name:
          type: string
          description: >-
            Server-assigned operation resource name, in the format
            `workspaces/{workspace}/ttsAsyncJobs/{job}/operations/{operation}`
            for async jobs or
            `workspaces/{workspace}/ttsBatchJobs/{batch}/operations/{operation}`
            for batch jobs. Pass it verbatim as the path of the Get operation
            endpoint to poll for completion.
          example: >-
            workspaces/{workspace}/ttsAsyncJobs/8f14e45f-ceea-4673-93d8-04f724c8a1b2/operations/1784837936461-p0sEhU
        metadata:
          description: >-
            Service-specific metadata associated with the operation. Not
            populated for TTS jobs yet; job metadata is planned for a later
            release, so do not write code that depends on this field staying
            absent.
          nullable: true
          allOf:
            - $ref: '#/components/schemas/protobufAny'
        done:
          type: boolean
          description: >-
            If `false`, the job is still running. If `true`, the job has
            finished and exactly one of `error` or `response` is set.
        error:
          $ref: '#/components/schemas/rpcStatus'
        response:
          description: >-
            Set when the job succeeded. Its `@type` identifies which kind: an
            async job carries SynthesizeSpeechAsyncResponse, a batch job
            SynthesizeSpeechBatchResponse.
          oneOf:
            - $ref: '#/components/schemas/ttsv1SynthesizeSpeechAsyncResponse'
            - $ref: '#/components/schemas/ttsv1SynthesizeSpeechBatchResponse'
    protobufAny:
      type: object
      properties:
        '@type':
          type: string
      additionalProperties: {}
    rpcStatus:
      type: object
      properties:
        code:
          type: integer
          format: int32
          description: >-
            The error code, as specified by [gRPC status
            codes](https://grpc.io/docs/guides/status-codes/).
          example: 5
        message:
          type: string
          description: A short description of the error.
          example: 'Unknown voice: John not found!'
        details:
          type: array
          items:
            $ref: '#/components/schemas/protobufAny'
          example: []
    ttsv1SynthesizeSpeechAsyncResponse:
      type: object
      description: >-
        Result of a completed asynchronous synthesis job, packed into the
        operation's `response` field. The download URLs are pre-signed and
        time-limited: fetch them without an `Authorization` header, and before
        `expireTime`.
      properties:
        '@type':
          type: string
          description: >-
            Type of the serialized message, always
            `type.googleapis.com/ai.inworld.tts.v1.SynthesizeSpeechAsyncResponse`.
          example: type.googleapis.com/ai.inworld.tts.v1.SynthesizeSpeechAsyncResponse
        audioUri:
          type: string
          description: >-
            Pre-signed download URL for the synthesized audio, in the format
            requested via `audioConfig.audioEncoding`.
          example: https://storage.googleapis.com/…/audio.mp3?X-Goog-Signature=…
        timestampsUri:
          type: string
          description: >-
            Pre-signed download URL for the timestamp alignment JSON. Only
            present when `timestampType` was set in the request.
          example: https://storage.googleapis.com/…/timestamps.json?X-Goog-Signature=…
        expireTime:
          type: string
          format: date-time
          description: >-
            Time at which the download URLs expire, approximately 7 days after
            job completion.
          example: '2026-07-30T12:00:00Z'
    ttsv1SynthesizeSpeechBatchResponse:
      type: object
      description: >-
        Result of a completed batch, packed into the operation's `response`
        field. A batch's per-item URLs do not fit in one response, so this names
        a results *file* instead. The URL is pre-signed and time-limited: fetch
        it without an `Authorization` header, and before `expireTime`.
      properties:
        '@type':
          type: string
          description: >-
            Type of the serialized message, always
            `type.googleapis.com/ai.inworld.tts.v1.SynthesizeSpeechBatchResponse`.
          example: type.googleapis.com/ai.inworld.tts.v1.SynthesizeSpeechBatchResponse
        resultsUri:
          type: string
          description: >-
            Pre-signed download URL for the results file, whose contents are
            described by SynthesizeSpeechBatchResults.
          example: https://storage.googleapis.com/…/results.json?X-Goog-Signature=…
        expireTime:
          type: string
          format: date-time
          description: >-
            Time at which the results file and every audio URL inside it expire,
            approximately 7 days after the batch completes.
          example: '2026-08-13T18:13:47Z'
  securitySchemes:
    inworld_basic:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Your [authentication](../../../api-reference/introduction) credentials.
        For Basic authentication, please populate `Basic $INWORLD_API_KEY`. You
        can create a key in one command with the [Inworld
        CLI](../../../tts/resources/inworld-cli): `inworld workspace add-key`.

````