---
title: "Envelope check of a finished formula"
method: POST
path: "/check"
---

# Envelope check of a finished formula

`POST /check`

## Request

- Base URL: `https://api.nanobaselabs.com`
- URL: `https://api.nanobaselabs.com/check`
- Auth: API key in header `x-nb-key`

Inline props are used for the answer. Over REST, props and sources sent with a counted check are also recorded as an Ingredient Submission; the MCP check_formula tool stores nothing (use submit_ingredient or POST /ingredients/submit).

## Request body

- object
  - `base` 'classic' | 'luxe' | 'clinical'
  - `basePct` number
  - `ph` number
  - `lines` Line[]
    - `n` string
    - `pct` number
    - `blend` object[]
      - `n` string
      - `f` union: fraction of the raw material, or "trace"
        - number
        - 'trace'
      - `props` Props: Properties of an ingredient the library does not list, researched by the caller's AI. The line is then assessed like a library ingredient of that class and echoed under declared_by_caller. Library entries win unless override is true. Invalid props return 400 invalid_props with the field.
        - `class` 'oil' | 'water_soluble' | 'peptide' | 'lipopeptide' | 'charged' | 'polymer' | 'surfactant' | 'preservative' | 'humectant' | 'neutral', required
        - `charge` 'nonionic' | 'zwitterionic' | 'cationic' | 'anionic'
        - `oil_type` 'insoluble_heavy' | 'light_ester_ripening_prone' | 'polar'
        - `mw_class` 'low' | 'medium' | 'high'
        - `mw` number
        - `valence` integer
        - `ionized_fraction` number
        - `form` 'nonionic' | 'salt' | 'acid'
        - `override` boolean
      - `source` union
        - Source: A supplier document that confirms an ingredient's information. Ask your user to upload it and send its text. Stored, never fetched; the text is kept privately and never returned or shown to other users; responses echo doc_type and doc_date only. A submission is used right away for your own account and added to the shared library after review by Pensive Beauty® Nanoscience Labs; a document whose text (doc_type plus at least about 200 characters) names the ingredient supports the review (a url alone does not count). Invalid sources return 400 invalid_source with the field.
          - `doc_type` 'TDS' | 'SDS' | 'CoA' | 'spec', required
          - `supplier` string
          - `doc_date` string: YYYY, YYYY-MM or YYYY-MM-DD
          - `url` string: http(s); never fetched
          - `excerpt` string: accepted as the same field as text
          - `text` string: the document text, up to 200 KB (204,800 bytes UTF-8)
        - Source[]
          - `doc_type` 'TDS' | 'SDS' | 'CoA' | 'spec', required
          - `supplier` string
          - `doc_date` string: YYYY, YYYY-MM or YYYY-MM-DD
          - `url` string: http(s); never fetched
          - `excerpt` string: accepted as the same field as text
          - `text` string: the document text, up to 200 KB (204,800 bytes UTF-8)
    - `props` Props: Properties of an ingredient the library does not list, researched by the caller's AI. The line is then assessed like a library ingredient of that class and echoed under declared_by_caller. Library entries win unless override is true. Invalid props return 400 invalid_props with the field.
      - `class` 'oil' | 'water_soluble' | 'peptide' | 'lipopeptide' | 'charged' | 'polymer' | 'surfactant' | 'preservative' | 'humectant' | 'neutral', required
      - `charge` 'nonionic' | 'zwitterionic' | 'cationic' | 'anionic'
      - `oil_type` 'insoluble_heavy' | 'light_ester_ripening_prone' | 'polar'
      - `mw_class` 'low' | 'medium' | 'high'
      - `mw` number
      - `valence` integer
      - `ionized_fraction` number
      - `form` 'nonionic' | 'salt' | 'acid'
      - `override` boolean
    - `source` union
      - Source: A supplier document that confirms an ingredient's information. Ask your user to upload it and send its text. Stored, never fetched; the text is kept privately and never returned or shown to other users; responses echo doc_type and doc_date only. A submission is used right away for your own account and added to the shared library after review by Pensive Beauty® Nanoscience Labs; a document whose text (doc_type plus at least about 200 characters) names the ingredient supports the review (a url alone does not count). Invalid sources return 400 invalid_source with the field.
        - `doc_type` 'TDS' | 'SDS' | 'CoA' | 'spec', required
        - `supplier` string
        - `doc_date` string: YYYY, YYYY-MM or YYYY-MM-DD
        - `url` string: http(s); never fetched
        - `excerpt` string: accepted as the same field as text
        - `text` string: the document text, up to 200 KB (204,800 bytes UTF-8)
      - Source[]
        - `doc_type` 'TDS' | 'SDS' | 'CoA' | 'spec', required
        - `supplier` string
        - `doc_date` string: YYYY, YYYY-MM or YYYY-MM-DD
        - `url` string: http(s); never fetched
        - `excerpt` string: accepted as the same field as text
        - `text` string: the document text, up to 200 KB (204,800 bytes UTF-8)
  - `variant` 'classic' | 'luxe' | 'clinical': alias of base
  - `nbPct` number: alias of basePct
  - `architecture` 'classic' | 'luxe' | 'clinical': alias (MCP spelling)
  - `architecture_pct` number: alias (MCP spelling)

