> ## 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.

# Upload rows to a dataset

> Add rows to a dataset from a JSONL body, or a CSV one (Content-Type: text/csv) whose
first line is `context` and some of the dataset's decision ids. A CSV cell names the right
outcome for its decision, written exactly as the dataset names it, and a blank one leaves
that decision out. CSV adds to datasets of targets only. The default upload limit is 16
MiB. X-Max-Price-Usd is the most you agree to pay for a first day of storage, which rows
that take the dataset past the free size hold. X-Family names the family whose page adds
them, as `family` does for JSON rows.



## OpenAPI

````yaml /openapi.json post /v1/datasets/{dataset_id}/versions/upload
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 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, adapters and named models with versions.
  - 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/datasets/{dataset_id}/versions/upload:
    post:
      tags:
        - Datasets
      summary: Upload rows to a dataset
      description: >-
        Add rows to a dataset from a JSONL body, or a CSV one (Content-Type:
        text/csv) whose

        first line is `context` and some of the dataset's decision ids. A CSV
        cell names the right

        outcome for its decision, written exactly as the dataset names it, and a
        blank one leaves

        that decision out. CSV adds to datasets of targets only. The default
        upload limit is 16

        MiB. X-Max-Price-Usd is the most you agree to pay for a first day of
        storage, which rows

        that take the dataset past the free size hold. X-Family names the family
        whose page adds

        them, as `family` does for JSON rows.
      operationId: uploadDatasetRows
      parameters:
        - name: dataset_id
          in: path
          required: true
          schema:
            type: string
            title: Dataset Id
        - name: x-max-price-usd
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: X-Max-Price-Usd
        - name: x-family
          in: header
          required: false
          schema:
            anyOf:
              - type: string
                pattern: ^[a-z](?:-?[a-z0-9]){1,62}$
              - type: 'null'
            description: >-
              The family whose page adds these rows, such as router: one of your
              families on this dataset. The version records it, so the family
              can say where its new data came from.
            title: X-Family
          description: >-
            The family whose page adds these rows, such as router: one of your
            families on this dataset. The version records it, so the family can
            say where its new data came from.
        - name: idempotency-key
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Idempotency-Key
      requestBody:
        required: true
        description: >-
          One JSON object per line, or a CSV whose first line is `context` and
          some of the dataset's decision ids, and whose cells name each
          decision's right outcome.
        content:
          application/x-ndjson:
            schema:
              type: string
          text/csv:
            schema:
              type: string
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                properties:
                  id:
                    type: string
                    title: Id
                  name:
                    type: string
                    title: Name
                  created_at:
                    type: number
                    title: Created At
                  sha256:
                    type: string
                    title: Sha256
                    description: >-
                      Names every row of the latest version: its first version's
                      file digest, each later one's chained on.
                  version:
                    type: integer
                    title: Version
                    description: >-
                      The latest version. Counts and the split are this
                      version's.
                  status:
                    type: string
                    const: validated
                    title: Status
                  rows:
                    type: integer
                    title: Rows
                  contexts:
                    type: integer
                    title: Contexts
                  duplicates_removed:
                    type: integer
                    title: Duplicates Removed
                  method:
                    type: string
                    enum:
                      - sft
                      - reward
                    title: Method
                  augmentation:
                    type: string
                    const: none
                    title: Augmentation
                  archived_at:
                    anyOf:
                      - type: number
                      - type: 'null'
                    title: Archived At
                    description: >-
                      When we archived it: when credit couldn't cover its
                      storage, or on a suspension. Restore it to start new work.
                      Null in the library.
                  evaluation_only:
                    type: boolean
                    title: Evaluation Only
                  evaluation_fraction:
                    type: number
                    title: Evaluation Fraction
                  split:
                    additionalProperties:
                      type: integer
                    type: object
                    title: Split
                  prompt_tuning:
                    $ref: '#/components/schemas/PromptTuningReadiness'
                    description: >-
                      What prompt tuning can tune in the training partition,
                      worked out when the dataset was made. Datasets of outcome
                      scores have none.
                  input:
                    $ref: '#/components/schemas/InputReceipt'
                  labeling:
                    $ref: '#/components/schemas/LabelingLineage'
                  storage_window:
                    anyOf:
                      - $ref: '#/components/schemas/StorageWindow'
                      - type: 'null'
                    description: >-
                      The day of storage held now, at the price it was accepted
                      at, or null. Archiving or deleting it charges the minutes
                      used of it; later days are priced as they start.
                  labels_to_check:
                    type: integer
                    title: Labels To Check
                    description: >-
                      How many labels prompt tuning doubted in this dataset that
                      nobody has dismissed, each row and decision once, as its
                      labels-to-check route lists them.
                type: object
                required:
                  - id
                  - name
                  - created_at
                  - sha256
                  - version
                  - status
                  - rows
                  - contexts
                  - duplicates_removed
                  - method
                  - augmentation
                  - archived_at
                  - evaluation_only
                  - evaluation_fraction
                  - split
                title: Dataset
        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:
    PromptTuningReadiness:
      properties:
        decisions:
          items:
            $ref: '#/components/schemas/DecisionReadiness'
          type: array
          title: Decisions
          description: >-
            Decisions the training rows ask, those it can tune first and then
            the most asked, as many as fit in 64 KiB.
        unlisted:
          type: integer
          title: Unlisted
          description: How many more decisions the training rows ask.
      type: object
      required:
        - decisions
        - unlisted
      title: PromptTuningReadiness
    InputReceipt:
      properties:
        format:
          type: string
          enum:
            - json
            - jsonl
          title: Format
        sha256:
          type: string
          title: Sha256
        bytes:
          type: integer
          title: Bytes
      type: object
      required:
        - format
        - sha256
        - bytes
      title: InputReceipt
    LabelingLineage:
      properties:
        job_id:
          type: string
          title: Job Id
        source_id:
          type: string
          title: Source Id
        source_sha256:
          type: string
          title: Source Sha256
        source_input_sha256:
          type: string
          title: Source Input Sha256
        spec_sha256:
          type: string
          title: Spec Sha256
        prompt_version:
          type: string
          title: Prompt Version
        teacher_models:
          items:
            type: string
          type: array
          title: Teacher Models
        row_indices:
          items:
            type: integer
          type: array
          title: Row Indices
        selection_sha256:
          type: string
          title: Selection Sha256
        target_method:
          type: string
          const: mean_one_hot_teacher_votes
          title: Target Method
      type: object
      required:
        - job_id
        - source_id
        - source_sha256
        - source_input_sha256
        - spec_sha256
        - prompt_version
        - teacher_models
        - row_indices
        - selection_sha256
        - target_method
      title: LabelingLineage
    StorageWindow:
      properties:
        started_at:
          type: number
          title: Started At
        ends_at:
          type: number
          title: Ends At
          description: When this day's hold ends and the next is reserved.
        reserved_usd:
          type: string
          title: Reserved Usd
          description: The day's fee held, as exact USD.
      type: object
      required:
        - started_at
        - ends_at
        - reserved_usd
      title: StorageWindow
    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
    DecisionReadiness:
      properties:
        decision:
          $ref: '#/components/schemas/Decision'
          description: The decision as the dataset's rows define it.
        outcomes:
          items:
            type: string
          type: array
          title: Outcomes
          description: >-
            Its outcome names in order, as the model reads them and targets name
            them.
        rows:
          type: integer
          title: Rows
          description: Training rows that ask it.
        labels:
          additionalProperties:
            type: integer
          type: object
          title: Labels
          description: How many of those rows expect each outcome, in the decision's order.
        reason:
          anyOf:
            - type: string
              enum:
                - conflicting_decision
                - structured_wording
                - too_few_rows
                - too_few_per_outcome
            - type: 'null'
          title: Reason
          description: >-
            Why prompt tuning can't tune it, or null when it can. A job refused
            for it has this error code.
      type: object
      required:
        - decision
        - outcomes
        - rows
        - labels
        - reason
      title: DecisionReadiness
    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
    Decision:
      properties:
        id:
          type: string
          maxLength: 128
          minLength: 1
          title: Id
        question:
          anyOf:
            - type: string
            - additionalProperties: true
              type: object
            - items: {}
              type: array
          title: Question
        kind:
          type: string
          enum:
            - single
            - binary
            - ordinal
          title: Kind
          default: single
        outcomes:
          title: Outcomes
        rubric:
          anyOf:
            - items: {}
              type: array
            - type: 'null'
          title: Rubric
        policy:
          anyOf:
            - $ref: '#/components/schemas/Policy'
            - type: 'null'
      additionalProperties: false
      type: object
      required:
        - id
        - question
      title: Decision
    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
    Policy:
      properties:
        action_costs:
          anyOf:
            - additionalProperties:
                additionalProperties:
                  type: number
                type: object
              type: object
            - type: 'null'
          title: Action Costs
        abstain_below:
          anyOf:
            - type: number
              maximum: 1
              minimum: 0
            - type: 'null'
          title: Abstain Below
      additionalProperties: false
      type: object
      title: Policy
  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.