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.

Checking your account…

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.

DatasetRowsObservationsEstimates
Production rates/api/v1/rates/production1343,060430
Shop fabrication hours/api/v1/rates/shop-hours2018,408429
Operation allowances/api/v1/rates/operations111,617429
Equipment rental rates/api/v1/rates/equipment294323vendor rate sheets
Welding hours/api/v1/rates/welding88curated reference table
AISC shape properties/api/v1/shapes2,0912,091published 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/v1Discovery documentno key
/api/v1/openapi.jsonOpenAPI 3.1 contractno key
/api/v1/datasetsRegistry: rows, observations, estimates, jobsrates:read
/api/v1/rates/shop-hoursShop fabrication hours per piecerates:read
/api/v1/rates/productionShop and field production ratesrates:read
/api/v1/rates/operationsHours per unit by operationrates:read
/api/v1/rates/weldingWelding hours per linear footrates:read
/api/v1/rates/equipmentEquipment rental mediansrates:read
/api/v1/shapesSearch AISC shapesshapes:read
/api/v1/shapes/{designation}One shape, full propertiesshapes: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.

Start free