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

# Mark a subscription milestone reached

> Declares the milestone reached on an active subscription, which releases the one-off prices billing on it onto the billing schedule: each is invoiced on the day of this call, with `reached_at` as its service date. The milestone must be referenced by one of the subscription's prices. Completing a milestone that is already reached returns it unchanged, so the call is safe to retry.



## OpenAPI

````yaml /api-reference/v2/specs/2026-04-01.json post /subscriptions/{id}/milestones/{key}/complete
openapi: 3.1.0
info:
  description: >-
    Alguna is the AI-native quote-to-revenue platform for B2B companies: CPQ,
    subscription and usage-based billing, invoicing, payment collection, and
    revenue recognition in one system of record. The API operates on one
    versioned agreement per customer: quotes, subscriptions and their versions,
    usage, invoices, payments, and revenue schedules read from it. Official
    SDKs: TypeScript (@alguna/sdk), Python (alguna), Go
    (github.com/alguna-io/alguna-go), Rust (alguna), and the alguna CLI
    (@alguna/cli).
  title: Alguna Public API
  version: '2026-04-01'
servers:
  - url: https://api.alguna.io
    x-fern-server-name: Production
security:
  - bearerAuth: []
tags:
  - name: Billing Events and Metrics
  - name: Checkout Sessions
  - name: Credit Notes
  - name: Credits
  - name: Customer Portal Sessions
  - name: Customers
  - name: Feedback
  - name: Insights
  - name: Integrations
  - name: Invoices
  - name: Merchants
  - name: Payments
  - name: Plans
  - name: Product Bundles
  - name: Products
  - name: Quotes
  - name: Refunds
  - name: Revenue Schedules
  - name: Subscription Changes
  - name: Subscription Versions
  - name: Subscriptions
  - name: Tags
  - name: Tax
  - name: Users
  - name: Wallet Grants
  - name: Wallets
paths:
  /subscriptions/{id}/milestones/{key}/complete:
    post:
      tags:
        - Subscriptions
      summary: Mark a subscription milestone reached
      description: >-
        Declares the milestone reached on an active subscription, which releases
        the one-off prices billing on it onto the billing schedule: each is
        invoiced on the day of this call, with `reached_at` as its service date.
        The milestone must be referenced by one of the subscription's prices.
        Completing a milestone that is already reached returns it unchanged, so
        the call is safe to retry.
      operationId: complete-subscription-milestone
      parameters:
        - in: header
          name: Alguna-Version
          required: true
          schema:
            enum:
              - '2026-04-01'
            type: string
        - in: header
          name: Idempotency-Key
          schema:
            description: >-
              A unique string that makes a retried write safe. If you send the
              same request with the same key within 24 hours, the API returns
              the stored response and does not run the request again. A 5xx or
              429 response is not stored, so a retry with that key runs the
              request again.
            example: ik_a1b2c3d4e5f6
            maxLength: 255
            type: string
        - in: path
          name: id
          required: true
          schema:
            description: Unique identifier for the subscription
            type: string
        - in: path
          name: key
          required: true
          schema:
            description: Unique identifier for the milestone
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompleteMilestoneRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionMilestoneResponse'
          description: Success
          headers:
            Idempotency-Key:
              description: Echo of the idempotency key provided in the request
              schema:
                type: string
            Idempotent-Replayed:
              description: >-
                Whether this response was replayed from a previous request
                (true) or freshly executed (false)
              schema:
                type: boolean
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Bad Request
        '401':
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ErrorResponse'
                  - $ref: '#/components/schemas/GatewayErrorResponse'
          description: Unauthorized
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Forbidden — the organization does not have access to this feature
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Not Found
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            Conflict — a request with this idempotency key is currently being
            processed
          headers:
            Retry-After:
              description: >-
                Seconds to wait before retrying with the same idempotency key.
                Sent only when a request with this key is still being processed;
                a 409 without it is a conflict that a retry will not resolve.
              schema:
                type: integer
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Internal Server Error
        '502':
          description: >-
            Bad Gateway — sent by the infrastructure in front of the API; the
            body is not JSON. Safe to retry.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            Service Unavailable — a dependency is temporarily unavailable. Retry
            with backoff.
        '504':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            Gateway Timeout — the request did not finish in time. Retry with
            backoff; use an idempotency key for writes.
components:
  schemas:
    CompleteMilestoneRequest:
      properties:
        note:
          description: >-
            Free-text note recorded with the completion, such as a shipment
            reference
          example: Shipment DHL-4471
          nullable: true
          type: string
        reached_at:
          description: >-
            The date the milestone was reached (YYYY-MM-DD). Defaults to today;
            may be backdated to the contract start but never set in the future
          example: '2026-03-10'
          nullable: true
          type: string
      type: object
    SubscriptionMilestoneResponse:
      properties:
        completed_at:
          description: >-
            The day the milestone was declared reached: the invoicing date of
            the charge
          format: date-time
          nullable: true
          type: string
        completion_source:
          description: Which surface declared the milestone reached
          enum:
            - dashboard
            - api
          nullable: true
          type: string
        expected_at:
          description: When the milestone is expected to be reached; forecasting only
          format: date-time
          nullable: true
          type: string
        id:
          description: >-
            Milestone record ID, set once the milestone has an expected date or
            has been reached
          example: smst_01hz...
          nullable: true
          type: string
        key:
          description: Milestone key the subscription's prices reference
          example: go_live
          type: string
        name:
          description: Display name
          example: Go Live
          type: string
        note:
          description: Note recorded with the completion
          nullable: true
          type: string
        price_ids:
          description: The subscription's prices that bill when this milestone is reached
          items:
            type: string
          type: array
        reached_at:
          description: 'The day the milestone was reached: the service date on the charge'
          format: date-time
          nullable: true
          type: string
        status:
          description: pending until a completion is recorded, then reached
          enum:
            - pending
            - reached
          example: pending
          type: string
        subscription_id:
          description: Subscription ID
          example: sub_01hz...
          type: string
      required:
        - key
        - name
        - price_ids
        - status
        - subscription_id
      type: object
    ErrorResponse:
      description: The body of every error the API returns.
      properties:
        detail:
          description: Explanation of what went wrong
          type: string
        status:
          description: HTTP status code of the response
          format: int64
          type: integer
        title:
          description: >-
            HTTP status text. Sent only by version, idempotency and
            credit-refusal errors.
          type: string
        type:
          description: Always `about:blank`. Sent only by version and idempotency errors.
          type: string
      required:
        - status
        - detail
      type: object
    GatewayErrorResponse:
      description: >-
        Returned by the API gateway when a request carries no valid API key,
        before the API handles it.
      properties:
        code:
          description: Machine-readable error code, e.g. `unauthenticated`
          type: string
        details:
          nullable: true
          type: object
        message:
          description: Explanation of what went wrong
          type: string
      required:
        - code
        - message
      type: object
  securitySchemes:
    bearerAuth:
      bearerFormat: API Key
      description: API key authentication. Pass your API key as a Bearer token.
      scheme: bearer
      type: http
      x-fern-bearer:
        env: ALGUNA_API_KEY
        name: apiKey

````

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