Read API
Search materials
Search acoustic materials and get a compact, paginated result list. Use it for search UIs, material pickers, browse views, and sync jobs.
When to use it
Search, filter and compare in one call
Narrow the set with filters, get filter counts with facets, and embed single-number ratings plus an octave snapshot per hit with include=acoustics, so you can compare absorption without a follow-up detail call.
Great for
Material pickers, faceted search and browse views, and live comparison by absorption, alpha_w, NRC or SAA.
Need the full record?
Call `GET /materials/{id}` for one product, or batch several with `GET /materials?ids=`, to get images, specs, and the full third-octave measurements.
Endpoint reference
GET /api/v1/materials/search
Pass a query, optional filters, and the include/facets flags. Get back a ranked list, with acoustic ratings inline and facet counts when requested.
Search published materials
Search for acoustic materials and get a compact result list. Perfect for pickers, autocomplete, browse pages, or any flow where you need to let users find a product.
Request contract
Authorization
Bearer <api_key>
Your API key, sent in the `Authorization` header on every request.
q
string | optional
Free-text search across product name, manufacturer, and description.
page
number | optional
Zero-based page number. Defaults to `0`.
limit
number | optional
How many items you want per page. Defaults to `20`, maximum `50`.
category, character, installation
string | optional
Filter by material category, absorption character, or installation type. Multi-value via comma-separated or repeated params. Unknown values return `400`.
manufacturer
string | optional
Filter by manufacturer slug (multi-value). Discover slugs from the `facets.manufacturers` buckets.
alpha_w_min, alpha_w_max
number | optional
Restrict the weighted absorption coefficient (`α_w`) to a range between 0 and 1.
fire_class
string | optional
Minimum fire class per DIN EN 13501-1 (`A1`-`F`). Returns products rated that class or safer.
has_epd, purchasable_only
boolean | optional
Restrict to products with an EPD, or to commercial products only (excludes PTB reference data).
sort
string | optional
Ordering: `relevance`, `alphaW_desc`, `alphaW_asc`, `date_desc`, or `name_asc`.
include
string | optional
Comma-separated expansions. `acoustics` embeds `nrc`, `saa`, and `absorption_octave` in each hit. `geometry` embeds an approximate 3D primitive (`shape`, bounding box in mm, size variants, and a mounting-aware exposed area for Sabine `S`). `geometry` is also supported on the detail and batch endpoints.
facets
boolean | optional
When `true`, the response carries a `facets` object with filter counts (categories, characters, installations, manufacturers, fire classes, EPD).
Response contract
items
array
The results for this page, in ranked order.
page
number
The page number you asked for, echoed back.
limit
number
The page size actually used. If you asked for more than `50`, this will show `50`.
total_count
number
Total number of matching materials across all pages. Handy for showing result counts in your UI.
has_more
boolean
`true` when there are more pages waiting. Use this to drive your pagination controls.
items[]
Each search result is a lightweight summary. Fetch the detail endpoint when you need images or full measurement data.
id
string
The product's canonical UUID. Pass this — or the `slug` field below — to `GET /materials/{id}` to load the full record.
slug
string
Human-readable, globally unique identifier (e.g. `fural-systeme-amp-p`). Stable for the lifetime of the product. Use this if you want a readable material name in Blender, Revit, etc.
label
string
A ready-to-display label for the product, already fallback-friendly.
commercial_name
string | null
The official marketing name of the product, if the manufacturer has one.
manufacturer
string
The manufacturer's name as a flat string, ready to render.
material_category
string | null
Broad category of the material. German id values, e.g. `textil`, `metall`, `holz`.
installation_types
string[]
Where the product can be installed, e.g. `wall` or `ceiling`.
alpha_w
number | null
Weighted absorption coefficient (`α_w`) per ISO 11654, if a value is available.
nrc
number | null
Noise Reduction Coefficient (ASTM C423). Only present when you pass `include=acoustics`. Null when the four octave bands are not all published.
saa
number | null
Sound Absorption Average (ASTM C423). Only present when you pass `include=acoustics`. Null when the twelve third-octave bands are not all published.
absorption_octave
Record<string, number> | null
Practical absorption (`α_p`) octave snapshot per ISO 11654, keyed by Hz. Only present when you pass `include=acoustics`.
updated_at
string (ISO 8601) | null
When the product data was last updated. Useful for incremental syncs.
Request example
# Add filters, include=acoustics for inline ratings, and facets for counts. curl "https://acousticindex.com/api/v1/materials/search?q=wood&category=holz&alpha_w_min=0.6&sort=alphaW_desc&include=acoustics&facets=true" \ -H "Authorization: Bearer YOUR_API_KEY"
Response example
{
"items": [
{
"id": "11111111-2222-3333-4444-555555555555",
"slug": "fural-systeme-amp-p",
"label": "Acoustic panel",
"commercial_name": "Panel 50",
"manufacturer": "Acme Acoustic",
"material_category": "textile",
"installation_types": ["wall"],
"alpha_w": 0.85,
"updated_at": "2026-04-01T10:00:00.000Z"
}
],
"page": 0,
"limit": 20,
"total_count": 142,
"has_more": true
}Behavior
A few things to keep in mind
Small details about pagination and nullable fields that can save you from surprises later.
Pagination uses `total_count` and `has_more`
Each response gives you `items`, `page`, `limit`, `total_count`, and `has_more`. Check `has_more` before asking for the next page so you don't request empty results.
`page` is zero-based
The first page is `page=0`. Negative values are clamped to zero, and `limit` is capped at `50` even if you ask for more.
`manufacturer` is a flat string
You get the manufacturer's name as a plain string, not a nested object, so you can render it directly in your UI.
`alpha_w` can be `null`
When a product has no weighted absorption value yet, this field is `null`. Handle that case in your UI instead of assuming a number.
Filters and `facets` use a different ranking engine
A plain `q` search and a filtered search are served by different engines. Any filter, `sort`, or `facets=true` runs on the faceted engine, which ranks, recalls, and counts differently from plain text search. `include=acoustics` and `include=geometry` are the exception: they only add fields, so they never change which results you get or their order.