openapi: 3.0.0
info:
  title: Platform API (Beta)
  version: 1.0.0
  description: >
    **Private Preview** - Contact hey@useautumn.com to get access.


    The Platform API allows you to manage organizations and Stripe Connect
    accounts on behalf of your tenants. All endpoints require platform feature
    access.
servers:
  - url: https://api.useautumn.com/v1
security:
  - bearerAuth: []
paths:
  /platform/organizations:
    post:
      summary: Create Organization
      operationId: createPlatformOrganization
      description: >-
        Creates a new organization for a platform tenant. Reuses existing users
        and organizations if they already exist.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationRequest'
      responses:
        '201':
          description: Organization created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateOrganizationResponse'
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Platform feature not enabled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      x-code-samples:
        - lang: curl
          source: |
            curl -X POST 'https://api.useautumn.com/v1/platform/organizations' \
            -H 'Authorization: Bearer am_sk_test_...' \
            -H 'Content-Type: application/json' \
            -d '{
              "user_email": "tenant@example.com",
              "name": "Tenant Organization",
              "slug": "tenant-org",
              "env": "both"
            }'
    get:
      summary: List Organizations
      operationId: listPlatformOrganizations
      description: >-
        Lists all organizations created by your master organization. Supports
        pagination.
      security:
        - bearerAuth: []
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 10
          description: Number of organizations to return (1-100)
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Number of organizations to skip for pagination
      responses:
        '200':
          description: Organizations retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListOrganizationsResponse'
        '403':
          description: Platform feature not enabled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      x-code-samples:
        - lang: curl
          source: >
            curl -X GET
            'https://api.useautumn.com/v1/platform/organizations?limit=20&offset=0'
            \

            -H 'Authorization: Bearer am_sk_test_...'
  /platform/oauth_url:
    post:
      summary: Generate Stripe OAuth URL
      operationId: generateOAuthURL
      description: >-
        Generates a Stripe Connect OAuth URL for a platform organization. Use
        this to allow your tenants to connect their Stripe accounts.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GenerateOAuthURLRequest'
      responses:
        '200':
          description: OAuth URL generated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenerateOAuthURLResponse'
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Organization not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      x-code-samples:
        - lang: curl
          source: |
            curl -X POST 'https://api.useautumn.com/v1/platform/oauth_url' \
            -H 'Authorization: Bearer am_sk_test_...' \
            -H 'Content-Type: application/json' \
            -d '{
              "organization_slug": "tenant-org",
              "env": "test",
              "redirect_url": "https://yourapp.com/stripe/callback"
            }'
  /platform/organizations/stripe:
    post:
      summary: Update Connected Stripe Account
      operationId: updateStripeConfig
      description: >-
        Updates a platform organization's Stripe Connect configuration.
        Associates a Stripe account ID with the organization using your master
        Stripe credentials.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateStripeConfigRequest'
      responses:
        '200':
          description: Stripe configuration updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateStripeConfigResponse'
        '400':
          description: Invalid request parameters or validation failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Organization not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      x-code-samples:
        - lang: curl
          source: >
            curl -X POST
            'https://api.useautumn.com/v1/platform/organizations/stripe' \

            -H 'Authorization: Bearer am_sk_test_...' \

            -H 'Content-Type: application/json' \

            -d '{
              "organization_slug": "tenant-org",
              "test_account_id": "acct_1234567890",
              "live_account_id": "acct_0987654321"
            }'
  /platform/users:
    get:
      summary: List Users
      operationId: listPlatformUsers
      description: >-
        Lists all users created by your master organization. Supports pagination
        and optional expansion of related organizations.
      security:
        - bearerAuth: []
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 10
          description: Number of users to return (1-100)
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Number of users to skip for pagination
        - name: expand
          in: query
          required: false
          schema:
            type: string
          description: >-
            Comma-separated list of fields to expand. Currently supports:
            'organizations'
      responses:
        '200':
          description: Users retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListUsersResponse'
        '403':
          description: Platform feature not enabled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      x-code-samples:
        - lang: curl
          source: >
            curl -X GET
            'https://api.useautumn.com/v1/platform/users?limit=20&offset=0&expand=organizations'
            \

            -H 'Authorization: Bearer am_sk_test_...'
