Documentazione · Riferimento API

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.

In sintesi: OpenAPI 3.0.1 · URL di base 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.
Autenticazione

L'API utilizza l'autenticazione basata su token (Bearer JWT). I token sono validi per 24 ore.

1
Richiedere il token

Invii username e password all'endpoint di autenticazione. Per gli utenti admin l'header tenant-id non deve essere inviato.

2
Utilizzare il token

Aggiunga il token ricevuto all'header Authorization di tutte le richieste protette:

Authorization: Bearer <il-suo-token>
3
Scadenza del token

I token sono validi per 24 ore. Un token scaduto o non valido genera un 409 Conflict.

POST
/api/v1/auth/token-auth
Richiedere il token — verifica le credenziali utente e restituisce il JWT

Parametri header

NomeInTipoObbligatorioDescrizione
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

200 Token creato con successo
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
401 Credenziali non valide
400 Richiesta errata
Concetto di tenant

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
Inventario (prodotti)

Gestione dell'inventario prodotti di uno shop. Supporta operazioni CRUD e operazioni in massa.

GET
/api/v1/admin/inventory/
Recuperare tutti i prodotti (paginato)

Header

NomeInObbligatorioDescrizione
tenant-idheaderID dello shop
AuthorizationheaderBearer <token>

Parametri query

NomeTipoDescrizione
pintegerPagina (default: 0)
sintegerDimensione pagina (default: 10)
fstring[]Filtri: name, SKU, vatClass, status
ostring[]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 */ }
    }
  ]
}
GET
/api/v1/admin/inventory/{sku}
Recuperare un singolo prodotto tramite SKU

Parametri path

NomeInDescrizione
sku*pathIdentificatore univoco del prodotto nello shop (Stock Keeping Unit)

Risposta (200) — ProductDataDTO

{
  "base": { /* Dati base del prodotto (nome, SKU, prezzo ecc.) */ },
  "additional": { /* Campi estesi */ }
}
PUT
/api/v1/admin/inventory/
Creare o aggiornare un prodotto (upsert)

Request Body (application/json) — ProductDataDTO

{
  "base": {
    // Campi obbligatori e dati del prodotto (nome, SKU, prezzo, stato ecc.)
  },
  "additional": {
    // Campi aggiuntivi opzionali
  }
}

Risposta

200 ID del prodotto creato/aggiornato (string)
DELETE
/api/v1/admin/inventory/
Eliminare più prodotti in base ai loro ID

Request Body (application/json)

["idProdotto1", "idProdotto2"]

Risposta

200 Conferma (string)
GET
/api/v1/admin/inventory/operations
Recuperare le operazioni in massa disponibili

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"]
}]
POST
/api/v1/admin/inventory/operations/preview
Anteprima di un'operazione in massa (dry run)

Simula un'operazione bulk e mostra lo stato prima/dopo — senza salvare i dati.

Request Body

{
  "operationId": "set-status",
  "parameters": { "status": "ACTIVE" },
  "confirmAll": false
}
POST
/api/v1/admin/inventory/operations/execute
Eseguire un'operazione in massa

Esegue un'operazione bulk sui prodotti filtrati. Modifica i dati in modo permanente.

Parametri query

NomeDescrizione
fFiltro che determina quali prodotti sono interessati

Request Body

{
  "operationId": "set-status",
  "parameters": { "status": "INACTIVE" }
}
Transazioni

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

GET
/api/v1/admin/transaction/
Recuperare tutte le transazioni (admin) — paginato, filtrabile

Campi filtro (parametro f)

CampoFormatoDescrizione
min_createdAtISO 8601Creato a partire dalla data
max_createdAtISO 8601Creato fino alla data
doctypeORDER/CONTRACT/INVOICETipo di transazione
docIdstringID documento
processIdstringID processo
processTypestringPipeline di processo
payload.channelstringCanale di vendita
payload.emailstringE-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
GET
/api/v1/admin/transaction/{processId}/{docId}
Recuperare una singola transazione

Parametri path

NomeDescrizione
processId*ID processo (raggruppa le transazioni correlate)
docId*ID documento della transazione specifica
GET
/api/v1/admin/transaction/filter-values
Recuperare i valori distinct per i filtri

Parametri query

NomeObbligatorioDescrizione
propsCampi per i quali determinare i valori distinct
andNoPrefiltro AND
orNoPrefiltro OR

Risposta (200)

{
  "doctype": ["ORDER", "INVOICE"],
  "payload.channel": ["online", "terminal"]
}
POST
/api/v1/admin/transaction/{processId}/{docId}/cancel
Stornare una singola transazione

