# Quotes

> Price a ready file in one material at one quantity before you order: how the price is made, tiers and discounts, the estimate, failure codes and materials.

Updated 2026-10-24 · HTML: https://layercrew.com/developers/quotes · Markdown: https://layercrew.com/developers/quotes.md · OpenAPI: https://layercrew.com/openapi.json

A quote prices one `ready` file in one material at one quantity, without creating an order. Use it to show a price in your own shop, to compare materials or to check a design before you commit.

## How a price is made

The file is sliced for real on our quoting profile for the material, with our house settings; a 3MF keeps the settings it was saved with. From the slice we take the weight and the print time, and the per-part price follows — the same price the [calculator](https://layercrew.com/calculator) shows. Quantities are priced on full plates, then one partial plate; the unit price is rounded to the cent before it is multiplied.

## Quantity tiers and your discount

The published quantity tiers apply automatically — 100+ of the same file carries 10 percent off the unit price, 250+ carries 20 percent. Your plan's `discount_pct` applies on top of the list price; a contract can set a different one. `tiers` on a priced quote lists the unit price at other quantities so your shop can show the ladder.

## Create a quote

```bash
curl -X POST "https://engine.layercrew.com/v1/quotes" \
  -H "Authorization: Bearer $LAYERCREW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "file_id": "4f1b2c3d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "material": "PLA", "nozzle": "0.4", "quantity": 2 }'
```

_202 — pricing has started_

```json
{
  "data": {
    "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "file_id": "4f1b2c3d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "material": "PLA",
    "nozzle": "0.4",
    "quantity": 2,
    "status": "pending",
    "created_at": "2026-10-24T09:33:00Z",
    "priced_at": null
  }
}
```

Pricing takes seconds to a few minutes. Poll `GET /v1/quotes/{id}` until `status` is `priced` or `failed`, or listen for `quote.priced` and `quote.failed` on your webhook.

_GET /v1/quotes/{id} — priced_

```json
{
  "data": {
    "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "file_id": "4f1b2c3d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "material": "PLA",
    "nozzle": "0.4",
    "quantity": 2,
    "status": "priced",
    "list_unit_price": "12.40",
    "discount_pct": "0",
    "unit_price": "12.40",
    "total": "24.80",
    "currency": "EUR",
    "tiers": [
      {
        "min_quantity": 1,
        "unit_price": "12.40"
      },
      {
        "min_quantity": 100,
        "unit_price": "11.16"
      },
      {
        "min_quantity": 250,
        "unit_price": "9.92"
      }
    ],
    "estimate": {
      "weight_grams": 31.2,
      "time_seconds": 5400,
      "unit_yield": 1,
      "printer_model": "Bambu Lab A2L",
      "nozzle": "0.4",
      "material": "PLA",
      "infill_pct": 15,
      "wall_loops": 3,
      "support": "auto",
      "warnings": [],
      "priced_at": "2026-10-24T09:34:12Z"
    },
    "created_at": "2026-10-24T09:33:00Z",
    "priced_at": "2026-10-24T09:34:12Z"
  }
}
```

## What the quote carries

| Field | Meaning |
| --- | --- |
| `list_unit_price` | The per-part price at this quantity before your plan's discount, EUR, two decimals, as a string. |
| `discount_pct` | Your plan's discount, as a string. |
| `unit_price` | `list_unit_price` less the discount, rounded to the cent. |
| `total` | `unit_price` × `quantity`. |
| `tiers` | Unit price at other quantities — the ladder your shop can show. |
| `estimate` | What the slicer measured and used: `weight_grams`, `time_seconds`, `unit_yield` (parts per plate in a 3MF), `printer_model`, `nozzle`, `material`, `infill_pct`, `wall_loops`, `support`, `warnings`. |
| `estimate.warnings` | What the design-for-manufacturing pass flagged — thin walls, steep overhangs, a part laid out close to the bed's edge. Worth showing to whoever drew the part. |

## When pricing fails

`status` becomes `failed`, `quote.failed` is emitted, and `failure_code` with `failure_message` say what to do:

| Code | What happened | Next step |
| --- | --- | --- |
| `model_too_large` | The part is laid out larger than our print bed. | Split it into sub-assemblies, or send it through [contact us](https://layercrew.com/contact-us) and we take it by hand. |
| `not_a_model` | The file holds no printable geometry. | Export the part again from your CAD or slicer. |
| `material_unavailable` | The material is outside your plan or out of stock for this run. | Pick one from `GET /v1/materials`. |
| `slicer_rejected` | The slicer refused the geometry. | Check for open meshes, inverted normals and zero-thickness walls, or send it to us. |
| `file_unavailable` | The file was deleted or purged before pricing ran. | Upload it again. |

## Quotes and orders

A quote is information, never a commitment. The price on an order is computed again when the order is created and frozen when an engineer accepts it; the same file, material and quantity on the same day give the same number. Your plan's `quote_daily_cap`, when set, bounds the quotes you may create in a day; `GET /v1/account` shows `usage.quotes_today`.

## Materials

`GET /v1/materials` lists what you can order: each material with its `nozzles` and `colours` (`id`, `name`, `hex`, `in_stock`), filtered by your plan's `allowed_materials` and `allowed_nozzles`. `in_stock` is live and never a promise. A colour left out of an item lets the engineer pick at production.

```bash
curl "https://engine.layercrew.com/v1/materials" \
  -H "Authorization: Bearer $LAYERCREW_API_KEY"
```

_200_

```json
{
  "data": [
    {
      "material": "PLA",
      "description": "Dimensionally critical parts and visual models.",
      "nozzles": [
        "0.2",
        "0.4",
        "0.6",
        "0.8"
      ],
      "colours": [
        {
          "id": "black",
          "name": "Black",
          "hex": "#111111",
          "in_stock": true
        },
        {
          "id": "white",
          "name": "White",
          "hex": "#F4F4F4",
          "in_stock": true
        }
      ]
    },
    {
      "material": "PETG",
      "description": "Functional parts with moisture and chemical resistance.",
      "nozzles": [
        "0.4",
        "0.6"
      ],
      "colours": [
        {
          "id": "black",
          "name": "Black",
          "hex": "#111111",
          "in_stock": true
        }
      ]
    }
  ]
}
```

Every endpoint is in the [reference](https://layercrew.com/developers/reference#tag-quotes).
