---
title: "Builder order intent"
method: GET
path: "/api/public/v1/builders/{builder}/orders"
tags: ["Builder Analytics"]
---

# Builder order intent

`GET /api/public/v1/builders/{builder}/orders`

What this builder's users INTEND, not just what filled: order counts and shares by action type (plain orders, batch modifies, and stop/TP trigger orders), time-in-force mix, reduce-only share, a full trigger breakdown (take-profit vs stop, market vs limit, position-TPSL vs standalone, resolved vs still-pending), and the share of intents that reached at least one attributed fill. Trigger-order history begins 2026-03-24 (earlier history is being backfilled); see the response's dataNotes.

## Path parameters

- `builder` string, required — Builder address (0x-hex)

## Query parameters

- `period` 'day' | 'week' | 'month'

## Response `200`

OK

- BuilderOrdersBody
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `actions` BuilderOrderActionRow[], nullable, required — Intent mix by type, largest first; includes the 'trigger' pseudo-type (pending placements only) sourced from the trigger capture table
    - `actionType` string, required — 'order' (plain placement), 'batchModify' (modify intent on an existing order), or 'trigger' (still-PENDING stop/TP placements from the trigger capture table; resolved trigger placements already surface as 'order' rows and are counted there)
    - `orders` integer, required — Intent rows of this type placed in the period
    - `share` number, double, required — orders / totalIntents
  - `builder` string, required
  - `builderName` string — Known display name for the builder; omitted if unknown
  - `dataNotes` string, required
  - `fillConversion` BuilderFillConversion, required
    - `filledOrders` integer, required — Of those, intent rows whose own oid had >= 1 attributed fill in the period. Every intent row carries its own oid (batchModify rows never share the superseded placement's oid), so a superseded placement counts as an unfilled intent
    - `orders` integer, required — Non-trigger order intents in the period (denominator)
    - `share` number, double, required — filledOrders / orders; 0 when the builder placed no orders
  - `period` string, required
  - `reduceOnlyShare` number, double, required — Share of non-trigger order intents flagged reduce-only (trigger placements are reduce-only by construction and excluded)
  - `tifs` BuilderTifRow[], nullable, required — Time-in-force mix of non-trigger order intents, largest first
    - `orders` integer, required
    - `share` number, double, required — orders / non-trigger order intents (trigger placements carry no tif)
    - `tif` string, required — Time-in-force as recorded on the order ('unknown' when absent — market orders and older rows)
  - `totalIntents` integer, required — Non-trigger order intents + still-PENDING trigger placements in the period (the actions share denominator). Resolved trigger placements already appear as 'order' intent rows, so counting them again here would double-count
  - `trigger` BuilderTriggerBreakdown, required
    - `pending` integer, required — Placements not yet resolved to an oid; the only trigger rows that add to totalIntents
    - `positionTpsl` integer, required — grouping='positionTpsl' — TP/SL attached to the whole position
    - `resolved` integer, required — Placements already mapped to an exchange oid by the batch-resolve job (near zero until its backlog runs — see dataNotes). Resolved placements also appear as plain 'order' intent rows, so they are excluded from totalIntents and the 'trigger' action to avoid double-counting
    - `standaloneTpsl` integer, required — grouping='normalTpsl' — TP/SL attached to a parent order
    - `stopLoss` integer, required — tpsl='sl' — stop-loss triggers
    - `takeProfit` integer, required — tpsl='tp' — take-profit triggers
    - `total` integer, required — Trigger-order (stop/TP) placements in the period
    - `triggerLimit` integer, required — Executes as a limit order when the trigger price is hit
    - `triggerMarket` integer, required — Executes as a market order when the trigger price is hit
  - `verified` BuilderStamp
    - `coverage` BuilderCoverage, required
      - `attributed_fees_usd` number, double, required — Join-attributed fees in the rollup window
      - `computed_at` string, required — When the rollup was computed (RFC3339)
      - `ledger_fees_usd` number, double, required — Exact ledger revenue in the rollup window
      - `ratio` number, double, required — attributed_fees / ledger_fees — the share of revenue the fill-level metrics account for
      - `window_end` string, required — End of that window (RFC3339)
      - `window_start` string, required — Start of the window the coverage rollup was computed over (RFC3339)
    - `ledger_block` integer, required — Latest block in HL's builder-fee ledger this data was verified against
    - `ledger_chain_time` string, required — Chain timestamp of that ledger entry (RFC3339)

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `422` — Unprocessable Entity
- `429` — Too Many Requests
- `500` — Internal Server Error
- `504` — Gateway Timeout

---

[API](https://skmtc.dev/coinversa/apis/coinversa-api.md) · [All operations](https://skmtc.dev/coinversa/apis/coinversa-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/coinversa/coinversa-api/revisions/77c03c427063/schema)
