Read API
Material detail
Load the full record for a single product, with descriptions, images, specs, and grouped acoustic measurements for every published test configuration.
What's inside
Everything you need about one product
This is the endpoint you reach for when the user has picked a material and you need all the substance: copy for your UI, media, specs, and the numbers your simulation or report engine actually needs.
What you get
Product description, structured specs (thickness, weight, fire class, and more), image URLs, and grouped acoustic measurements for absorption, scatter, and diffusion.
About measurements
Acoustic data lives under `measurements`, grouped by ISO norm: absorption (ISO 354), scatter (ISO 17497-1), and diffusion (ISO 17497-2). Each array can be empty independently.
Endpoint reference
GET /api/v1/materials/{id}
Pass a product UUID and get back the full record. Supports ETag caching, so repeat calls for unchanged data cost you almost nothing.
Fetch full published detail
Load the full record for a single product: description, metadata, images, and grouped acoustic measurements for absorption, scatter, and diffusion.
Request contract
Authorization
Bearer <api_key>
Your API key, sent in the `Authorization` header on every request.
id
string
The product's identifier. Accepts either the canonical UUID or the human-readable slug (e.g. `fural-systeme-amp-p`) — both are returned by the search endpoint.
If-None-Match
string | optional
The `ETag` you received on a previous call. If the product hasn't changed, you'll get `304 Not Modified` with no body, which saves bandwidth.
Response contract
id
string
The product's canonical UUID.
slug
string
Human-readable, globally unique identifier. Stable for the lifetime of the product.
label
string
A ready-to-display label for the product.
commercial_name
string | null
The official marketing name, if the manufacturer has one.
manufacturer
string
The manufacturer's name as a flat string.
material_category
string | null
Broad material category, 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 available.
updated_at
string (ISO 8601) | null
When this product was last updated. Use it for incremental syncs.
description
string | null
Free-text product description from the manufacturer.
has_epd
boolean
`true` if an Environmental Product Declaration (EPD) is available for this product.
url
string | null
Link to the product page on the manufacturer's own website, if we have one.
epd_url
string | null
Direct link to the EPD document, when `has_epd` is `true`.
structured_meta
Record<string, string> | null
Additional specs as key/value strings (thickness, weight, fire class, etc.). Values are always strings, so parse numbers in your client.
images
array | null
Product images, or `null` when the product has no pictures yet.
measurements
object
Grouped acoustic measurements, split by published norm and coefficient family.
images[]
Product photos and renders. Sort by `display_order` before showing them to users.
id
string | undefined
A stable ID for this image, handy for React keys and cache busting.
url
string
Direct URL to the image. You can hotlink it or proxy it through your own CDN.
filename
string | null
The original filename, when we have it. Useful as an `alt` fallback.
display_order
number | null
Suggested sort order, lowest first. `null` means no preference.
measurements
All arrays are always present. Any individual array may be empty when that measurement family is not published for the product.
absorption_iso_354
array
Absorption measurements serialized from ISO 354-style coefficient data.
scatter_iso_17497_1
array
Scatter coefficients from ISO 17497-1 style measurements.
diffusion_iso_17497_2
array
Diffusion coefficients from ISO 17497-2 style measurements.
measurements.absorption_iso_354[]
Each entry is one absorption test configuration: mounting, thickness, air gap, and the absorption coefficients that setup produced.
id
string
Stable ID for this measurement entry. Safe to use as a React key.
label
string
A short human-readable label, e.g. `Absorption 1`.
source_kind
string
Where the numbers came from: `measured`, `literature`, or `simulated`.
source_norm
string
The measurement standard. For this array it is currently `ISO 354`.
measuring_option
string | null
Additional lab option recorded with the measurement, when one was given.
mounting
string | null
How the specimen was mounted in the lab, e.g. `wall`, `ceiling`, or `free-standing`.
thickness_mm
number | null
Thickness of the tested specimen, in millimetres.
air_gap_mm
number | null
Air gap behind the specimen during the test, in millimetres.
calculated_absorption
number | null
A summary absorption value for this test configuration, if the lab reported one.
alpha_s_octave
Record<string, number> | null
Octave-band absorption coefficients. Keys are frequencies in Hz as strings (e.g. `"125"`), values are the coefficients.
alpha_s_third_octave
Record<string, number> | null
Third-octave absorption coefficients. Same shape as `alpha_s_octave`, just with more frequency bands.
measurements.scatter_iso_17497_1[]
Scatter coefficient measurements for diffusors and other scattering surfaces.
id
string
Stable ID for this measurement entry.
label
string
A short human-readable label, e.g. `Scatter 1`.
source_kind
string
Where the numbers came from: `measured`, `literature`, or `simulated`.
source_norm
string
The measurement standard. For this array it is currently `ISO 17497-1`.
measuring_option
string | null
Additional lab option recorded with the measurement, when one was given.
scatter_octave
Record<string, number> | null
Octave-band scatter coefficients. Keys are frequencies in Hz as strings.
scatter_third_octave
Record<string, number> | null
Third-octave scatter coefficients.
measurements.diffusion_iso_17497_2[]
Diffusion coefficient measurements, including normalized and directional values when available.
id
string
Stable ID for this measurement entry.
label
string
A short human-readable label, e.g. `Diffusion 1`.
source_kind
string
Where the numbers came from. Today this is always `measured`.
source_norm
string
The measurement standard. For this array it is currently `ISO 17497-2`.
measuring_option
string | null
Additional lab option recorded with the measurement, when one was given.
limit_frequency_hz
number | null
Lower validity limit `fG` in Hz, when provided by the lab.
directional_diffusion_octave
Record<string, number> | null
Directional diffusion coefficients in octave bands.
directional_diffusion_third_octave
Record<string, number> | null
Directional diffusion coefficients in third-octave bands.
normalized_directional_diffusion_octave
Record<string, number> | null
Directional diffusion coefficients normalized against a flat reference, in octave bands.
normalized_directional_diffusion_third_octave
Record<string, number> | null
Directional diffusion coefficients normalized against a flat reference, in third-octave bands.
diffusion_octave
Record<string, number> | null
Octave-band diffusion coefficients.
diffusion_third_octave
Record<string, number> | null
Third-octave diffusion coefficients.
normalized_diffusion_octave
Record<string, number> | null
Octave-band diffusion coefficients normalized against a flat reference.
normalized_diffusion_third_octave
Record<string, number> | null
Third-octave diffusion coefficients normalized against a flat reference.
Request example
# Look up by UUID or by slug — both work. curl "https://acousticindex.com/api/v1/materials/fural-systeme-amp-p" \ -H "Authorization: Bearer YOUR_API_KEY"
Response example
{
"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",
"description": "Textile wall absorber for interiors.",
"has_epd": true,
"url": "https://example.com/product",
"epd_url": "https://example.com/epd.pdf",
"structured_meta": {
"thickness": "50 mm"
},
"images": [
{
"id": "IMAGE_ID",
"url": "https://example.com/panel-50.jpg",
"filename": "panel-50.jpg",
"display_order": 1
}
],
"measurements": {
"absorption_iso_354": [
{
"id": "iso354-1",
"label": "Absorption 1",
"source_kind": "measured",
"source_norm": "ISO 354",
"measuring_option": null,
"mounting": "wall",
"thickness_mm": 50,
"air_gap_mm": 0,
"calculated_absorption": 0.85,
"alpha_s_octave": { "125": 0.35, "250": 0.70 },
"alpha_s_third_octave": { "100": 0.20, "125": 0.35 }
}
],
"scatter_iso_17497_1": [
{
"id": "scatter-1",
"label": "Scatter 1",
"source_kind": "measured",
"source_norm": "ISO 17497-1",
"measuring_option": "measured",
"scatter_octave": { "500": 0.55, "1000": 0.72 },
"scatter_third_octave": { "400": 0.42, "500": 0.55 }
}
],
"diffusion_iso_17497_2": [
{
"id": "diffusion-1",
"label": "Diffusion 1",
"source_kind": "measured",
"source_norm": "ISO 17497-2",
"measuring_option": "measured",
"limit_frequency_hz": 500,
"directional_diffusion_octave": null,
"directional_diffusion_third_octave": null,
"normalized_directional_diffusion_octave": null,
"normalized_directional_diffusion_third_octave": null,
"diffusion_octave": { "500": 0.48, "1000": 0.65 },
"diffusion_third_octave": { "400": 0.35, "500": 0.48 },
"normalized_diffusion_octave": { "500": 0.62, "1000": 0.80 },
"normalized_diffusion_third_octave": { "400": 0.48, "500": 0.62 }
}
]
}
}Behavior
A few things to keep in mind
Small details about nullable fields, ETag caching, and how to read grouped acoustic measurements safely.
Cache responses with ETag
Every detail response comes with an `ETag` header. Send it back as `If-None-Match` on your next call to get a `304 Not Modified` when nothing changed. That saves you bandwidth and a JSON parse.
`structured_meta` is a flat string map
Extra specs like thickness or weight come as a `Record<string, string>`. Both keys and values are always strings, so convert to numbers in your client if you need them.
`images` may be `null`
You get `null` when the product has no images yet. Otherwise it is a flat list with a URL and optional display metadata you can use to order them.
`measurements` is the authoritative acoustic payload
Acoustic data is grouped by norm under `measurements`. Each array can be empty independently, so a diffuser can have scatter and diffusion data even when the absorption array is empty.
Do not hard-code `source_norm`
Each measurement entry carries its own `source_norm`. Read that value from the response instead of assuming a fixed standard from the field name alone.