Developers
The construction estimating API
Observed shop and field labour hours, 2,091 AISC shapes with full section properties, and California public records — in one JSON API. Free tier is 500 requests an hour, no card.
Start in one request
curl https://anvil.builders/api/v1/rates/shop-hours?family=W \
-H "Authorization: Bearer anvl_live_..."{
"data": [
{
"member_class": "rolled_shape",
"shape_family": "W",
"weight_band": "250-1000",
"hrs_per_piece_p10": 1.0,
"hrs_per_piece_median": 1.0,
"hrs_per_piece_p90": 2.0,
"observations": 810,
"pieces": 2695,
"confidence": "high"
}
],
"meta": {
"dataset": "shop_hours_by_band",
"observations": 18408,
"estimates": 429,
"jobs": 116,
"source": "Anvil Reference Rates",
"basis": "observed",
"note": "Observed production data, not a market survey."
}
}No key yet? Create one below. Exploring first? /api/v1 and /api/v1/openapi.json need no key at all.
Your API keys
An Anvil account is personal. You do not need a company to hold a key.
What is in it
63,416 underlying observations across 5 rate datasets, plus 2,091 AISC shapes. These counts are read live from the database — they are not a marketing figure.
| Dataset | Rows | Observations | Estimates | Jobs |
|---|---|---|---|---|
Production rates/api/v1/rates/production | 13 | 43,060 | 430 | 119 |
Shop fabrication hours/api/v1/rates/shop-hours | 20 | 18,408 | 429 | 116 |
Operation allowances/api/v1/rates/operations | 11 | 1,617 | 429 | 116 |
Equipment rental rates/api/v1/rates/equipment | 294 | 323 | vendor rate sheets | — |
Welding hours/api/v1/rates/welding | 8 | 8 | curated reference table | — |
AISC shape properties/api/v1/shapes | 2,091 | 2,091 | published standard | — |
What this data is, and is not
It is observed
Every rate comes from work that was actually estimated and performed by steel fabrication and erection companies. Rows with no observations behind them are excluded rather than shipped as defaults.
It is not a market survey
It is not an industry average, a published index or a benchmark. Each figure is computed over a stated number of priced estimates and jobs, shown in meta.estimates. Quote a figure with its basis or do not quote it.
It is tenant-blind
No response can be traced to a company. Source identity and internal commentary are excluded at the database layer, not filtered per endpoint.
It carries no money model
Sell rates, cost per unit, margin, markup and overhead are never published, at any tier. Hours travel between companies; a money model does not.
Endpoints
/api/v1 | Discovery document | no key |
/api/v1/openapi.json | OpenAPI 3.1 contract | no key |
/api/v1/datasets | Registry: rows, observations, estimates, jobs | rates:read |
/api/v1/rates/shop-hours | Shop fabrication hours per piece | rates:read |
/api/v1/rates/production | Shop and field production rates | rates:read |
/api/v1/rates/operations | Hours per unit by operation | rates:read |
/api/v1/rates/welding | Welding hours per linear foot | rates:read |
/api/v1/rates/equipment | Equipment rental medians | rates:read |
/api/v1/shapes | Search AISC shapes | shapes:read |
/api/v1/shapes/{designation} | One shape, full properties | shapes:read |
Rate limits and errors
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. A 429 also carries Retry-After. An over-limit request does not count against you, so retrying never pushes your reset further out.
{ "error": { "code": "rate_limited", "message": "...", "docs": "..." } }Codes: missing_key, invalid_key, revoked, expired, scope_denied, rate_limited, not_found.
Built for agents too
The discovery document and the OpenAPI spec need no key, so a tool-calling model can find and describe this API before anyone signs up. /llms.txt states what the data is and how it should be cited — including the estimate and job basis behind every rate, which an agent has no other way to know.
Terms
- Free for commercial and non-commercial use, including inside paid products.
- Cite it as observed data with the estimate and job basis shown in
meta.estimates. Presenting it as an industry average or benchmark misrepresents it. - Do not redistribute bulk copies of the rate datasets as your own dataset.
- A rate is a starting point for an estimate, never a substitute for one.
Want it applied to your own numbers?
Anvil connects your rates, your shop history and your estimates.