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

# Estimate the fee of starting a family

> The exact fee `POST /v1/fine-tuning/jobs` would hold for the same body now, without
max_price_usd, and the training tokens and steps it is for. It reads and counts the
dataset as the start does, and refuses what the start would about the dataset, the family
name, the base, the rows and the steps. Nothing is queued or held, and credit, storage and
queue room are checked when the job starts. The estimate is exact if nothing changes
before you start; pass it as max_price_usd to cap the price.



## OpenAPI

````yaml /openapi.json post /v1/fine-tuning/jobs/estimate
openapi: 3.1.0
info:
  title: DecisionOne workbench
  description: >-
    Native decisions, versioned datasets, adaptation and shared-base deployment.
    Authenticate with `Authorization: Bearer d1_sk_...` when accounts are on. A
    short guide for coding agents is at /llms.txt. Hosted account APIs accept a
    Bearer API key or a browser session. An API key reads its account but can't
    change it: keys, billing and settings change in the console. Browser
    mutations require the configured Origin and X-CSRF-Token from /auth/session.
    Account recovery and history remain available to blocked accounts.
    Waitlisted accounts can read their account summary and model catalogue and
    request early access; private member APIs require admission. Money fields
    ending in _usd are exact decimal strings; never interpret them as integer
    cents. Authenticated customer reads and existing-operation replays share
    read_rpm, and other customer writes except decisions and their estimates
    share write_rpm. Exhausted budgets return 429 with Retry-After; unavailable
    admission storage returns 503.
  version: 0.1.0
servers:
  - url: https://console.sqwish.ai
security: []
tags:
  - name: Decisions
    description: Probabilities for questions with fixed outcomes.
  - name: Models
    description: Base models, and fine-tuned models by their numbers.
  - name: Families
    description: >-
      Lines of models trained on one dataset, and the switches that let them
      answer calls.
  - name: Datasets
    description: >-
      Validated training examples. A dataset grows in versions, and a version
      never changes.
  - name: Evaluations
    description: Reusable model results on a dataset's fixed evaluation rows.
  - name: Fine-tuning
    description: Training jobs, their events and held-out results.
  - name: Prompt tuning
    description: Better wording for a decision, tested on your rows. Words, not weights.
  - name: Labeling
    description: Teacher labels for real queries, reviewed by you.
  - name: Accounts
    description: Email OTP sign-in, revocable sessions, security and API keys.
  - name: Billing
    description: Exact USD balances, purchases, automatic top-ups and referrals.
  - name: Integrations
    description: Endpoints other tools call, such as Claude Code.
  - name: System
    description: Health and discovery.
paths:
  /v1/fine-tuning/jobs/estimate:
    post:
      tags:
        - Fine-tuning
      summary: Estimate the fee of starting a family
      description: >-
        The exact fee `POST /v1/fine-tuning/jobs` would hold for the same body
        now, without

        max_price_usd, and the training tokens and steps it is for. It reads and
        counts the

        dataset as the start does, and refuses what the start would about the
        dataset, the family

        name, the base, the rows and the steps. Nothing is queued or held, and
        credit, storage and

        queue room are checked when the job starts. The estimate is exact if
        nothing changes

        before you start; pass it as max_price_usd to cap the price.
      operationId: estimateFineTuningJob
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JobEstimate'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                properties:
                  currency:
                    type: string
                    const: USD
                    title: Currency
                  price_usd:
                    description: >-
                      The fee a fine-tune started now with the same body would
                      hold, as exact USD: its base's
                      fine_tune_million_tokens_usd for trained_tokens, and at
                      least fine_tune_minimum_usd. 0 when it would be free. The
                      job's price_usd is this sum while the prices, the account,
                      the dataset and the family stay as they are; send it as
                      max_price_usd, and a job that would cost more is refused
                      with price_changed.
                    title: Price Usd
                    type: string
                  minimum_applied:
                    description: >-
                      True when the fee is fine_tune_minimum_usd, which is more
                      than its training tokens cost.
                    title: Minimum Applied
                    type: boolean
                  trained_tokens:
                    anyOf:
                      - type: integer
                      - type: 'null'
                    description: >-
                      The training tokens it would train, as the job's
                      split.trained_tokens counts them. Null only for a free
                      fine-tune whose rows can't be counted.
                    title: Trained Tokens
                  steps:
                    description: 'Its training steps: the ones sent, or the default passes.'
                    title: Steps
                    type: integer
                  seed:
                    description: Its seed, which orders the rows its steps take.
                    title: Seed
                    type: integer
                  passes:
                    description: >-
                      How many times its steps go over its training rows, to two
                      decimals.
                    title: Passes
                    type: number
                  train_rows:
                    description: >-
                      The training rows it trains on: a continuation's new rows
                      and the earlier rows sampled with them.
                    title: Train Rows
                    type: integer
                  dataset_version:
                    description: 'The dataset version it would train on: its newest.'
                    title: Dataset Version
                    type: integer
                required:
                  - currency
                  - price_usd
                  - minimum_applied
                  - trained_tokens
                  - steps
                  - seed
                  - passes
                  - train_rows
                  - dataset_version
                title: FineTuneEstimate
                type: object
        4XX:
          description: >-
            Client error. On a 422, `error.details` lists each field that
            failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        5XX:
          description: Server error. A 503 names what is not running on this server.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BearerAuth: []
