API REST di Wiresphere
Documentazione completa per sviluppatori dell'API REST di Wiresphere. Questa API consente di gestire prodotti, transazioni, contatti clienti, pagamenti e impostazioni dello shop nel contesto di un sistema multi-tenant.
https://api.wiresphere.com (SEGNAPOSTO) · Autenticazione tramite Bearer JWT (valido 24 h) · header tenant-id obbligatorio per quasi tutti gli endpoint. Torni alla panoramica Docs.L'API utilizza l'autenticazione basata su token (Bearer JWT). I token sono validi per 24 ore.
Invii username e password all'endpoint di autenticazione. Per gli utenti admin l'header tenant-id non deve essere inviato.
Aggiunga il token ricevuto all'header Authorization di tutte le richieste protette:
Authorization: Bearer <il-suo-token>
I token sono validi per 24 ore. Un token scaduto o non valido genera un 409 Conflict.
Parametri header
| Nome | In | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
| tenant-id | header | string | No | Contesto dello shop. Deve essere omesso per l'autenticazione admin. |
Request Body (application/json)
{
"username": "il-suo-username",
"password": "la-sua-password"
}
Risposta
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
L'API è multi-tenant. Ogni richiesta (ad eccezione dell'autenticazione come admin) deve identificare il contesto dello shop tramite l'header tenant-id.
Header tenant-id
L'header tenant-id è un campo obbligatorio per quasi tutti gli endpoint. Definisce in quale contesto shop viene eseguita l'operazione. Senza questo header le richieste vengono rifiutate.
tenant-id: id-mio-shop
Gli endpoint di tipo lista supportano parametri query uniformi per paginazione, filtri e ordinamento.
Parametri query (endpoint lista)
| Parametro | Default | Descrizione |
|---|---|---|
| p | 0 | Numero di pagina (a partire da 0) |
| s | 10 | Voci per pagina |
| f | — | Espressione di filtro (vedi sotto) |
| o | — | Espressione di ordinamento (vedi sotto) |
Sintassi dei filtri (parametro f)
I filtri vengono indicati come gruppi chiave-valore:
# Filtro semplice (ricerca per substring) f=fieldName::value # Più valori (in OR) f=fieldName::val1~~val2 # Esclusione (prefisso --) f=fieldName::--valoreEscluso # Combinazione f=name::Mario~~--Luigi,email::@example.com # Filtro per intervallo temporale (ISO 8601) f=min_createdAt::2024-01-01T00:00:00.000Z f=max_createdAt::2024-12-31T23:59:59.999Z
Sintassi di ordinamento (parametro o)
# Crescente o=name::ASC # Decrescente o=createdAt::DESC # Più campi o=createdAt::DESC,name::ASC
Gestione dell'inventario prodotti di uno shop. Supporta operazioni CRUD e operazioni in massa.
Header
| Nome | In | Obbligatorio | Descrizione |
|---|---|---|---|
| tenant-id | header | ID dello shop | |
| Authorization | header | Bearer <token> |
Parametri query
| Nome | Tipo | Descrizione |
|---|---|---|
| p | integer | Pagina (default: 0) |
| s | integer | Dimensione pagina (default: 10) |
| f | string[] | Filtri: name, SKU, vatClass, status |
| o | string[] | Ordinamento: name, SKU, vatClass, status |
Risposta (200)
{
"totalElements": 42,
"totalPages": 5,
"size": 10,
"number": 0,
"first": true,
"last": false,
"content": [
{
"base": { /* Dati base del prodotto */ },
"additional": { /* Dati aggiuntivi */ }
}
]
}
Parametri path
| Nome | In | Descrizione |
|---|---|---|
| sku* | path | Identificatore univoco del prodotto nello shop (Stock Keeping Unit) |
Risposta (200) — ProductDataDTO
{
"base": { /* Dati base del prodotto (nome, SKU, prezzo ecc.) */ },
"additional": { /* Campi estesi */ }
}
Request Body (application/json) — ProductDataDTO
{
"base": {
// Campi obbligatori e dati del prodotto (nome, SKU, prezzo, stato ecc.)
},
"additional": {
// Campi aggiuntivi opzionali
}
}
Risposta
Request Body (application/json)
["idProdotto1", "idProdotto2"]
Risposta
Restituisce tutte le operazioni bulk registrate con i relativi schemi dei parametri.
Risposta (200) — Array di ProductOperationRegistrationDTO
[{
"operationId": "set-status",
"description": "Imposta lo stato dei prodotti",
"parameterTypes": { "status": "string" },
"previewProperties": ["status"]
}]
Simula un'operazione bulk e mostra lo stato prima/dopo — senza salvare i dati.
Request Body
{
"operationId": "set-status",
"parameters": { "status": "ACTIVE" },
"confirmAll": false
}
Esegue un'operazione bulk sui prodotti filtrati. Modifica i dati in modo permanente.
Parametri query
| Nome | Descrizione |
|---|---|
| f | Filtro che determina quali prodotti sono interessati |
Request Body
{
"operationId": "set-status",
"parameters": { "status": "INACTIVE" }
}
Le transazioni comprendono tutti gli ordini, i contratti e le fatture. Sono disponibili sia un endpoint pubblico sia un endpoint admin.
Valori doctype disponibili
Per il filtro tramite doctype sono noti i seguenti valori: ORDER, CONTRACT, INVOICE
Campi filtro (parametro f)
| Campo | Formato | Descrizione |
|---|---|---|
| min_createdAt | ISO 8601 | Creato a partire dalla data |
| max_createdAt | ISO 8601 | Creato fino alla data |
| doctype | ORDER/CONTRACT/INVOICE | Tipo di transazione |
| docId | string | ID documento |
| processId | string | ID processo |
| processType | string | Pipeline di processo |
| payload.channel | string | Canale di vendita |
| payload.email | string | E-mail del cliente |
Campi di ordinamento (parametro o)
createdAt, docId, payload.netTotalPrice, payload.grossTotalPrice, payload.customer.name
Esempio
GET /api/v1/admin/transaction/?f=doctype::ORDER,min_createdAt::2024-01-01T00:00:00.000Z&o=createdAt::DESC&p=0&s=20 Authorization: Bearer <token> tenant-id: mio-shop
Parametri path
| Nome | Descrizione |
|---|---|
| processId* | ID processo (raggruppa le transazioni correlate) |
| docId* | ID documento della transazione specifica |
Parametri query
| Nome | Obbligatorio | Descrizione |
|---|---|---|
| props | Campi per i quali determinare i valori distinct | |
| and | No | Prefiltro AND |
| or | No | Prefiltro OR |
Risposta (200)
{
"doctype": ["ORDER", "INVOICE"],
"payload.channel": ["online", "terminal"]
}
Parametri path
| Nome | Descrizione |
|---|---|
| processId* | ID processo |
| docId* | ID documento della transazione da stornare |
Parametri query
| Nome | Descrizione |
|---|---|
| reason | Motivo dello storno (opzionale) |
Parametri path
| Nome | Descrizione |
|---|---|
| processId* | ID processo — vengono stornate tutte le transazioni associate |
Parametri query
| Nome | Descrizione |
|---|---|
| reason | Motivo dello storno (opzionale) |
Opzioni di filtro e ordinamento identiche all'endpoint admin, ma senza autenticazione Bearer. Filtra sui dati accessibili nel contesto dello shop.
Gestione CRM delle persone (clienti, contatti). Esistono due percorsi controller paralleli con funzionalità identica.
Endpoint paralleli
Le persone possono essere gestite tramite due percorsi: /api/v1/admin/person/ e /api/v1/admin/business-contacts/people/. Entrambi offrono la stessa funzionalità — per le nuove integrazioni preferisca il percorso business-contacts.
Campi filtro (parametro f)
personId, firstName, lastName, email
Risposta (200) — PageCrmPersonDTO
{
"totalElements": 100,
"content": [{
"id": "507f1f77bcf86cd799439011",
"firstName": "Mario",
"lastName": "Rossi",
"email": "mario@example.com",
"personId": "esterno-123",
"addresses": [],
"communications": [],
"organisations": [],
"types": []
}]
}
Parametri path
| Nome | Descrizione |
|---|---|
| id* | ObjectId MongoDB della persona |
Request Body (application/json) — PersonDTO
{
"firstName": "Mario",
"lastName": "Rossi",
"email": "mario@example.com",
"salutation": "Sig.",
"title": "Dott.",
"personId": "id-esterno-123",
"addresses": [{
"street": "Via Esempio",
"streetNumber": "1",
"zipCode": "12345",
"city": "Città Esempio",
"country": "IT",
"type": "MAIN"
}],
"communications": [{
"type": "PHONE",
"value": "+39 012 3456789"
}],
"types": []
}
Stesso request body del POST. Sostituzione completa del record.
Request Body — RelationDeltaDTO
{
"add": ["orgId1", "orgId2"],
"remove": ["orgIdVecchio"]
}
Risposta (200) — OkDTO
{ "ok": true }
Request Body
["id1", "id2", "id3"]
Gestione di aziende e organizzazioni. Analogamente alle persone, raggiungibili anche tramite due percorsi paralleli.
Campi filtro
name (ricerca per substring)
Risposta (200) — PageCrmOrganisationDTO
{
"totalElements": 10,
"content": [{
"id": "...",
"name": "Esempio S.r.l.",
"organisationId": "id-esterno",
"addresses": [],
"communications": [],
"people": [],
"types": []
}]
}
Request Body — OrganisationDTO
{
"name": "Esempio S.r.l.",
"organisationId": "id-esterno",
"addresses": [],
"communications": [],
"types": []
}
Request Body — RelationDeltaDTO
{
"add": ["personId1"],
"remove": []
}
Gli slug definiscono le route URL nello shop e presentano singoli prodotti (product) o liste di prodotti (product-list).
Risposta — PageSlug
{
"content": [{
"id": "507f...",
"slug": "beton-c25-30",
"label": "Calcestruzzo C25/30",
"objectType": "product",
"collection": "products",
"refId": "idMongoProdotto",
"inactive": false
}]
}
Request Body — Slug
{
"id": "507f...", // Da indicare in caso di update
"slug": "mio-slug", // Segmento URL (obbligatorio)
"collection": "products", // Collection MongoDB (obbligatorio)
"objectType": "product", // "product" oppure "product-list" (obbligatorio)
"refId": "...", // ID prodotto (con objectType "product")
"fields": { // Filtri per "product-list"
"category": "beton"
},
"defaultSort": [{ "field": "name", "direction": "asc" }],
"context": ["main-nav"],
"inactive": false
}
Utile per trovare lo slug di un prodotto noto.
Parametri path
| Nome | Descrizione |
|---|---|
| fieldName* | Campo prodotto da cui vengono generati gli slug |
Parametri query
| Nome | Descrizione |
|---|---|
| values | Limitazione opzionale a determinati valori del campo |
Parametri query
| Nome | Descrizione |
|---|---|
| navScope | Filtro opzionale sul contesto di navigazione |
Risposta (200)
["main-nav", "footer", "sidebar"]
Request Body — Array di ItemOrderDTO
[
{ "sku": "SKU-001", "categoryId": "catId", "order": 0 },
{ "sku": "SKU-002", "categoryId": "catId", "order": 1 }
]
Request Body — NavigationUpdateDTO
{
"slugId": "slugMongoId",
"navigationNames": ["main-nav", "footer"]
}
Parametri path
| Nome | Descrizione |
|---|---|
| key* | Chiave dell'impostazione |
Request Body — Setting
{
"key": "chiave-impostazione",
"public": {
// Impostazioni accessibili pubblicamente
"theme": "dark"
},
"private": {
// Accessibile solo alle richieste autenticate
"apiKey": "secret"
}
}
Parametri query
| Nome | Descrizione |
|---|---|
| p | Pagina |
| s | Dimensione pagina |
| f | Filtro sul nome file |
| mime | Filtro sul tipo MIME (es. image/png) |
Request come multipart/form-data con il campo file.
Content-Type: multipart/form-data file: [binary data]
Integrazione Stripe per l'elaborazione dei pagamenti. Sono disponibili due modalità: Standard Stripe (stripe) ed External Stripe (stripe-external).
Risposta (200)
{ "publishableKey": "pk_live_..." }
Restituisce lo stato attuale dei pagamenti dello shop.
Solo per webhook Stripe
Questo endpoint è destinato agli eventi webhook Stripe in ingresso. L'header Stripe-Signature è obbligatorio e viene impostato automaticamente da Stripe.
Header
| Nome | Descrizione |
|---|---|
| Stripe-Signature* | Header di firma impostato da Stripe per la verifica |
Risposta (200) — WebhookTestStatusDTO
{
"sandbox": {
"mode": "SANDBOX",
"passed": true,
"ranAt": "2024-01-15T10:30:00Z",
"durationMs": 234,
"pending": false
},
"production": { /* analogo */ }
}
Parametri path
| Nome | Descrizione |
|---|---|
| entity* | Tipo di entità (es. products, persons) |
Request Body (multipart)
Content-Type: application/json file: [binary — file CSV o JSON]
Risposta (200) — UploadResponse
{
"success": true,
"importCount": 42
}
Parametri path
| Nome | Descrizione |
|---|---|
| entity* | Tipo di entità (es. products, persons) |
Risposta
File binario (string format: binary)
Panoramica di tutte le strutture dati utilizzate.
PersonDTO
| Campo | Tipo | Descrizione |
|---|---|---|
| id | string | ObjectId MongoDB |
| firstName | string | Nome |
| lastName | string | Cognome |
| string | Indirizzo e-mail | |
| salutation | string | Formula di saluto |
| title | string | Titolo (es. Dott.) |
| personId | string | ID esterno/proprio |
| tenantId | integer | Assegnazione al tenant |
| addresses | AddressDTO[] | Indirizzi |
| communications | CommunicationDTO[] | Canali di comunicazione |
| organisations | OrganisationDTO[] | Organizzazioni assegnate |
| types | BusinessContactTypeDTO[] | Tipi di contatto |
| createdAt | datetime | Data di creazione |
| updatedAt | datetime | Ultimo aggiornamento |
AddressDTO
| Campo | Tipo | Descrizione |
|---|---|---|
| street | string | Nome della via |
| streetNumber | string | Numero civico |
| supplemental | string | Complemento di indirizzo |
| zipCode | string | Codice postale |
| city | string | Città |
| country | string | Paese (codice ISO, es. IT) |
| type | string | Tipo di indirizzo (es. MAIN, BILLING) |
Slug
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| id | string | — | ObjectId MongoDB |
| slug | string | Subroute URL dello shop | |
| label | string | — | Nome leggibile |
| collection | string | Collection MongoDB | |
| objectType | string | "product" oppure "product-list" | |
| refId | string | — | Riferimento al prodotto (con product) |
| fields | object | — | Filtri per product-list |
| context | string[] | — | Contesti di visualizzazione |
| defaultSort | SortField[] | — | Ordinamento predefinito |
| inactive | boolean | — | Disattiva lo slug |
ProductDataDTO
| Campo | Tipo | Descrizione |
|---|---|---|
| base | object | Dati base del prodotto (dinamici, specifici dello shop) |
| additional | object | Campi aggiuntivi estensibili |
RelationDeltaDTO
Utilizzato negli endpoint PATCH per gestire le relazioni (persone↔organizzazioni).
| Campo | Tipo | Descrizione |
|---|---|---|
| add | string[] | ID da aggiungere |
| remove | string[] | ID da rimuovere |
Wiresphere API · OpenAPI 3.0.1 · Documentazione generata a maggio 2026
URL di base: https://api.wiresphere.com · Autenticazione: Bearer JWT · Validità del token: 24 ore