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

# Get Async Job Status

> Poll an async API job created by endpoints like `POST /chat/completions`.

Use the `job_id` returned by a `202 Accepted` response to check whether the job is still pending or has reached a terminal state.



## OpenAPI

````yaml GET /jobs/{id}
openapi: 3.0.3
info:
  title: GC AI External API
  version: 1.0.0
  description: >-
    The GC AI External API allows programmatic access to GC AI's chat
    capabilities. It's designed for integration with workflow automation tools
    like Zapier, Make, n8n, or custom applications.


    ## Authentication


    All API requests must include an API key in the `Authorization` header:


    ```

    Authorization: gcai_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    ```


    API keys can be created in the GC AI app under **Settings → API**.


    ## Multi-turn Conversations


    Conversations can span multiple turns: pass the `chat_id` returned by a
    completion back on your next request to continue the same chat. See
    [Multi-turn Conversations](/api-reference/concepts/multi-turn).


    ## Current Limitations


    The following is not yet available via API:


    - **Interactive clarification**: the model cannot pause to ask the caller a
    follow-up question; the `askUserQuestions` tool is disabled on the API
    surface


    ## Usage


    Usage is tracked and viewable in the GC AI app under **Settings → API → View
    Usage**.


    ## Support


    For API support, contact [support@gc.ai](mailto:support@gc.ai) or reach out
    to your account representative.
  contact:
    email: support@gc.ai
servers:
  - url: https://app.gc.ai/api/external/v1
    description: Production server
security: []
tags:
  - name: Async Jobs
    description: Poll the status and result of asynchronous API jobs
  - name: Chat
    description: AI chat completion endpoints
  - name: Chats
    description: Chat management, message history, and sharing endpoints
  - name: Files
    description: File upload and management endpoints
  - name: Folders
    description: Folder management endpoints
  - name: Playbooks
    description: Playbook review endpoints
  - name: Profiles
    description: Personal and company profile endpoints
  - name: Projects
    description: Project management endpoints
  - name: Skills
    description: Skill library management endpoints
  - name: Utility
    description: Health check and connectivity endpoints
  - name: Usage
    description: Usage and credit/billing reporting endpoints
