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

# Get setup status

> Where the workspace is in Get started, the same steps the dashboard shows.

Answers the five steps on the dashboard's **Get started** page, so a coding agent can see where setup stands without the dashboard. A Sandbox or Live key gets the same answer. Needs the **Catalog** permission at Read.

* `agentConnectedAt`: when a Sandbox key first made a request. The dashboard shows "Agent connected" from then on.
* `plans`, `customer`, `usage`: a paid plan, a customer, and a check or track exist in the Sandbox. Setting up with a coding agent is done when `plans` is.
* `live.activated`: Go to production is done and Live takes real payments.
* `live.missing`: the production steps left: `stripe_connection` and `webhook` (a live Stripe account Ledger can receive events from), `catalog_sync` (a paid plan in Live, every one synced to Stripe) and `api_key` (a Live key). [Deploy](https://docs.integrateledger.com/getting-started/deploy.md) walks through them.


## OpenAPI

````yaml openapi.json GET /v1/setup
openapi: 3.1.0
info:
  title: Ledger API
  version: 0.1.0
servers:
  - url: https://api.integrateledger.com
    description: Hosted Ledger API
security: []
paths:
  /v1/setup:
    get:
      tags:
        - Usage
      summary: Get setup status
      description: The same five steps the dashboard's Get started page shows.
      operationId: getSetupStatus
      responses:
        '200':
          description: Where the workspace is in Get started.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SetupStatus'
        '401':
          description: Missing or invalid Ledger API key
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '429':
          $ref: '#/components/responses/RateLimited'
      security:
        - ApiKey: []
      x-codeSamples:
        - lang: python
          label: Python SDK
          source: |-
            import os
            from integrateledger import ledger

            client = ledger(api_key=os.environ["LEDGER_API_KEY"])
            client.get_setup_status()
        - lang: bash
          label: cURL
          source: |-
            curl --request GET 'https://api.integrateledger.com/v1/setup' \
              -H "Authorization: Bearer $LEDGER_API_KEY"
        - lang: typescript
          label: TypeScript SDK
          source: >-
            import ledger from "integrateledger";


            const client = new ledger({ apiKey: process.env.LEDGER_API_KEY ?? ""
            });

            await client.getSetupStatus();
components:
  schemas:
    SetupStatus:
      type: object
      properties:
        agentConnectedAt:
          type:
            - string
            - 'null'
          description: When a Sandbox API key first made a request. Null until then.
        plans:
          type: boolean
          description: A paid plan exists in the Sandbox.
        customer:
          type: boolean
          description: A customer exists in the Sandbox.
        usage:
          type: boolean
          description: A check or track has been made in the Sandbox.
        live:
          $ref: '#/components/schemas/LiveSetupStatus'
      required:
        - agentConnectedAt
        - plans
        - customer
        - usage
        - live
    LiveSetupStatus:
      type: object
      properties:
        activated:
          type: boolean
          description: 'Live billing is activated: Go to production is done.'
        missing:
          type: array
          items:
            $ref: '#/components/schemas/LiveSetupStep'
          description: >-
            Production steps not done yet: a Live API key, a live Stripe
            account, a receiving webhook, and every paid Live plan synced to
            Stripe.
        stripeAccessRevokedAt:
          type:
            - string
            - 'null'
          description: >-
            When the company removed Ledger's access to its live Stripe account
            in Stripe. Null while Ledger has access. While it's set, live
            subscriptions keep renewing in Stripe but Ledger can't grant their
            credits: reconnect the same account in Settings › Stripe.
      required:
        - activated
        - missing
        - stripeAccessRevokedAt
    RateLimitError:
      type: object
      properties:
        error:
          type: string
          example: rate_limited
      required:
        - error
    LiveSetupStep:
      type: string
      enum:
        - api_key
        - stripe_connection
        - webhook
        - catalog_sync
  responses:
    RateLimited:
      description: >-
        Too many requests. Wait Retry-After seconds, then retry. See the rate
        limits guide.
      headers:
        Retry-After:
          description: Seconds until a request is allowed again
          schema:
            type: integer
        RateLimit-Limit:
          description: 'The burst: requests allowed at once'
          schema:
            type: integer
        RateLimit-Remaining:
          description: Requests left right now
          schema:
            type: integer
        RateLimit-Reset:
          description: Seconds until the full burst is back
          schema:
            type: integer
        RateLimit-Policy:
          description: >-
            The sustained rate per second and the burst, such as
            200;w=1;burst=1000
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitError'
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.