Référence de l'API
Référence complète de l'API publique de FabHub. Le portail de marque fait foi ; vous pouvez aussi charger le contrat exploitable par machine dans n'importe quel visualiseur OpenAPI (Swagger Editor, Redoc, Postman ou votre IDE).
URL de base
https://api.fabhub.app/v1
Conventions
- Authentifiez-vous avec
X-API-Key(ouAuthorization: Bearer). Voir Authentification. - Les corps de requête sont en JSON avec des clés en
camelCase; les filtres de liste sont des paramètres de requête ensnake_case. - Les endpoints de liste sont paginés par page et renvoient un objet
pagination; voir Pagination. - Les endpoints en écriture exigent un en-tête
Idempotency-Key; voir Idempotence. - Les erreurs utilisent une enveloppe stable avec un
codeexploitable par machine ; voir Erreurs.
Tous les endpoints
Ce tableau est généré à partir du contrat OpenAPI et liste toujours chaque opération publique et son scope requis. Les sections ci-dessous sont des exemples pratiques pour les ressources les plus courantes ; le contrat OpenAPI est la source exhaustive des schémas de requête et de réponse.
| Méthode | Chemin | Scope |
|---|---|---|
GET | /v1 | authenticated |
GET | /v1/audit/events | audit:read |
GET | /v1/auth/context | authenticated |
GET | /v1/contacts | contacts:read |
POST | /v1/contacts | contacts:write |
DELETE | /v1/contacts/{contact_id} | contacts:write |
GET | /v1/contacts/{contact_id} | contacts:read |
PATCH | /v1/contacts/{contact_id} | contacts:write |
GET | /v1/items | items:read |
POST | /v1/items | items:write |
DELETE | /v1/items/{item_id} | items:write |
GET | /v1/items/{item_id} | items:read |
PATCH | /v1/items/{item_id} | items:write |
GET | /v1/items/{item_id}/ingredients | items:read |
POST | /v1/items/{item_id}/ingredients | items:write |
DELETE | /v1/items/{item_id}/ingredients/{ingredient_id} | items:write |
PATCH | /v1/items/{item_id}/ingredients/{ingredient_id} | items:write |
GET | /v1/items/{item_id}/suppliers | items:read |
POST | /v1/items/{item_id}/suppliers | items:write |
DELETE | /v1/items/{item_id}/suppliers/{supplier_id} | items:write |
PATCH | /v1/items/{item_id}/suppliers/{supplier_id} | items:write |
GET | /v1/orders | orders:read |
POST | /v1/orders | orders:write |
GET | /v1/orders/{order_id} | orders:read |
PATCH | /v1/orders/{order_id} | orders:write |
GET | /v1/orders/{order_id}/lines | orders:read |
GET | /v1/organization | organization:read |
GET | /v1/stock-documents | inventory:read |
POST | /v1/stock-documents | inventory:write |
DELETE | /v1/stock-documents/{document_id} | inventory:write |
GET | /v1/stock-documents/{document_id} | inventory:read |
PATCH | /v1/stock-documents/{document_id} | inventory:write |
POST | /v1/stock-documents/{document_id}/approve | inventory:write |
POST | /v1/stock-documents/{document_id}/cancel | inventory:write |
GET | /v1/stock-documents/{document_id}/lines | inventory:read |
POST | /v1/stock-documents/{document_id}/lines | inventory:write |
DELETE | /v1/stock-documents/{document_id}/lines/{line_id} | inventory:write |
PATCH | /v1/stock-documents/{document_id}/lines/{line_id} | inventory:write |
POST | /v1/stock-documents/{document_id}/submit | inventory:write |
GET | /v1/stock-levels | inventory:read |
GET | /v1/usage | usage:read |
GET | /v1/webhooks | webhooks:read |
POST | /v1/webhooks | webhooks:write |
DELETE | /v1/webhooks/{webhook_id} | webhooks:delete |
GET | /v1/webhooks/{webhook_id} | webhooks:read |
PATCH | /v1/webhooks/{webhook_id} | webhooks:write |
GET | /v1/webhooks/{webhook_id}/deliveries | webhooks:deliveries:read |
Service
GET /v1
Renvoie les capacités (méthode, chemin, scope) que l'identifiant appelant peut utiliser. Aucun scope requis.
GET /v1/auth/context
Renvoie le tenant, le plan, les scopes, le palier de limitation de débit et l'expiration de l'identifiant appelant. Aucun scope requis. Voir l'exemple dans Démarrage rapide.
Articles
GET /v1/items
Scope : items:read. Liste les articles (produits, matières, combos).
| Requête | Type | Notes |
|---|---|---|
page | integer | Numéro de page à base 1 (par défaut 1) |
page_size | integer | Articles par page (par défaut 20) |
search | string | Correspondance plein texte sur le nom/SKU |
curl "https://api.fabhub.app/v1/items?page=1&page_size=2&search=widget" \
-H "X-API-Key: $FABHUB_API_KEY"
{
"data": [
{
"id": "a1c9...",
"name": "Blue Widget",
"sku": "WIDG-BLUE",
"itemType": "product",
"salePrice": 19.99,
"purchasePrice": 8.5,
"isActive": true,
"category": { "id": "cat_1", "name": "Widgets" },
"supplier": { "id": "sup_1", "name": "Acme", "company": "Acme Ltd" },
"updatedAt": "2026-06-19T14:02:00Z"
}
],
"pagination": { "page": 1, "pageSize": 2, "total": 57, "totalPages": 29 }
}
POST /v1/items
Scope : items:write. Exige Idempotency-Key. Crée un article.
| Champ du corps | Type | Notes |
|---|---|---|
name | string | Requis |
itemType | product | material | combo | Par défaut product |
sku, mpn, barcode | string | null | Identifiants optionnels |
categoryId, unitId, supplierId | string | null | Références optionnelles |
salePrice, purchasePrice | number | null | Tarification optionnelle |
supplierCode, notes | string | null | Optionnel |
isActive | boolean | Par défaut true |
curl -X POST https://api.fabhub.app/v1/items \
-H "X-API-Key: $FABHUB_API_KEY" \
-H "Idempotency-Key: 0b9c4a2e-..." \
-H "Content-Type: application/json" \
-d '{"name":"Blue Widget","itemType":"product","salePrice":19.99}'
Renvoie { "data": { ...item } } avec l'article créé.
GET /v1/items/{item_id}
Scope : items:read. Renvoie { "data": { ...item } }, ou 404 avec code: "NOT_FOUND".
PATCH /v1/items/{item_id}
Scope : items:write. Exige Idempotency-Key. Accepte n'importe quel sous-ensemble des champs de création et renvoie l'article mis à jour.
Sous-ressources d'article
GET /v1/items/{item_id}/ingredients(scopeitems:read) - composants d'un articlecombo/fabriqué.GET /v1/items/{item_id}/suppliers(scopeitems:read) - fournisseurs liés à un article.
Commandes
GET /v1/orders
Scope : orders:read.
| Requête | Type | Notes |
|---|---|---|
module | buy | sell | make | check | fix | Requis |
status | statut de commande | Filtre optionnel (draft, open, in_progress, waiting, completed, cancelled) |
page, page_size, search | - | Paramètres de liste standard |
{
"data": [
{
"id": "ord_1",
"module": "sell",
"orderNumber": "SO-1042",
"status": "open",
"contactId": "con_7",
"orderDate": "2026-06-18",
"dueDate": "2026-06-25",
"siteId": null,
"priority": "normal",
"assignedTo": null,
"contact": { "id": "con_7", "name": "Globex" },
"site": null,
"createdAt": "2026-06-18T10:00:00Z",
"updatedAt": "2026-06-18T10:05:00Z"
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 3, "totalPages": 1 }
}
Les commandes prennent également en charge POST /v1/orders, GET /v1/orders/{order_id} et PATCH /v1/orders/{order_id} (les écritures exigent Idempotency-Key), ainsi que GET /v1/orders/{order_id}/lines (scope orders:read) pour les lignes de commande. Consultez le contrat OpenAPI pour les corps de requête exacts.
Contacts
GET /v1/contacts
Scope : contacts:read.
| Requête | Type | Notes |
|---|---|---|
contact_types | string | Séparés par des virgules : customer, supplier, both |
page, page_size, search | - | Paramètres de liste standard |
Chaque contact : id, name, email, phone, company, contactType, country, contactGroup, isPrimaryContact, isActive, updatedAt.
Les contacts prennent également en charge POST /v1/contacts, GET /v1/contacts/{contact_id} et PATCH /v1/contacts/{contact_id} (les écritures exigent Idempotency-Key) ; consultez le contrat OpenAPI pour les champs.
Organisation
GET /v1/organization
Scope : organization:read. Renvoie { "data": { "id", "name", "slug", "plan", "createdAt" } } où plan vaut free | standard | pro | enterprise.
Utilisation
GET /v1/usage
Scope : usage:read. Renvoie la période de facturation en cours, les totaux de requêtes (globaux et par capacité), ainsi que le palier de limitation de débit avec le budget restant. Voir Limites de débit.
Événements d'audit
GET /v1/audit/events
Scope : audit:read (Enterprise). Export paginé par curseur.
| Requête | Type | Notes |
|---|---|---|
since, until | ISO 8601 | Fenêtre temporelle |
action_prefix | string | Filtrer par préfixe d'action |
actor_type | user | system | api | Filtrer par acteur |
limit | integer | Taille de page |
cursor_created_at, cursor_id | - | Reprendre depuis une page précédente |
{
"data": [
{
"id": "evt_1",
"actorType": "api",
"actorId": "key_8f...",
"action": "item.created",
"resourceType": "item",
"resourceId": "a1c9...",
"metadata": {},
"ipAddress": "203.0.113.10",
"createdAt": "2026-06-19T14:02:00Z"
}
],
"pagination": { "hasMore": true, "nextCursor": { "createdAt": "2026-06-19T14:02:00Z", "id": "evt_1" } }
}
Stock
GET /v1/stock-levels
Renvoie les niveaux de stock actuels pour les articles du tenant (voir le tableau ci-dessus pour le scope requis, et le contrat OpenAPI pour les filtres et la forme de la réponse).
Webhooks
Le cycle de vie complet et les détails de signature figurent dans Webhooks.
| Méthode | Chemin | Scope |
|---|---|---|
GET | /v1/webhooks | webhooks:read |
POST | /v1/webhooks | webhooks:write (Enterprise) |
GET | /v1/webhooks/{webhook_id} | webhooks:read |
PATCH | /v1/webhooks/{webhook_id} | webhooks:write |
DELETE | /v1/webhooks/{webhook_id} | webhooks:delete |
GET | /v1/webhooks/{webhook_id}/deliveries | webhooks:deliveries:read |