Parametri path

NomeDescrizione
processId*ID processo
docId*ID documento della transazione da stornare

Parametri query

NomeDescrizione
reasonMotivo dello storno (opzionale)
POST
/api/v1/admin/transaction/{processId}/cancel
Stornare l'intero processo (tutte le transazioni)

Parametri path

NomeDescrizione
processId*ID processo — vengono stornate tutte le transazioni associate

Parametri query

NomeDescrizione
reasonMotivo dello storno (opzionale)
GET
/api/v1/transaction/
Recuperare le transazioni (endpoint pubblico — Bearer non richiesto)

Opzioni di filtro e ordinamento identiche all'endpoint admin, ma senza autenticazione Bearer. Filtra sui dati accessibili nel contesto dello shop.

Persone (CRM)

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.

GET
/api/v1/admin/person/all
Recuperare tutte le persone (paginato)

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": []
  }]
}
GET
/api/v1/admin/person/{id}
Recuperare una singola persona

Parametri path

NomeDescrizione
id*ObjectId MongoDB della persona
POST
/api/v1/admin/person
Creare una 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": []
}
PUT
/api/v1/admin/person/{id}
Aggiornare una persona

Stesso request body del POST. Sostituzione completa del record.

PATCH
/api/v1/admin/person/{id}/organisations
Modificare l'assegnazione delle organizzazioni di una persona

Request Body — RelationDeltaDTO

{
  "add": ["orgId1", "orgId2"],
  "remove": ["orgIdVecchio"]
}
DELETE
/api/v1/admin/person/{id}
Eliminare una persona

Risposta (200) — OkDTO

{ "ok": true }
DELETE
/api/v1/admin/person/bulk-delete
Eliminare più persone contemporaneamente

Request Body

["id1", "id2", "id3"]
Organizzazioni (CRM)

Gestione di aziende e organizzazioni. Analogamente alle persone, raggiungibili anche tramite due percorsi paralleli.

GET
/api/v1/admin/organisation/all
Recuperare tutte le organizzazioni (paginato)

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": []
  }]
}
POST
/api/v1/admin/organisation
Creare un'organizzazione

Request Body — OrganisationDTO

{
  "name": "Esempio S.r.l.",
  "organisationId": "id-esterno",
  "addresses": [],
  "communications": [],
  "types": []
}
PATCH
/api/v1/admin/organisation/{id}/people
Modificare l'assegnazione delle persone di un'organizzazione

Request Body — RelationDeltaDTO

{
  "add": ["personId1"],
  "remove": []
}
Catalogo / Slug

Gli slug definiscono le route URL nello shop e presentano singoli prodotti (product) o liste di prodotti (product-list).

GET
/api/v1/admin/catalog/
Recuperare tutti gli slug (paginato)

Risposta — PageSlug

{
  "content": [{
    "id": "507f...",
    "slug": "beton-c25-30",
    "label": "Calcestruzzo C25/30",
    "objectType": "product",
    "collection": "products",
    "refId": "idMongoProdotto",
    "inactive": false
  }]
}
PUT
/api/v1/admin/catalog/
Creare o aggiornare uno slug (upsert)

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
}
GET
/api/v1/admin/catalog/ref-id/{refId}
Recuperare uno slug tramite l'ID di riferimento (ID prodotto)

Utile per trovare lo slug di un prodotto noto.

POST
/api/v1/admin/catalog/create-slugs/{fieldName}
Generare automaticamente gli slug

Parametri path

NomeDescrizione
fieldName*Campo prodotto da cui vengono generati gli slug

Parametri query

NomeDescrizione
valuesLimitazione opzionale a determinati valori del campo
Categorie e navigazione
GET
/api/v1/category/navigation
Recuperare la navigazione (pubblico)

Parametri query

NomeDescrizione
navScopeFiltro opzionale sul contesto di navigazione
GET
/api/v1/admin/category/navigation-contexts
Recuperare i contesti di navigazione disponibili

Risposta (200)

["main-nav", "footer", "sidebar"]
PUT
/api/v1/admin/category/items/order
Aggiornare l'ordine degli elementi in una categoria

Request Body — Array di ItemOrderDTO

[
  { "sku": "SKU-001", "categoryId": "catId", "order": 0 },
  { "sku": "SKU-002", "categoryId": "catId", "order": 1 }
]
POST
/api/v1/admin/category/update-slug-navigations
Aggiungere uno slug a una o più navigazioni (idempotente)

