---
title: "Schema structuring"
method: POST
path: "/v1/structure"
tags: ["Schema structuring"]
---

# Schema structuring

`POST /v1/structure`

## Request

- Base URL: `https://api.thecompound.tech`
- URL: `https://api.thecompound.tech/v1/structure`
- Auth: HTTP bearer

ParseRail takes any messy input, including text, HTML, or an email, plus YOUR JSON schema, and returns output shaped to it. It validates the output against your required fields and property types, performs an automatic corrective retry, and returns a `valid` flag.

Cost: 6 credits ($0.06) — charged only on success.

## Headers

- `ParseRail-Dry-Run` '1' | 'true'
- `Idempotency-Key` string

## Request body

- object
  - `input` string, required: Provide any messy input, including text, HTML, an email, or a JSON blob.
  - `schema` object, required: Provide the JSON Schema that the output must conform to.
  - `instructions` string: Optional extra guidance.

## Response `200`

The call succeeded. The response contains result fields and a usage envelope. With `ParseRail-Dry-Run: 1` the body is a DryRun object instead.

- union
  - object
    - `data` object, required: Provide the output that conforms to your schema.
    - `valid` boolean, required: Set this to True when every required field of your schema was satisfiable.
    - `notes` string[]: List anything the input could not support, including missing required fields and ambiguities.
    - `usage` Usage, required
      - `credits` integer, required: Credits burned by this call.
      - `balanceRemaining` integer, required: Wallet balance after the charge.
  - DryRun: A dry run: auth, the per-key throttle, body validation and the balance precheck ran. No model ran and nothing was charged.
    - `dryRun` true, required
    - `valid` true, required: The body passed validation. An invalid body returns 400 instead.
    - `endpoint` string, required
    - `wouldCharge` integer, required: Credits a successful live call would charge.
    - `balance` integer, required: Your wallet balance now.
    - `liveStatus` 200 | 202 | 402, required: The status a live call with this body would get: 402 when the balance or the key's monthly cap cannot cover it, 202 for `async: true`, else 200.
    - `keyCapRemaining` integer: Present when the key carries a monthly cap: credits left under it this month.
    - `usage` Usage, required
      - `credits` integer, required: Credits burned by this call.
      - `balanceRemaining` integer, required: Wallet balance after the charge.
    - `requestId` string, required

## Other responses

- `400`: Invalid request body.
- `401`: Missing or invalid API key.
- `402`: `insufficient_credits`: the balance cannot cover the call. `spend_cap_reached`: the key has reached its monthly cap. Nothing is charged.
- `429`: Rate limit exceeded.

---

[API](https://skmtc.dev/thecompound/apis/parserail.md) · [All operations](https://skmtc.dev/thecompound/apis/parserail/llms.txt) · [OpenAPI document](https://skmtc.dev/thecompound/apis/parserail/revisions/7895a3b7812b?raw)
