---
title: "Validate a purchase plan"
method: POST
path: "/cart"
---

# Validate a purchase plan

`POST /cart`

## Request

- Base URL: `https://tetheredtrust.com/v1`
- URL: `https://tetheredtrust.com/v1/cart`
- Auth: one of:
  - none
  - HTTP bearer

Check a whole purchase before recommending or ordering it: the setup the person owns (with current configuration) plus everything in the cart. Returns one decision (supported / conditional / incompatible / insufficient_evidence), a result per part, configuration limits across the plan (memory slots and capacity, M.2 slots), adapters or hubs still needed, substitutions for parts that won't work, the exact questions blocking a decision, evidence, and a signed receipt. Covers anything that has to fit, plug in, mount, run on or charge with something someone owns. Verified catalog (specs checked against cited manufacturer sources): computers & consoles (RAM, M.2 SSDs, USB-C chargers), phones/tablets/watches (USB-C PD, MagSafe, Qi2, watch bands), cameras (lens mounts, adapters, batteries, memory cards), cordless power tools (battery platforms), printers (ink, toner, drums), appliances (refrigerator water and air filters, installation fit), vacuums (bags, filters, batteries, robot-vacuum parts), air quality (purifier filters, HVAC media, humidifier pads), e-bikes (batteries and chargers by drive system), smart home (Matter, Thread, Zigbee, hubs, bulb bases), PC building (CPU sockets, cooler mounts, memory, clearances, power), cars & EV charging (tire sizes by trim, NACS/J1772/CCS1 and approved adapters, home chargers; a starter set of models) and TVs, consoles & streaming (VESA mounts, weight and screen size, console generations, app platforms). Products outside the catalog in any category are read by AI in terms of the same standards and returned as unverified.

## Request body

- object
  - `goal` string: Optional: what the person is trying to do, e.g. 'upgrade this laptop to 32 GB'. Echoed back; requirements are derived from the devices.
  - `setup` union[]: What the person already owns (devices, appliances, tools, hubs) with exact model numbers, plus current configuration.
    - union
      - string: Exact model number or name.
      - object
        - `text` string: Exact model number or name, or key specs.
        - `id` string: Exact product id (from resolve_product or a question's options).
        - `quantity` integer
        - `for` union: Purchases only: which item this part is for (index or name), when the plan has several devices.
          - string
          - integer
        - `config` object: Setup items only: current configuration, e.g. {"memory_modules": [{"capacity_gb": 8}], "installed_drives": 1, "replace_memory": true}.
  - `purchase` union[], required: Everything being considered for purchase: parts, accessories or new devices, with quantities.
    - union
      - string: Exact model number or name.
      - object
        - `text` string: Exact model number or name, or key specs.
        - `id` string: Exact product id (from resolve_product or a question's options).
        - `quantity` integer
        - `for` union: Purchases only: which item this part is for (index or name), when the plan has several devices.
          - string
          - integer
        - `config` object: Setup items only: current configuration, e.g. {"memory_modules": [{"capacity_gb": 8}], "installed_drives": 1, "replace_memory": true}.

## Response `200`

OK

- object
  - `plan_id` string, required
  - `decision` 'supported' | 'conditional' | 'incompatible' | 'insufficient_evidence', required
  - `summary` string, required
  - `items` object[]
  - `results` object[], required
    - `item` integer
    - `name` string
    - `target` unknown
    - `decision` 'supported' | 'conditional' | 'incompatible' | 'insufficient_evidence'
    - `summary` string
    - `checks` object[]
      - `rule` string
      - `ok` boolean, nullable
      - `detail` string
    - `caveats` string[]
    - `conditions` object[]
  - `system_checks` object[]
    - `item` integer
    - `rule` string
    - `ok` boolean, nullable
    - `detail` string
  - `required_accessories` object[]
  - `substitutions` object[]
  - `questions` object[]
    - `id` string
    - `ask` string
    - `blocking` boolean
    - `answer_with` string
    - `options` object[]
  - `requirements` object[]
  - `evidence` object[]
    - `type` string
    - `text` string
    - `url` string, nullable
  - `confidence` number
  - `valid_until` string
  - `receipt` object, nullable
  - `next_step` string

## Other responses

- `400`: Bad input (code bad_request), or plain HTTP (https_required).
- `401`: Missing or invalid API key where one is required.
- `402`: Payment required: pay with x402 or credits and retry. Verified first, settled only for a completed decision.
- `429`: Rate limit; see Retry-After.
- `500`: Our error; retry once.
- `503`: Temporarily unavailable, or paid access is off (paid_access_off).

---

[API](https://skmtc.dev/tetheredtrust/apis/tethered-trust-api.md) · [All operations](https://skmtc.dev/tetheredtrust/apis/tethered-trust-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tetheredtrust/apis/tethered-trust-api/revisions/f737ac591159?raw)