Request Body — NavigationUpdateDTO

{
  "slugId": "slugMongoId",
  "navigationNames": ["main-nav", "footer"]
}
Impostazioni
GET
/api/v1/admin/settings/{key}
Recuperare un'impostazione tramite chiave

Parametri path

NomeDescrizione
key*Chiave dell'impostazione
PUT
/api/v1/admin/settings
Creare o aggiornare un'impostazione

Request Body — Setting

{
  "key": "chiave-impostazione",
  "public": {
    // Impostazioni accessibili pubblicamente
    "theme": "dark"
  },
  "private": {
    // Accessibile solo alle richieste autenticate
    "apiKey": "secret"
  }
}
Gestione file
GET
/api/v1/admin/files/
Elencare file/immagini

Parametri query

NomeDescrizione
pPagina
sDimensione pagina
fFiltro sul nome file
mimeFiltro sul tipo MIME (es. image/png)
POST
/api/v1/admin/files/
Caricare un file

Request come multipart/form-data con il campo file.

Content-Type: multipart/form-data

file: [binary data]
Payment / Stripe

Integrazione Stripe per l'elaborazione dei pagamenti. Sono disponibili due modalità: Standard Stripe (stripe) ed External Stripe (stripe-external).

GET
/api/v1/payment/stripe/public
Recuperare le impostazioni Stripe pubbliche (es. publishable key)

Risposta (200)

{ "publishableKey": "pk_live_..." }
GET
/api/v1/payment/stripe/state
Recuperare lo stato attuale dei pagamenti Stripe

Restituisce lo stato attuale dei pagamenti dello shop.

POST
/api/v1/payment/stripe-common/capturable
Webhook Stripe — impostare lo stato del pagamento (produzione)

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

NomeDescrizione
Stripe-Signature*Header di firma impostato da Stripe per la verifica
POST
/api/v1/admin/payment/stripe-common/webhook-test
Testare il webhook Stripe (admin)

Risposta (200) — WebhookTestStatusDTO

{
  "sandbox": {
    "mode": "SANDBOX",
    "passed": true,
    "ranAt": "2024-01-15T10:30:00Z",
    "durationMs": 234,
    "pending": false
  },
  "production": { /* analogo */ }
}
Import / Export
POST
/api/v1/admin/import/{entity}
Importare entità (upload CSV/JSON)

Parametri path

NomeDescrizione
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
}
GET
/api/v1/admin/export/{entity}
Esportare entità (download file)

Parametri path

NomeDescrizione
entity*Tipo di entità (es. products, persons)

Risposta

File binario (string format: binary)

Modelli di dati (schemi)

Panoramica di tutte le strutture dati utilizzate.

PersonDTO

CampoTipoDescrizione
idstringObjectId MongoDB
firstNamestringNome
lastNamestringCognome
emailstringIndirizzo e-mail
salutationstringFormula di saluto
titlestringTitolo (es. Dott.)
personIdstringID esterno/proprio
tenantIdintegerAssegnazione al tenant
addressesAddressDTO[]Indirizzi
communicationsCommunicationDTO[]Canali di comunicazione
organisationsOrganisationDTO[]Organizzazioni assegnate
typesBusinessContactTypeDTO[]Tipi di contatto
createdAtdatetimeData di creazione
updatedAtdatetimeUltimo aggiornamento

AddressDTO

CampoTipoDescrizione
streetstringNome della via
streetNumberstringNumero civico
supplementalstringComplemento di indirizzo
zipCodestringCodice postale
citystringCittà
countrystringPaese (codice ISO, es. IT)
typestringTipo di indirizzo (es. MAIN, BILLING)

Slug

CampoTipoObbligatorioDescrizione
idstringObjectId MongoDB
slugstringSubroute URL dello shop
labelstringNome leggibile
collectionstringCollection MongoDB
objectTypestring"product" oppure "product-list"
refIdstringRiferimento al prodotto (con product)
fieldsobjectFiltri per product-list
contextstring[]Contesti di visualizzazione
defaultSortSortField[]Ordinamento predefinito
inactivebooleanDisattiva lo slug

ProductDataDTO

CampoTipoDescrizione
baseobjectDati base del prodotto (dinamici, specifici dello shop)
additionalobjectCampi aggiuntivi estensibili

RelationDeltaDTO

Utilizzato negli endpoint PATCH per gestire le relazioni (persone↔organizzazioni).

CampoTipoDescrizione
addstring[]ID da aggiungere
removestring[]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