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 first, then load detail only when you need it
Search returns just enough data to render a result list quickly. Once the user picks a product, ask the detail endpoint for images, specs, and absorption data.
Great for
Material pickers, search result lists, browse views, and any screen where you need to show many materials at once.
Need more data?
Once you know which product the user cares about, call `GET /materials/{id}` to load the full record with images, specs, and absorption coefficients.
Endpoint reference
GET /api/v1/materials/search
Pass a search query and a page, get back a ranked list of matching materials.
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`.
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, e.g. textile, metal, or wood.
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.
updated_at
string (ISO 8601) | null
When the product data was last updated. Useful for incremental syncs.
Request example
curl "https://acousticindex.com/api/v1/materials/search?q=wood&page=0&limit=20" \ -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.