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

# Preview what creating a company would bill

> Resolve the whole basket a company create would charge - the formation with its state filing fee, every mandatory service the profile auto-attaches, and every service you list - WITHOUT creating anything. Priced by the same resolution the create runs, so it cannot quote a total the create does not charge. Each line carries its own interval, and the lines are not summed. Amounts are estimates - the create resolves again and freezes what it billed.



## OpenAPI

````yaml /partner/openapi.yaml post /companies/price-preview
openapi: 3.1.0
info:
  title: Clemta Partner API
  description: |
    The Clemta partner surface. Authenticate with your API key as a bearer
    token (`Authorization: Bearer clmt_live_` or `clmt_test_`). Keys with
    the `clmt_test_` prefix operate in sandbox mode (`livemode: false`): test
    data never reaches fulfillment or billing.

    Versioning is date-based: pass `Clemta-Version` to pin a
    version, omit it to run on your account's pinned default. The effective
    version is echoed back on every response.
  version: '2026-08-13'
servers:
  - url: https://api.clemta.com/v1
    description: >
      Single host for both modes: `clmt_test_` keys operate in sandbox mode,
      `clmt_live_` keys in live mode.
security:
  - apiKey: []
tags:
  - name: Identity
    description: Identify the calling API key.
  - name: Accounts
    description: >-
      Create and read customer accounts - the incorporators companies are
      created under.
  - name: Companies
    description: Create and read client companies.
  - name: Service orders
    description: Order services against a company and follow their fulfilment.
  - name: Products
    description: The catalog you can offer, at your wholesale prices.
  - name: Tax filings
    description: >-
      Federal and state tax filings on your companies, opened by your client
      against the company's entitlements and worked by Clemta. Read-only. Follow
      them with the tax_filing.* events.
  - name: Files
    description: >-
      Documents Clemta publishes on your companies - formation deliverables,
      filed forms, letters. Read-only. Client KYC uploads are write-only and
      never listed.
  - name: Requirements
    description: >-
      Everything needed from you or your client - identity documents,
      service-order forms, Clemta's asks - as one resolvable resource. Fulfill
      over the API or hand your client a hosted link.
  - name: Status tracking
    description: >-
      End-customer status links - keyless, read-only access to a company's live
      status.
  - name: Events
    description: Poll the partner event stream.
  - name: Webhooks
    description: >-
      Events we deliver to your endpoint, and how to verify them. Each webhook
      below is a request WE send to you. Respond 2xx to acknowledge. Deliveries
      are signed and retried with exponential backoff over multiple days until
      acknowledged. Answer `410 Gone` to have the endpoint disabled and
      deliveries stopped. A `Retry-After` header on a `429` or `503` pushes the
      next attempt back. An endpoint that fails continuously for days is
      disabled automatically and the workspace owner is emailed - no events are
      lost, the stream stays available on `GET /v1/events`.


      ## Verifying a delivery


      Deliveries are signed per the [Standard
      Webhooks](https://www.standardwebhooks.com) specification, carrying BOTH
      schemes in one header: a symmetric `v1` HMAC (verify with your endpoint
      secret and any standardwebhooks library) and an asymmetric `v1a` ed25519
      signature (verify with the endpoint's public key, no shared secret held).
      Use whichever suits your setup.


      Every endpoint has its OWN signing secret (`whsec_...`), shown once when
      you create the endpoint. Each delivery carries three headers:


      - `Clemta-Webhook-Id` - the event id. Stable across retries: use it as an
      idempotency key so a redelivered event is processed once.

      - `Clemta-Webhook-Timestamp` - unix seconds of THIS attempt (a retry
      carries a fresh one).

      - `Clemta-Webhook-Signature` - a space-delimited list of `v1,<base64>`
      signatures. More than one while a secret rotation's overlap window is
      open, one per active secret.


      Each is also sent under its bare Standard Webhooks name (`webhook-id`,
      `webhook-timestamp`, `webhook-signature`) with the same value, which is
      what off-the-shelf standardwebhooks libraries look up.


      To verify by hand:


      1. Build the signed content by joining the id, the timestamp, and the raw
      request body with literal `.` separators: `{id}.{timestamp}.{body}`. Use
      the body exactly as received - do not re-serialize the JSON.

      2. Base64-decode your endpoint secret after the `whsec_` prefix. That is
      the HMAC key.

      3. Compute HMAC-SHA256 over the signed content, base64 encode it, and
      compare it against each `v1,` entry in constant time. Accept if any
      matches, otherwise reject.

      4. Check the timestamp is within 5 minutes of now, to reject replays.


      Because the secret is unique to your endpoint, a signature can only be
      verified by you - a delivery meant for another endpoint cannot be made to
      verify here. Keep the secret confidential. If it leaks, roll the
      endpoint's secret from the Webhooks page of your partner dashboard.
  - name: Sandbox
    description: >-
      Test-key-only endpoints for rehearsing event flows. Trigger a lifecycle
      transition on a test company and receive the matching webhook, without
      waiting for a real formation to progress.
paths:
  /companies/price-preview:
    post:
      tags:
        - Companies
      summary: Preview what creating a company would bill
      description: >-
        Resolve the whole basket a company create would charge - the formation
        with its state filing fee, every mandatory service the profile
        auto-attaches, and every service you list - WITHOUT creating anything.
        Priced by the same resolution the create runs, so it cannot quote a
        total the create does not charge. Each line carries its own interval,
        and the lines are not summed. Amounts are estimates - the create
        resolves again and freezes what it billed.
      operationId: previewCompanyBasket
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyPricePreviewBody'
      responses:
        '200':
          description: The resolved basket.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyPricePreview'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    CompanyPricePreviewBody:
      type: object
      description: >-
        The price-relevant slice of a company create - enough to resolve the
        whole basket.
      required:
        - entity_type
        - state
      properties:
        entity_type:
          type: string
          enum:
            - llc
            - c_corp
        state:
          type: string
          pattern: ^[A-Za-z]{2}$
          description: The formation state, as a 2-letter code.
          example: DE
        pre_existing:
          type: boolean
          description: >-
            Preview for a pre-existing company you bring in (no formation line).
            Defaults to false.
        has_ein:
          type: boolean
          description: >-
            Whether the pre-existing company you bring in already holds an EIN.
            Only a pre_existing company can (a formation is assigned one later),
            so it is ignored otherwise. It changes which services are available
            - an EIN service is for companies without one. Defaults to false.
        owners_count:
          type: integer
          minimum: 1
          maximum: 100
          description: How many owners the company has. Defaults to 1.
        services:
          type: array
          description: >-
            Service product keys to attach. Mandatory services are added
            automatically whether or not they are listed.
          items:
            type: string
        formation_options:
          type: object
          additionalProperties:
            type: string
          description: >-
            Option choices for the formation itself, e.g.
            `{"turnaround":"expedited"}`.
        service_options:
          type: object
          additionalProperties:
            type: object
            additionalProperties:
              type: string
          description: >-
            Per-service option choices, keyed by product key, e.g.
            `{"ein":{"turnaround":"expedited"}}`.
    CompanyPricePreview:
      type: object
      description: >-
        Every line a company create would bill for a stated profile, before
        anything exists: the formation with its state filing fee, every
        mandatory service the profile auto-attaches, and every service listed.
        Each line carries its own interval - they are not summed, since a
        one-time formation and a yearly service are not one number. Amounts are
        estimates: the create resolves again and freezes what it billed.
      required:
        - object
        - currency
        - lines
      properties:
        object:
          type: string
          enum:
            - company_price_preview
          description: Entity name.
        currency:
          type: string
          example: usd
        lines:
          type: array
          items:
            $ref: '#/components/schemas/CompanyBasketLine'
    CompanyBasketLine:
      type: object
      description: >-
        One prospective charge of a company create - the formation or a service,
        with its own amount, interval and any pass-through fees.
      required:
        - kind
        - product_key
        - unit_amount
        - currency
      properties:
        kind:
          type: string
          enum:
            - formation
            - service
          description: Whether this line is the formation itself or a service on it.
        product_key:
          type: string
          example: registered_agent
        unit_amount:
          type: integer
          format: int64
          description: >-
            Your wholesale amount in cents (the override, a matching rule, or
            the default), or the chosen option's amount when one is picked.
        currency:
          type: string
          example: usd
        interval:
          type: string
          description: How this line bills - one_time, monthly or yearly.
          example: one_time
        required:
          type: boolean
          description: >-
            True when the profile auto-attaches this service (mandatory), rather
            than the caller listing it.
        applied_rule:
          type: string
          description: >-
            The price rule that decided the amount, absent when the default or
            an override priced it.
        fees:
          type: array
          description: >-
            Pass-through government or state fee lines for this product, at
            today's amounts.
          items:
            $ref: '#/components/schemas/PricePreviewFee'
    Error:
      type: object
      description: >-
        Error response: a stable machine-readable `code`, human-readable
        `title`/`detail`, and for validation failures an `errors` array naming
        every violating field.
      required:
        - type
        - title
        - status
        - code
      additionalProperties: false
      properties:
        type:
          type: string
          description: Link to the error reference entry for this code.
          example: https://docs.clemta.com/partner/errors#resource_already_exists
        title:
          type: string
          description: Short human summary of the error class.
        status:
          type: integer
          format: int32
          minimum: 100
          maximum: 599
          description: HTTP status code, also included in the body.
        code:
          type: string
          enum:
            - api_key_invalid
            - api_key_expired
            - insufficient_scope
            - ip_address_not_allowed
            - invalid_request
            - invalid_api_version
            - resource_missing
            - method_not_allowed
            - test_mode_only
            - resource_already_exists
            - idempotency_key_mismatch
            - idempotency_key_in_use
            - request_too_large
            - billing_account_inactive
            - entitlement_required
            - rate_limit
            - api_error
          description: Stable machine-readable code - branch on this, never on `detail`.
        detail:
          type: string
          description: Human-readable specifics of this occurrence, wording may change.
        request_id:
          type: string
          description: >-
            Identifier of this request. Quote it in a support request so we can
            trace the failure.
        errors:
          type: array
          description: 'Present on validation failures: one entry per violating field.'
          items:
            type: object
            required:
              - reason
            additionalProperties: false
            properties:
              reason:
                type: string
              location:
                type: string
                description: JSONPath of the failing field, e.g. `$.name`.
              validation_type:
                type: string
                description: Schema keyword that failed.
              how_to_fix:
                type: string
    PricePreviewFee:
      type: object
      description: One prospective pass-through line - a government or state fee.
      required:
        - kind
        - unit_amount
        - currency
      properties:
        kind:
          type: string
          description: The fee's stable kind, the same value the order's `fees` carry.
          example: state_fee
        unit_amount:
          type: integer
          format: int64
          description: Today's amount in cents.
        currency:
          type: string
          example: usd
  responses:
    BadRequest:
      description: Malformed request (e.g. unknown `Clemta-Version`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing, invalid, revoked, or grace-expired API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >
        Your API key, e.g. `Authorization: Bearer clmt_test_`. Live keys use the
        `clmt_live_` prefix.

````