Public API
A clean REST API to create and manage brands, categories and products programmatically. Bearer token auth. Versioned. Rate limited. Built for integrations.
https://api.fenestro.io/v1
Create your first brand in under a minute.
Ask your Fenestro SuperAdmin to generate a token from the admin backoffice (Settings → API). The token is shown once and starts with fen_live_.
Every request needs an Authorization: Bearer header.
# Create a brand curl -X POST https://api.fenestro.io/v1/brands \ -H "Authorization: Bearer fen_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "name": "Reynaers Aluminium", "description": "Belgian aluminium profile manufacturer", "display_order": 10 }'
Successful creation returns 201 Created with the new resource.
{
"id": 142,
"name": "Reynaers Aluminium",
"description": "Belgian aluminium profile manufacturer",
"image_url": null,
"display_order": 10,
"active": true,
"created_at": "2026-04-23T15:32:11Z"
}
All endpoints (except /v1/health) require a Bearer token.
Each token is tied to a single Fenestro tenant. All data created with that token belongs to that tenant. No way to cross-target.
The token clear value is only displayed at creation time. Only a SHA-256 hash is stored. Lost a token? Revoke it and create a new one.
A token can be revoked at any time from the backoffice. Revoked tokens receive 401 revoked_token on every call.
Authorization: Bearer fen_live_K8dH2pL9mX3vN7qR4tY6wB1zE5cF0aJs
/v1/. Breaking changes mean a new version; /v1 stays stable.2026-04-23T14:32:11Z).Each token is limited to 300 requests per minute. Exceeding the limit returns 429 Too Many Requests with a Retry-After: 60 header.
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{
"error": "rate_limit_exceeded",
"message": "Too many requests. Limit: 300/minute per token."
}
All errors share the same shape. Match on error — it's stable. The message is human-readable and may change.
{
"error": "validation_error",
"message": "One or more fields are invalid.",
"details": [
{ "field": "name", "issue": "required" }
]
}
Body missing or fields invalid
No Authorization header
Token unknown or malformed
Token has been revoked
More than 300 req/min
Unexpected server error
The full interactive reference lives in Swagger UI — request/response schemas, examples, "try it out".