paths:
  /jobs/{id}:
    get:
      tags:
        - Async Jobs
      summary: Get async job status
      description: >-
        Poll an async API job created by endpoints like `POST
        /chat/completions`.


        Use the `job_id` returned by a `202 Accepted` response to check whether
        the job is still pending or has reached a terminal state.
      operationId: getAsyncJob
      parameters:
        - schema:
            type: string
            format: uuid
            description: The async job ID
          required: true
          description: The async job ID
          name: id
          in: path
        - schema:
            type: integer
            nullable: true
            minimum: 0
            description: >-
              Optional long-poll wait time in seconds. Use `0` for
              fire-and-forget behavior. If both `wait` and `Prefer: wait=...`
              are supplied, they must match. Values above 90 are clamped.
            example: 0
          required: false
          description: >-
            Optional long-poll wait time in seconds. Use `0` for fire-and-forget
            behavior. If both `wait` and `Prefer: wait=...` are supplied, they
            must match. Values above 90 are clamped.
          name: wait
          in: query
        - schema:
            type: string
            description: >-
              Optional RFC 7240 wait preference, for example `wait=0`. If both
              this header and the `wait` query parameter are supplied, they must
              match.
            example: wait=0
          required: false
          description: >-
            Optional RFC 7240 wait preference, for example `wait=0`. If both
            this header and the `wait` query parameter are supplied, they must
            match.
          name: Prefer
          in: header
      responses:
        '200':
          description: Job found and currently in a terminal state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatCompletionResponse'
        '202':
          description: Job found but not yet complete
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatCompletionResponse'
        '400':
          description: Invalid job ID, wait value, or conflicting wait controls
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or malformed API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Job not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Rate limit exceeded. See [Rate
            Limits](/api-reference/concepts/rate-limits) for the tiers, limits,
            and how to back off.
          headers:
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying after a rate-limit block.
                example: '60'
              required: true
              description: Seconds to wait before retrying after a rate-limit block.
            RateLimit-Limit:
              schema:
                type: string
                description: Request quota for the applicable window.
                example: '3'
              required: true
              description: Request quota for the applicable window.
            RateLimit-Remaining:
              schema:
                type: string
                description: Requests remaining in the current window.
                example: '0'
              required: true
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: string
                description: Seconds until the quota resets.
                example: '60'
              required: true
              description: Seconds until the quota resets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Service temporarily unavailable
          headers:
            Retry-After:
              schema:
                type: string
                description: >-
                  Seconds to wait before retrying after a transient service
                  outage.
                example: '5'
              required: true
              description: >-
                Seconds to wait before retrying after a transient service
                outage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ChatCompletionResponse:
      type: object
      properties:
        job_id:
          type: string
          format: uuid
          description: Async job identifier
        kind:
          type: string
          enum:
            - chat/completions
          description: Stable job kind for this endpoint
        status:
          type: string
          enum:
            - pending
            - running
            - succeeded
            - failed
            - canceled
          description: Current job status
        result:
          $ref: '#/components/schemas/ChatCompletionResult'
        error:
          type: object
          nullable: true
          properties:
            code:
              type: string
            message:
              type: string
          required:
            - code
            - message
          description: Failure payload when the job has failed
        created_at:
          type: string
          description: ISO 8601 creation timestamp
        completed_at:
          type: string
          nullable: true
          description: ISO 8601 completion timestamp, or null when not terminal
      required:
        - job_id
        - kind
        - status
        - result
        - error
        - created_at
        - completed_at
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
        code:
          type: string
          description: >-
            Machine-readable error code present on some errors (e.g.
            `RATE_LIMITED`, `INSUFFICIENT_CREDITS`, `TRIAL_NOT_STARTED`,
            `BILLING_NOT_CONFIGURED`). Branch on this rather than the
            human-readable `error` string.
        message:
          type: string
          description: Additional error details
        details:
          type: object
          additionalProperties:
            nullable: true
          description: Validation error details (for 400 errors)
      required:
        - error
    ChatCompletionResult:
      type: object
      nullable: true
      properties:
        result:
          type: string
          description: The AI-generated response text
          example: >-
            When reviewing a software license agreement, key terms to examine
            include:


            1. **License Grant** - Understand the scope of rights granted...
        chat_id:
          type: string
          format: uuid
          description: >-
            The chat ID. API chats stay out of chat history until you
            materialize them. Pass this ID to `POST /chat/{id}/materialize` to
            surface the chat. See [Chat
            Visibility](/api-reference/concepts/chat-visibility).
        documents:
          type: array
          items:
            $ref: '#/components/schemas/ApiDocument'
          description: >-
            Documents produced during this completion: either edits of an
            attached file (the document editing tool) or newly generated files
            (the document or slide generation tools). Present only when at least
            one document was produced. Each entry exposes a new `file_id` and a
            signed download URL; edits also reference the preserved original via
            `original_file_id`.
        emails:
          type: array
          items:
            $ref: '#/components/schemas/ApiEmail'
          description: >-
            Email drafts produced during this completion by the email drafting
            tool. Present only when at least one email was drafted. Each entry
            is a structured draft (`to`, `subject`, `body`, …) ready to send via
            your own mail client or provider.
        diagrams:
          type: array
          items:
            $ref: '#/components/schemas/ApiDiagram'
          description: >-
            Diagrams produced during this completion by the diagram tool.
            Present only when at least one diagram was produced. Each entry
            exposes validated Mermaid source (`mermaid`) you can render with any
            Mermaid-compatible renderer.
      required:
        - result
        - chat_id
      description: Completion payload when the job has succeeded
    ApiDocument:
      type: object
      properties:
        file_id:
          type: string
          format: uuid
          description: >-
            The new uploaded file ID for the produced document. Use it with
            `POST /chat/completions` `file_ids` to apply further edits to this
            version. Download via `signed_url` for the finished file.
        original_file_id:
          type: string
          format: uuid
          description: >-
            The `file_id` the changes were applied to (edits only). The original
            file is preserved unchanged. Omitted for newly generated documents.
        filename:
          type: string
          description: >-
            Filename of the produced document (edits are prefixed with
            `edited_`).
        original_filename:
          type: string
          description: >-
            Filename of the source file the changes were applied to (edits
            only). Omitted for newly generated documents.
        signed_url:
          type: string
          format: uri
          description: >-
            Time-limited direct download URL (no login required). Valid for 7
            days from job completion. Download promptly; the URL is not
            re-minted, so re-fetching the job after expiry returns the same
            expired URL. For a link you intend to store or email, use
            `download_url` instead.
        download_url:
          type: string
          format: uri
          description: >-
            Permanent, login-gated download link for the produced document.
            Unlike `signed_url` it never expires: it points at a GC AI web page
            that mints a fresh download for a signed-in user with access to the
            file, and redirects to GC AI login otherwise. Use this for links you
            store or email. The produced document inherits the source document's
            access, so it opens for whoever can already see the source: a
            document uploaded to the organization is org-visible, one in a
            project is visible to that project's members, and one in personal
            files stays private to the uploader. Recipients still need a GC AI
            login.
      required:
        - file_id
        - filename
        - signed_url
        - download_url
    ApiEmail:
      type: object
      properties:
        to:
          type: string
          description: >-
            Recipient email address(es), comma-separated. May be an empty string
            when the prompt named no recipient; fill it in before sending.
        cc:
          type: string
          description: CC recipient email address(es), comma-separated.
        bcc:
          type: string
          description: BCC recipient email address(es), comma-separated.
        subject:
          type: string
          description: >-
            Email subject line. Always present, inferred from context when the
            prompt did not specify one.
        body:
          type: string
          description: Email body in markdown.
        plaintext_body:
          type: string
          description: Email body with markdown stripped, for plain-text clients.
      required:
        - to
        - subject
        - body
        - plaintext_body
    ApiDiagram:
      type: object
      properties:
        title:
          type: string
          description: A short descriptive title for the diagram.
        diagram_type:
          type: string
          description: >-
            The semantic type of diagram, e.g. orgChart, dealStructure,
            workflow, timeline, sequence, entityRelationship, or general.
        mermaid:
          type: string
          description: >-
            The diagram source as validated Mermaid syntax. Render it with any
            Mermaid-compatible renderer.
      required:
        - title
        - diagram_type
        - mermaid
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: |-
        API key for authentication. Format: `gcai_xxxxxxxxx`

        Create API keys in the GC AI app under Settings → API.

````