API Documentation
ScopeMatch provides a public JSON API for accessing our directory of 10,017+ ISO 17025 accredited testing laboratories across Europe. Free for developers, AI agents, and integrators. 1 active API keys in use today.
1,000 requests/day with higher burst limits. Upgrade to Pro for coordinates and capabilities.
Interactive API Reference → · OpenAPI Spec (JSON)
Base URL
https://scopematch.eu/api/v1
All endpoints return JSON with Content-Type: application/json. CORS is enabled for all origins.
Authentication
Pass your API key in the X-Api-Key header:
curl -H "X-Api-Key: YOUR_KEY" https://scopematch.eu/api/v1/labs
?api_key= query parameter is deprecated and will be removed after 2026-06-01. Requests using the query parameter will receive Deprecation: true and Sunset: 2026-06-01 response headers. Please migrate to the X-Api-Key header.
Anonymous requests are accepted at reduced rate limits. Invalid or inactive keys return 401 Unauthorized.
Tiers & Capabilities
- Lab name, status, country, city
- Categories
- Coordinates (lat/lng)
- Capabilities list
- All anonymous fields
- Coordinates (lat/lng)
- Capabilities list
- All free fields
- Coordinates (lat/lng)
- Full capabilities list
- All pro fields
- Priority support
- Custom SLA
Contact us to upgrade to Pro or Enterprise.
Endpoints
List Labs
GET /api/v1/labs
Paginated listing of accredited laboratories with optional filters.
| Parameter | Type | Description |
|---|---|---|
country | string | 2-letter country code (e.g. DE, GB, FR) |
category | string | Category slug (e.g. mechanical-testing) |
body | string | Accreditation body code (e.g. DAkkS, UKAS) |
q | string | Search by lab name or city |
status | string | active (default), suspended, withdrawn, or all |
page | integer | Page number (default: 1) |
per_page | integer | Results per page (default: 25, max: 100) |
Example — anonymous request (no coordinates)
curl https://scopematch.eu/api/v1/labs?country=DE
{
"data": [{
"slug": "ptb-braunschweig",
"name": "PTB Braunschweig",
"accreditation_number": "D-K-15201-01-00",
"accreditation_body": "DAkkS",
"accreditation_status": "active",
"country": "DE",
"city": "Braunschweig",
"postcode": "38116",
"latitude": null,
"longitude": null,
"categories": ["calibration", "mechanical-testing"],
"_links": {
"self": "https://scopematch.eu/api/v1/labs/ptb-braunschweig",
"html": "https://scopematch.eu/labs/ptb-braunschweig/"
}
}],
...
}
Example — authenticated request (with coordinates)
curl -H "X-Api-Key: YOUR_KEY" \
https://scopematch.eu/api/v1/labs?country=DE
{
"data": [{
...
"latitude": 52.29,
"longitude": 10.46,
...
}],
...
}
Lab Detail
GET /api/v1/labs/{slug}
Full detail for a single laboratory. Capabilities list requires Pro tier.
Example — free key (no capabilities)
{
"slug": "ptb-braunschweig",
"capabilities": null,
"_meta": {
"capabilities_available": false,
"upgrade_url": "https://scopematch.eu/labs/api-docs/#pricing"
}
}
Example — pro key (with capabilities)
{
"slug": "ptb-braunschweig",
"capabilities": [
{
"canonical_id": "iso-6892-1",
"name": "Tensile testing of metallic materials",
"category_slug": "mechanical-testing",
"category_name": "Mechanical Testing"
}
]
}
Categories
GET /api/v1/categories
List of test categories with lab counts.
Data Freshness
GET /api/v1/metadata/freshness
Shows when each accreditation body was last scraped, how many labs it contains, and the overall total. No API key required. Response is cached for 1 hour.
Example response
{
"bodies": {
"DAkkS": {
"country": "DE",
"last_scraped": "2026-02-21T14:30:00+00:00",
"labs_count": 6186,
"age_days": 28
},
"UKAS": {
"country": "GB",
"last_scraped": "2026-02-18T09:15:00+00:00",
"labs_count": 4200,
"age_days": 31
}
},
"total_labs": 13707,
"generated_at": "2026-03-21T12:00:00+00:00"
}
Rate Limits
Rate limits are enforced per key (authenticated) or per IP (anonymous). Two tiers of limits apply:
- Burst limit — requests per minute (enforced in memory)
- Daily limit — requests per UTC day (enforced in database)
| Tier | Daily | Burst/min |
|---|---|---|
| Anonymous (no key) | 100 | 10 |
| Free | 1,000 | 60 |
| Pro | 10,000 | 200 |
| Enterprise | 100,000 | 500 |
Rate limit headers are included in every response:
| Header | Description |
|---|---|
X-RateLimit-Limit | Burst limit per minute |
X-RateLimit-Remaining | Burst requests remaining this minute |
X-RateLimit-Reset | Unix timestamp when burst window resets |
X-RateLimit-Daily-Limit | Daily request quota |
X-RateLimit-Daily-Remaining | Daily requests remaining |
X-Api-Tier | Your resolved tier (anonymous, free, pro, enterprise) |
When the limit is exceeded, the API returns 429 Too Many Requests with a Retry-After header.
Attribution
All API responses include X-Attribution-Required: true.
Any public product or service using ScopeMatch data must display visible attribution linking to scopematch.eu. Examples:
Data from ScopeMatch (scopematch.eu)
<a href="https://scopematch.eu">Lab data: ScopeMatch</a>
Attribution is not required for internal or private use. See full terms.
Other Machine-Readable Resources
/llms.txt— Markdown site summary for LLMs/sitemap.xml— Full sitemap with 10,017+ URLs/robots.txt— Crawler directives (all AI crawlers welcome)- JSON-LD — Every page includes structured data
CORS & Caching
All API responses include Access-Control-Allow-Origin: *. Responses are cached for 5 minutes (Cache-Control: public, max-age=300).
GDPR
The API does not expose personal email addresses. Only business contact emails (e.g. info@) are included. Personal names are never returned.
Free API key — no credit card required. Terms of use.