## Response `200`

verdict, categories, remedies, maxLoads, lines, unmatched, declared_by_caller, props_ignored, usage; or, when any line is unlisted and has no props, an incomplete answer {status: needs_properties, counted: false, message, research, needs_properties, props_schema} with no results and no run used; grade_guidance (per graded polymer line: grade, size class, free-polymer limit, counterions, where it acts, use level, texture), grade_request (plain or unstated grade: send the grade with the TDS or CoA in source), documents_received (doc_type and date of each source sent); needs_properties items carry documents and field_documents

- CheckResult
  - `outcome` 'compatible' | 'compatible_verify' | 'adjust' | 'structural_conflict' | 'needs_properties' | 'error', required
  - `api_version` string, required
  - `ok` boolean
  - `verdict` string: compatible | compatible_verify | adjust (not_processed on a structural_conflict answer)
  - `categories` Category[]
    - `key` 'oil' | 'ws' | 'anchor' | 'charged' | 'divalent' | 'poly'
    - `label` string
    - `status` 'go' | 'verify' | 'warn' | 'stop'
    - `used` unknown
    - `max` unknown
    - `note` string
    - `used_value` number, nullable
    - `limit_value` number, nullable
    - `unit` string, nullable: % w/w or % of capacity
    - `used_pct_of_limit` number, nullable: nearest 5 up to 100, coarser steps above; above 100 is over the limit
    - `band` 'none' | 'below ceiling' | 'near ceiling' | 'over ceiling': divalent only; none = no divalent source declared
  - `remedies` object[]
    - `sev` string
    - `title` string
    - `body` string
  - `maxLoads` object
  - `lines` object[]
    - `i` integer: 0-based position after blends are expanded
    - `line` integer: 1-based line sent
    - `n` string
    - `c` string
  - `incompatible_ingredients` object[]
    - `line` integer
    - `ingredient` string
    - `issue` string
    - `action` string
    - `alternatives` object[]
  - `next_actions` NextAction[]
    - `action` string, required: swap, remove, replace, reduce, adjust_ph, declare_ph, raise_loading, send_grade, submit_properties, fix, verify_at_bench, recheck, continue
    - `target` string, required
    - `detail` string, required
    - `line` integer
    - `category` string
  - `needs_properties` object[]
    - `line` integer
    - `n` string
  - `declared_by_caller` object[]
    - `line` integer
  - `grade_guidance` object[]
    - `line` integer
  - `structural_conflict` boolean
  - `status` string
  - `performance` object[]
  - `usage` Usage
    - `tier` string
    - `month` string
    - `runsUsed` number
    - `runsLimit` number
    - `runs_remaining` number
    - `run_window_ends_at` string, nullable: ISO end of the open 60-minute run session; null when none is open
    - `runCallsUsed` number
    - `runCallsLimit` number

## Other responses

- `400`: invalid_input, formula_exceeds_100, unknown_architecture, invalid_props {error, field, detail, props_schema}, or invalid_source {error, field, detail, source_schema}
- `401`: error (see Error)
- `403`: error (see Error)
- `429`: rate limited, monthly runs used up, or incomplete_limit (more than 30 incomplete checks an hour per account)
- `500`: error (see Error)

---

[API](https://skmtc.dev/nanobaselabs/apis/nanobase-api.md) · [All operations](https://skmtc.dev/nanobaselabs/apis/nanobase-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nanobaselabs/apis/nanobase-api/revisions/f9c58488c2fb?raw)