components:
  schemas:
    CreateOrganizationRequest:
      type: object
      required:
        - user_email
        - name
        - slug
      properties:
        user_email:
          type: string
          format: email
          description: >-
            Email address of the organization owner. User will be created if it
            doesn't exist.
        name:
          type: string
          description: Display name for the organization.
        slug:
          type: string
          description: Unique slug for the organization.
        env:
          type: string
          enum:
            - test
            - live
            - both
          default: both
          description: Environment(s) to create API keys for.
    CreateOrganizationResponse:
      type: object
      properties:
        test_secret_key:
          type: string
          nullable: true
          description: >-
            Autumn test API key for the organization (if env is 'test' or
            'both').
        live_secret_key:
          type: string
          nullable: true
          description: >-
            Autumn live API key for the organization (if env is 'live' or
            'both').
    GenerateOAuthURLRequest:
      type: object
      required:
        - organization_slug
        - env
        - redirect_url
      properties:
        organization_slug:
          type: string
          description: The slug of the organization.
        env:
          type: string
          enum:
            - test
            - live
          description: 'Environment: ''test'' or ''live''.'
        redirect_url:
          type: string
          format: uri
          description: URL to redirect to after OAuth completion.
    GenerateOAuthURLResponse:
      type: object
      properties:
        oauth_url:
          type: string
          format: uri
          description: Stripe Connect OAuth URL to redirect the user to.
    UpdateStripeConfigRequest:
      type: object
      required:
        - organization_slug
      properties:
        organization_slug:
          type: string
          description: The slug of the organization (without the org ID prefix).
        test_account_id:
          type: string
          description: Stripe account ID for test environment (e.g., acct_xxx).
        live_account_id:
          type: string
          description: Stripe account ID for live environment (e.g., acct_xxx).
    UpdateStripeConfigResponse:
      type: object
      properties:
        message:
          type: string
          description: Success message.
        organization:
          type: object
          properties:
            id:
              type: string
              description: Internal organization ID.
            slug:
              type: string
              description: Organization slug (without prefix).
    ListUsersResponse:
      type: object
      properties:
        list:
          type: array
          items:
            $ref: '#/components/schemas/PlatformUser'
        total:
          type: number
          description: Total number of users returned.
        limit:
          type: number
          description: Limit used in the query.
        offset:
          type: number
          description: Offset used in the query.
    PlatformUser:
      type: object
      properties:
        email:
          type: string
          format: email
          description: User's email address.
        created_at:
          type: number
          description: Timestamp (milliseconds since epoch) when the user was created.
        organizations:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/PlatformOrganization'
          description: Array of organization objects (only if expand=organizations is set).
    ListOrganizationsResponse:
      type: object
      properties:
        list:
          type: array
          items:
            $ref: '#/components/schemas/PlatformOrganization'
        total:
          type: number
          description: Total number of organizations returned.
        limit:
          type: number
          description: Limit used in the query.
        offset:
          type: number
          description: Offset used in the query.
    PlatformOrganization:
      type: object
      properties:
        slug:
          type: string
          description: Organization slug (without master org prefix).
        name:
          type: string
          description: Organization name.
        created_at:
          type: number
          description: >-
            Timestamp (milliseconds since epoch) when the organization was
            created.
    ErrorResponse:
      type: object
      properties:
        message:
          type: string
          description: Error description.
        code:
          type: string
          description: Error code.
          enum:
            - not_found
            - forbidden
            - invalid_input
            - internal_error
            - not_allowed
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Autumn API key with Bearer prefix
