Introduction
Complete reference for all EUlabel REST API endpoints.
The EUlabel API provides endpoints for managing products, digital passports, suppliers, and scan analytics. All endpoints follow a consistent design: simple, predictable, and well-documented.
Base URL
https://api.eulabel.eu/v1Authentication
All requests require an API key in the Authorization header:
curl https://api.eulabel.eu/v1/products \
-H "Authorization: Bearer sk_test_..."See Authentication for details on API keys and scopes.
Request format
- Request bodies use JSON (
Content-Type: application/json) - All timestamps are ISO 8601 in UTC
- Identifiers are UUIDs
Pagination
List endpoints return paginated results:
{
"data": [...],
"pagination": {
"total": 142,
"page": 1,
"perPage": 20,
"totalPages": 8
}
}| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (1-based) |
perPage | integer | 20 | Items per page (max 100) |
curl "https://api.eulabel.eu/v1/products?page=2&perPage=50" \
-H "Authorization: Bearer sk_test_..."Rate limiting
Exceeding the rate limit returns a 429 status code. Always respect the Retry-After header before retrying.
Requests are rate-limited per API key. Current limits are returned in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait (only on 429 responses) |
See the Error Handling guide for retry strategies.
Versioning
The API is versioned via URL path (/v1/). Breaking changes result in a new version. Non-breaking additions (new fields, new endpoints) are added to the current version without notice.
Error format
All errors return a consistent structure:
{
"error": "validation_error",
"message": "gtin is required",
"suggestion": "Provide a valid 8, 12, 13, or 14-digit GTIN.",
"status": 422
}Status codes
| Code | Meaning |
|---|---|
200 | Success |
201 | Resource created |
400 | Malformed request (invalid JSON) |
401 | Missing or invalid authentication |
403 | Insufficient permissions |
404 | Resource not found |
422 | Validation error (check the message field) |
429 | Rate limit exceeded |
500 | Internal server error |