components:
  schemas:
    JobEstimate:
      properties:
        dataset_id:
          type: string
          pattern: ^ds_[a-f0-9]{24}$
          title: Dataset Id
        from:
          type: string
          maxLength: 140
          minLength: 1
          title: From
          description: >-
            Where the family starts: a base model that can be fine-tuned, or one
            of your models as family@N, which it trains from on that model's
            base. Left out, Core.
          default: sqwish-decision-core
        family:
          type: string
          maxLength: 63
          pattern: ^[a-z](?:-?[a-z0-9]){1,62}$
          title: Family
          description: >-
            The new family's name: lowercase letters and digits, with single
            hyphens between them, 2 to 63 characters. A name already taken is
            refused with family_exists.
        method:
          type: string
          enum:
            - sft
            - reward
          title: Method
          default: sft
        hyperparameters:
          $ref: '#/components/schemas/Hyperparameters'
      additionalProperties: false
      type: object
      required:
        - dataset_id
        - family
      title: JobEstimate
      description: >-
        A new family's first fine-tune, from a base or one of your models, as
        its estimate takes

        it: the body that starts it, without max_price_usd.
    ErrorResponse:
      description: >-
        The body of every error. app.failure() builds it; this model documents
        it.
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
      required:
        - error
      title: ErrorResponse
      type: object
    Hyperparameters:
      properties:
        steps:
          anyOf:
            - type: integer
              maximum: 2000
              minimum: 1
            - type: 'null'
          title: Steps
          description: >-
            Training steps. Left out, two passes over the training rows, from 20
            to 2,000 steps, so a very large dataset gets fewer than two passes.
            At most the policy's limits.fine_tune_passes passes (2 by default),
            or 20 steps. The fee is per training token trained, so more steps
            train more tokens and cost more.
        learning_rate:
          type: number
          maximum: 0.01
          exclusiveMinimum: 0
          title: Learning Rate
          default: 0.00005
        lora_rank:
          type: integer
          minimum: 1
          title: Lora Rank
          description: >-
            The LoRA rank of the adapter, from 1 to 16, the highest at launch.
            Left out, 8. A rank above 16 is refused with `rank_unsupported` when
            the job is accepted. A continuation keeps its parent's rank.
          default: 8
        seed:
          type: integer
          maximum: 2147483647
          minimum: 0
          title: Seed
          default: 42
        checkpoint_every:
          type: integer
          maximum: 1000
          minimum: 1
          title: Checkpoint Every
          default: 10
        kl_coefficient:
          type: number
          maximum: 10
          minimum: 0
          title: Kl Coefficient
          default: 0.05
      additionalProperties: false
      type: object
      title: Hyperparameters
    ErrorBody:
      properties:
        code:
          description: A stable code to branch on, such as invalid_request.
          title: Code
          type: string
        message:
          description: What went wrong and what to change, in plain words.
          title: Message
          type: string
        retryable:
          description: >-
            True when another attempt may succeed; it does not prove that no
            work was done. Respect Retry-After when present. Only operations
            that support Idempotency-Key replay a prior result, including
            /v1/decide for 24 hours.
          title: Retryable
          type: boolean
        request_id:
          description: Also sent as X-Request-ID. Quote it in bug reports.
          title: Request Id
          type: string
        details:
          anyOf:
            - items:
                $ref: '#/components/schemas/ErrorDetail'
              type: array
            - type: 'null'
          default: null
          description: On validation errors, one entry for each field that failed.
          title: Details
      required:
        - code
        - message
        - retryable
        - request_id
      title: ErrorBody
      type: object
    ErrorDetail:
      properties:
        path:
          description: Where the problem is, such as ["body", "decisions", 0, "outcomes"].
          items:
            anyOf:
              - type: string
              - type: integer
          title: Path
          type: array
        message:
          title: Message
          type: string
        type:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          title: Type
      required:
        - path
        - message
      title: ErrorDetail
      type: object
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: d1_sk_...
      description: Create an API key in the console. Required when accounts are enabled.

````

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