Riferimento API
Riferimento completo per l'API pubblica di FabHub. Il portale brandizzato è canonico; puoi anche caricare il contratto leggibile dalla macchina in qualsiasi visualizzatore OpenAPI (Swagger Editor, Redoc, Postman o il tuo IDE).
URL base
https://api.fabhub.app/v1
Convenzioni
- Autenticati con
X-API-Key(oppureAuthorization: Bearer). Vedi Autenticazione. - I corpi delle richieste sono JSON con chiavi
camelCase; i filtri degli elenchi sono parametri di querysnake_case. - Gli endpoint di elenco sono basati su pagine e restituiscono un oggetto
pagination; vedi Paginazione. - Gli endpoint di scrittura richiedono un header
Idempotency-Key; vedi Idempotenza. - Gli errori usano un involucro stabile con un
codeleggibile dalla macchina; vedi Errori.
Tutti gli endpoint
Questa tabella è generata dal contratto OpenAPI ed elenca sempre ogni operazione pubblica e lo scope richiesto. Le sezioni seguenti sono esempi pratici per le risorse più comuni; il contratto OpenAPI è la fonte esaustiva per gli schemi di richiesta e risposta.
| Metodo | Percorso | 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 |
Servizio
GET /v1
Restituisce le funzionalità (metodo, percorso, scope) che la credenziale chiamante può usare. Nessuno scope richiesto.
GET /v1/auth/context
Restituisce il tenant, il piano, gli scope, il livello di rate limit e la scadenza della credenziale chiamante. Nessuno scope richiesto. Vedi l'esempio in Avvio rapido.
Articoli
GET /v1/items
Scope: items:read. Elenca gli articoli (prodotti, materiali, combo).
| Query | Tipo | Note |
|---|---|---|
page | integer | Numero di pagina con base 1 (predefinito 1) |
page_size | integer | Articoli per pagina (predefinito 20) |
search | string | Corrispondenza testuale libera su nome/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. Richiede Idempotency-Key. Crea un articolo.
| Campo del corpo | Tipo | Note |
|---|---|---|
name | string | Obbligatorio |
itemType | product | material | combo | Predefinito a product |
sku, mpn, barcode | string | null | Identificatori opzionali |
categoryId, unitId, supplierId | string | null | Riferimenti opzionali |
salePrice, purchasePrice | number | null | Prezzi opzionali |
supplierCode, notes | string | null | Opzionali |
isActive | boolean | Predefinito a 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}'
Restituisce { "data": { ...item } } con l'articolo creato.
GET /v1/items/{item_id}
Scope: items:read. Restituisce { "data": { ...item } }, oppure 404 con code: "NOT_FOUND".
PATCH /v1/items/{item_id}
Scope: items:write. Richiede Idempotency-Key. Accetta qualsiasi sottoinsieme dei campi di creazione e restituisce l'articolo aggiornato.
Sotto-risorse dell'articolo
GET /v1/items/{item_id}/ingredients(scopeitems:read) - componenti per un articolocombo/manufacturato.GET /v1/items/{item_id}/suppliers(scopeitems:read) - fornitori collegati a un articolo.
Ordini
GET /v1/orders
Scope: orders:read.
| Query | Tipo | Note |
|---|---|---|
module | buy | sell | make | check | fix | Obbligatorio |
status | stato dell'ordine | Filtro opzionale (draft, open, in_progress, waiting, completed, cancelled) |
page, page_size, search | - | Parametri di elenco 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 }
}
Gli ordini supportano anche POST /v1/orders, GET /v1/orders/{order_id} e PATCH /v1/orders/{order_id} (le scritture richiedono Idempotency-Key), oltre a GET /v1/orders/{order_id}/lines (scope orders:read) per le righe d'ordine. Vedi il contratto OpenAPI per i corpi esatti delle richieste.
Contatti
GET /v1/contacts
Scope: contacts:read.
| Query | Tipo | Note |
|---|---|---|
contact_types | string | Separati da virgola: customer, supplier, both |
page, page_size, search | - | Parametri di elenco standard |
Ogni contatto: id, name, email, phone, company, contactType, country, contactGroup, isPrimaryContact, isActive, updatedAt.
I contatti supportano anche POST /v1/contacts, GET /v1/contacts/{contact_id} e PATCH /v1/contacts/{contact_id} (le scritture richiedono Idempotency-Key); vedi il contratto OpenAPI per i campi.
Organizzazione
GET /v1/organization
Scope: organization:read. Restituisce { "data": { "id", "name", "slug", "plan", "createdAt" } } dove plan è free | standard | pro | enterprise.
Utilizzo
GET /v1/usage
Scope: usage:read. Restituisce il periodo di fatturazione corrente, i totali delle richieste (complessivi e per funzionalità) e il livello di rate limit con il budget rimanente. Vedi Rate limit.
Eventi di audit
GET /v1/audit/events
Scope: audit:read (Enterprise). Esportazione paginata tramite cursore.
| Query | Tipo | Note |
|---|---|---|
since, until | ISO 8601 | Finestra temporale |
action_prefix | string | Filtra per prefisso dell'azione |
actor_type | user | system | api | Filtra per attore |
limit | integer | Dimensione della pagina |
cursor_created_at, cursor_id | - | Riprendi da una pagina precedente |
{
"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" } }
}
Scorte
GET /v1/stock-levels
Restituisce i livelli di scorte attuali per gli articoli del tenant (vedi la tabella sopra per lo scope richiesto e il contratto OpenAPI per i filtri e la forma della risposta).
Webhook
I dettagli completi sul ciclo di vita e sulla firma sono in Webhook.
| Metodo | Percorso | 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 |