GET · Esportazione · Lettura · v2.1.0API di esportazione
Esporta i dati dal negozio. A partire dalla versione 2.1.0, con percorsi URL RESTful: /categories/{id} restituisce la categoria stessa.
GET /Export/JSON/categories # Alle
GET /Export/JSON/categories/128 # ID 128
GET /Export/JSON/categories?parent_id=128 # Kinder
/categories/{id} = risorsa singola
La categoria con questo ID
GET /Export/JSON/categories/128
→ Kategorie 128 ("xoPort REST API")
?parent_id={id} = Figli
Figli della categoria padre
GET /Export/JSON/categories?parent_id=128
→ Unterkategorien von 128
Modifica sostanziale nella versione 2.1.0: in precedenza /categories/{id} restituiva le risorse figlie. Ora utilizzare ?parent_id={id} per le risorse figlie.
| Endpoint | Descrizione | Esempio |
|---|
GET /categories | Tutte le categorie | Albero completo delle categorie |
GET /categories/{id} | Singola categoria | /categories/128 → ID 128 |
GET /categories?id={id} | Senza effetto dalla v2.23.0: restituisce tutte le categorie. Una categoria tramite /categories/{id} | – |
GET /categories?parent_id={id} | Figli diretti | ?parent_id=128 |
GET /categories?parent_id={id}&recursive=1 | Sottostruttura completa | Tutti i discendenti |
GET /categories?status=1 | Solo attivi | Filtro |
GET /categories?seo_string={pfad} | Categoria sotto un indirizzo del negozio, esattamente l'intero percorso NUOVO v2.122.11 | ?seo_string=angelruten/spinnruten&language=de |
GET /categories?language=de | Solo tedesco | Filtro per lingua |
GET /categories/productlist | Lightweight: Mappatura categoria→prodotto NUOVO v2.12.0 | Per categoria: ID + modelli |
GET /categories/productlist?categories_id={id} | Prodotti di una categoria | ?categories_id=73 |
| Media NUOVO v2.16.0 | GET /Export/JSON/medias | media:read |
| Entità | Tutti | Singolo | Ambito |
|---|
| Prodotti Pagination SQL v2.12.0 | GET /products | GET /product/{id} | products:read |
| Clienti | GET /customers | GET /customer/{id} | customers:read |
| Carrelli NUOVO v2.122.10 | GET /customers_baskets | GET /customers_basket/{customers_id} | customers:read |
| Produttori | GET /manufacturers | GET /manufacturer/{id} | manufacturers:read |
| Ordini | GET /orders | GET /order/{id} | orders:read |
| Stato dell'ordine NUOVO v2.122.10 | GET /order_statuses | GET /order_status/{id} | orders:read |
Documenti di accompagnamento NUOVO v2.61.0 PDF in formato content_base64 – utilizzabile direttamente come allegato al ticket | – | GET /order_document/{id}?type=rg | orders:read |
| Notizie | GET /newsdesks | GET /newsdesk/{id} | news:read |
| Categorie delle notizie | GET /newsdeskcats | GET /newsdeskcat/{id} | newscategories:read |
| Domande frequenti | GET /faqs | GET /faq/{id} | faq:read |
| Categorie delle FAQ | GET /faqcats | GET /faqcat/{id} | faqcategories:read |
Cronologia SEO Cerca vecchio indirizzo: ?seo_string= (v2.122.11) | GET /seohistorys | GET /seohistory/{id} | seohistory:read |
| Contratti | GET /contracts | GET /contract/{id} | contracts:read |
| Abbonati alla newsletter | GET /newsletter_subscribers | GET /newsletter_subscriber/{id} | newsletter:read |
| Campagne newsletter | GET /newsletters | GET /newsletter/{id} | newsletters:read |
Ticket CRUD v2.11.0 Con claim e edit_lock (v2.118.0) | GET /tickets | GET /ticket/{id} | tickets:read |
Allegati ai ticket Invia: attachments[] a POST/PUT /Import/JSON/tickets (v2.60.0) | GET /ticket_attachments/{id} | GET /ticket_attachment/{id}?file=name | tickets:read |
| Slider NOVITÀ v2.22.0 | GET /sliders | GET /slider/{id} | slider:read |
| Progetti (xoCRM) NOVITÀ v2.35.0 | GET /projects | GET /project/{id} | projects:read |
| Attività di progetto NOVITÀ v2.35.0 | GET /project_tasks | GET /project_task/{id} | project_tasks:read |
| Appuntamenti (xoCRM) NOVITÀ v2.44.0 | GET /appointments | GET /appointment/{id} | appointments:read |
| Caratteristiche e valori delle opzioni NOVITÀ v2.96.0 | GET /products_options
GET /products_options_values | GET /products_option/{id} | products:read |
| Profili tempi di consegna NOVITÀ v2.94.0 | GET /shipping_profiles | GET /shipping_profile/{id} | products:read |
| Classi fiscali NOVITÀ v2.90.0 | GET /tax_classes | GET /tax_class/{id} | products:read |
| Filtri delle pagine delle categorie NOVITÀ v2.100.0 | GET /products_filters | GET /products_filter/{fid} | products:read |
| Buoni e coupon NOVITÀ v2.102.0 | GET /coupons | GET /coupon/{id} | orders:read |
| Reparti dei biglietti NOVITÀ v2.103.0 | GET /ticket_departments | GET /ticket_department/{id} | tickets:read |
| Impostazioni NOVITÀ v2.108.0 | GET /configuration | – | configuration:read |
| Importatore CSV/XLS NOVITÀ v2.109.0 | GET /porters | GET /porter/{id} | porters:read |
| Recensioni NOVITÀ v2.122.6 | GET /reviews | GET /review/{id} | products:read |
Le singole recensioni della pagina del prodotto con valutazione a stelle, titolo, testo e risposta del negozio per ogni lingua. Senza filtri, l'elenco mostra solo le recensioni approvate, ovvero le stesse presenti sulla pagina del prodotto. La query singola /review/{id} fornisce una recensione anche prima dell'approvazione.
| Parametri | Funzionalità | Esempio |
|---|
products_id | Recensioni di uno o più articoli | ?products_id=104648,104650 |
status | 1 pubblicate (impostazione predefinita), 0 in attesa di pubblicazione, all entrambe | ?status=all |
since | creati o modificati l'ultima volta a partire dal | ?since=2026-10-05 |
Esempio – sincronizzazione giornaliera, comprese le approvazioni revocate:
GET /reviews?status=all&since=2026-10-05&limit=250&page=1
Nessun dato del cliente. author è il nome visualizzato anche nella pagina del prodotto. L’endpoint non fornisce l’ID cliente, l’e-mail e il numero d’ordine, ma solo verified_purchase (recensione relativa a un ordine). Pertanto è sufficiente l’ambito products:read. Le recensioni cancellate non compaiono più nell’elenco. Chi esegue il mirroring di un inventario, quindi, deve verificare periodicamente tutti gli ID.
GET /Export/JSON/categories/128?language=de
{
"success": true,
"api_version": "2.122.12",
"type": "categories",
"data": [
{
"categories_id": 128,
"parent_id": 97,
"status": 1,
"languages": {
"de": {
"categories_name": "xoPort REST API",
"categories_description": "..."
}
},
"restricted_customer_groups": []
}
],
"stats": {
"total": 1,
"count": 1,
"timestamp": "2026-10-18 14:00:00"
}
}
stats indica il numero di risultati, il numero di record e l’ora della risposta; durante la navigazione, anche la dimensione della pagina e la posizione. Tutte le chiavi e quando si naviga: sezione «Pagination» in fondo.warnings[] Viene visualizzato solo in presenza di avvisi, ad esempio UNKNOWN_FILTER per un parametro sconosciuto.
Avvia l’esportazione
Creare un client OAuth2 con gli ambiti :read.
Crea client OAuth2
Tutti gli endpoint di esportazione utilizzano gli stessi parametri di query:
| Parametri | Predefinito | Max | Descrizione |
|---|
limit | 50 o nessuno (vedi sotto) | 250 | Record per pagina. Un valore superiore viene limitato a 250, con l'aggiunta dell'avviso LIMIT_CAPPED |
offset | 0 | — | Posizione iniziale nei risultati |
page | — | — | Numero di pagina a partire da 1, corrisponde a offset = (page − 1) × limit. Non inviare insieme a offset (HTTP 400 INVALID_PAGINATION) |
Senza limit, la possibilità di scorrere le pagine dipende dall'endpoint:
| Endpoint | senza limit | page senza limit |
|---|
| Elenchi di prodotti, clienti, ordini, caratteristiche e valori delle caratteristiche (senza ID nel percorso); valutazioni, anche con ID o intervallo nel percorso; carrelli, anche con intervallo nel percorso | scorrimento sempre attivo, 50 per pagina; stats contiene sempre limit, offset e has_more | 50 per pagina |
| tutti gli altri, compresi gli ID e gli intervalli nel percorso dei prodotti, dei clienti, degli ordini, delle caratteristiche e dei valori delle caratteristiche, nonché il carrello di un cliente | fino a 250 risultati non sfogliati in una risposta, senza limit, offset e has_more in stats; in caso di risultati superiori, i primi 50 e stats.has_more | 250 per pagina; in caso di ID o intervallo nel percorso, codice di stato HTTP 400 (vedi sotto) |
Esempio: GET /products?limit=50&offset=100
La risposta contiene nell’oggetto stats:
total — Numero di risultati prima dello scorrimento (sempre)count — Numero di record in questa risposta (sempre)timestamp — Ora della risposta, ad esempio 2026-10-18 14:00:00 (sempre)limit, offset — dimensione della pagina applicata e posizione iniziale, solo in caso di scorrimentohas_more — true, se dopo questa pagina seguono altri risultati; solo se si scorre la paginapage — solo dopo ?page=
Non presentano " stats " i documenti di riferimento (/order_document/{id}) e il recupero del file allegato a un ticket (?file=); in entrambi i casi non si effettua lo scorrimento.
- Laddove senza
limit la risposta viene fornita senza scorrimento, un offset da solo ha effetto solo in presenza di più di 250 risultati. Per uno scorrimento mirato, inviare quindi sempre limit. - Se nel percorso è presente un ID o un intervallo,
?page= restituisce un errore HTTP 400 INVALID_PAGINATION, poiché il percorso indica già i record. Solo le valutazioni (anche con ID) e i carrelli con intervallo {a}:{b} consentono la navigazione anche tramite page. - L'elenco viene visualizzato per intero quando si continua a scorrere tramite
limit e page o offset, fino a quando has_more diventa false.
L’esportazione dei prodotti può essere limitata a livello di server, invece di recuperare l’intero catalogo pagina per pagina. Una virgola separa un elenco di inclusioni (massimo 100 valori); più filtri vengono combinati con l’operatore “E”.
| Parametri | Effetto | Esempio |
|---|
status | Stato articolo | ?status=1 |
tax_class_id | Classe fiscale | ?tax_class_id=0,1 |
categories_id | L'articolo rientra in una delle seguenti categorie | ?categories_id=10039,10104 |
ean_prefix | Il codice EAN inizia con … | ?ean_prefix=978,979,977 |
model_prefix | Il numero articolo inizia con … | ?model_prefix=166- |
products_model, products_ean | il codice articolo o l’EAN, esattamente | ?products_model=KB |
last_modified | modificato a partire da …; un valore composto esclusivamente da segni di punteggiatura (?last_modified=.) genera un errore HTTP 400 a partire dalla versione v2.122.11 | ?last_modified=2026-08-19 |
seo_name | Indirizzo dello shop di un articolo: slug valido, esatto, tutte le lingue NOVITÀ v2.122.11 | ?seo_name=angelrute-xy |
marketplace con marketplace_status, marketplace_upload_status o marketplace_sync_state | Filtro marketplace: canale (ID o codice) e almeno una condizione, tutte sullo stesso canale NOVITÀ v2.122.11 | ?marketplace=idealo&marketplace_sync_state=pending |
fields | Nessun filtro: solo queste chiavi per ogni prodotto (selezione dei campi) NOVITÀ v2.122.11 | ?fields=products_model,products_price |
Esempio – tutti gli articoli acquistabili con EAN libro che non rientrano nell’aliquota ridotta:
GET /products?ean_prefix=978,979,977&tax_class_id=0,1&status=1&limit=250
stats.total indica il numero di risultati del filtro, non la dimensione del catalogo.
A partire dalla v2.122.11, un valore composto esclusivamente da virgole inviato a products_model, products_ean o seo_name (?products_model=,) genera un errore HTTP 400 INVALID_FILTER_VALUE; in precedenza il filtro veniva ignorato e veniva restituito il catalogo non filtrato. Gli altri elenchi di filtri rifiutavano già in precedenza i valori composti esclusivamente da virgole. Un elemento vuoto tra i valori (A,,B) continua a essere ignorato; un valore completamente vuoto significa «non impostato». Filtri del marketplace e selezione dei campi in dettaglio: Products.
Non esiste volutamente un operatore «diverso da». «Tutto tranne la classe fiscale 2» va scritto come elenco inclusivo delle restanti classi (?tax_class_id=0,1). Un valore di filtro non valido viene respinto con HTTP 400 e non scartato silenziosamente – altrimenti verrebbe restituito il catalogo non filtrato. I filtri su una singola risorsa (/products/{id}) o su un intervallo di ID vengono respinti per lo stesso motivo.
GET /coupons fornisce buoni e coupon; GET /coupon/{id} ne fornisce uno. L’ambito è orders:read; non ne esiste uno specifico. I filtri multipli vengono combinati con l’operatore AND.
| Parametri | Effetto | Esempio |
|---|
code | Codice del buono, esatto (non fa differenza maiuscolo/minuscolo) | ?code=SOMMER10 |
type | P Percentuale, S spedizione gratuita, F importo fisso, G/N credito; elenco separato da virgole | ?type=P,F |
active | 1 attivo, 0 inattivo | ?active=1 |
kind | discount oppure credit | ?kind=credit |
valid_on | solo coupon validi in quel giorno | ?valid_on=2026-09-13 |
last_modified | Delta: buoni creati o modificati a partire da questo momento NOVITÀ v2.122.10 | ?last_modified=2026-10-12%2005:00:00 |
last_modified accetta le forme fisse dei filtri delta: YYYY-MM-DD, YYYY-MM-DD HH:MM o YYYY-MM-DD HH:MM:SS (separatore: spazio, T o +), facoltativamente frazioni di secondo e, dopo l’ora, un fuso orario (Z, ±HH:MM, ±HHMM). Un coupon senza data di modifica e di creazione non compare in nessun delta. Un valore vuoto significa «non impostato».- Un valore di elenco (
?type[]=P, ?code[a]=…, anche vuoto) genera un errore HTTP 400 INVALID_FILTER_VALUE per ogni filtro delle cedole; più tipi possono essere specificati come elenco separato da virgole. Tutti gli errori di una richiesta sono raggruppati in details[]; la verifica avviene prima dell’invio della richiesta. - Solo virgole su
?type= e una data senza contenuto su ?valid_on=: vedi «Solo separatori, UTF-8 non valido» e «Filtro data senza contenuto» più avanti.
Modificato nella v2.122.10:?last_modified= ora fa parte dei filtri dell’endpoint: non viene più visualizzato l’avviso UNKNOWN_FILTER e il delta può essere recuperato anche con ?_strict=true. Il filtraggio era già attivo in precedenza, ma l’avviso segnalava che il filtro era stato ignorato e con ?_strict=true veniva restituito un codice HTTP 400.- Le richieste che fino alla v2.122.9 ricevevano un codice HTTP 200, ora restituiscono un codice HTTP 400
INVALID_FILTER_VALUE senza dati: un valore dell’elenco in un filtro coupon (finora “non impostato”, ovvero l’elenco completo dei coupon comprensivo dei codici di credito) e su ?last_modified= un’ora al di fuori dei formati prestabiliti. I formati liberi come 12.10.2026, yesterday o -1 day funzionavano fino alla versione v2.122.9; un valore illeggibile restituiva tutti i coupon. Prima dell’aggiornamento, verificare i formati delle proprie richieste. - A partire dalla versione 4.9.169 dello Shop, i coupon copiati nel backend non riportano più la data di modifica del modello e vengono quindi visualizzati nel delta. Le copie più vecchie rimangono invariate.
Modificato nella v2.122.9:coupon_code il testo rimane invariato, anche in caso di codici puramente numerici ("4711", "0123456789"). Finora tali codici venivano visualizzati come numeri: gli zeri iniziali venivano omessi e codici come "0e123456" venivano riscritti (in 0). Verificare i confronti esatti per tipo; per gli shop più vecchi, eseguire la ricerca con ?numeric_check=false.restrictions.categories contiene anche le categorie salvate insieme alle sottocategorie; quali siano è indicato nel nuovo campo restrictions.categories_with_subcategories. Finora, una restrizione basata solo su tali categorie veniva visualizzata come elenco vuoto, ovvero come «nessuna restrizione».
Ogni parametro di query di ogni endpoint JSON ha una regola, per Export, Import e Delete. Il controllo avviene prima che l’endpoint legga, scriva o elimini qualcosa: un valore non valido genera un HTTP 400 INVALID_FILTER_VALUE, mentre details[] riporta rispettivamente gli errori param e message. Import e Delete rispondono nella stessa forma («… Nothing was written» o «… Nothing was deleted»). XML, CSV e TXT rimangono invariati.
GET /Export/JSON/tickets?status=abc&priority[]=2
HTTP 400
{
"success": false,
"error": {
"code": "INVALID_FILTER_VALUE",
"message": "One or more filter values could not be used. No data was returned — see \"details\"."
},
"details": [
{ "param": "status", "message": "Value \"abc\" is not an integer." },
{ "param": "priority",
"message": "Value must be a single value, not a list (param[]=… or param[key]=…). …" }
]
}
- I valori di elenco (
?param[]=…, ?param[key]=…) generano un errore per ogni parametro. È possibile inserire più valori come elenco separato da virgole, laddove un filtro li accetti (prodotti, clienti, delivery_country …). - Un valore vuoto (
?status=) significa «non impostato». A partire dalla versione v2.122.12, gli spazi vuoti ai margini non vengono conteggiati (vedi «Spazi vuoti ai margini» più sotto); nei negozi precedenti alla versione 4.9.173, inviare valori senza spazi vuoti ai margini e omettere i parametri vuoti. I valori validi senza spazi ai margini funzionano come prima, con lo stesso numero di risultati. - Tutti gli errori di una richiesta sono riportati in un
details[]. Lo scorrimento e l’ordinamento (limit, offset, page, sort, order) segnalano INVALID_PAGINATION, ora anche per le forme di percorso e gli endpoint che non supportano lo scorrimento. - Segnalare i nomi di parametri sconosciuti in fase di esportazione come in precedenza con l'avviso
UNKNOWN_FILTER, mentre con ?_strict=true viene restituito un HTTP 400. In fase di importazione e cancellazione, i nomi sconosciuti vengono ignorati silenziosamente. /orders Accetta più valori solo in delivery_country: ?status=3,4 genera un errore HTTP 400; inviare una richiesta separata per ogni stato.
Modificato nella v2.122.10: fino alla v2.122.9 ogni endpoint effettuava autonomamente la verifica. Un valore che non superava il test veniva solitamente omesso dal filtro senza alcun avviso (HTTP 200 con il contenuto non filtrato, anche con ?_strict=true), oppure veniva troncato o reinterpretato. Chi invia elenchi come param[]=, elenchi separati da virgole a filtri con un solo valore, testo a filtri numerici, true/yes agli switch 0/1 o orari liberi a last_modified degli endpoint CRM, ora riceve un codice di stato HTTP 400. Prima dell’aggiornamento, verificare le proprie richieste confrontandole con le tabelle riportate di seguito.
| Richiesta | fino alla v2.122.9 | dalla v2.122.10 |
|---|
/orders?status=abc, ?customer_id=7,8,9, ?status=3,4 | Filtro non applicabile: tutti gli ordini di tutti i clienti | HTTP 400 INVALID_FILTER_VALUE |
/orders?status=1.5, ?products_id=1e3 | interpretato come 1 o 1000 | HTTP 400 |
/tickets?status=abc, /contracts?interval=5, /medias?since=quatsch | Filtro non applicabile | HTTP 400 |
/tickets?date_from=quatsch (lo stesso vale per contratti, progetti, attività, appuntamenti, accrediti) | dal 01/01/1970, ovvero tutto | HTTP 400 |
/products?status[]=1, /faqs?status[]=1, /cms?module[]=stripe | il filtro non è necessario: l’intero catalogo, ovvero tutte le FAQ o le pagine | HTTP 400 |
?language=xx | per ogni endpoint un elenco vuoto, tutte le lingue o, in caso di omissione, la lingua predefinita | HTTP 400 |
?language[]=de per ogni endpoint | HTTP 500 | HTTP 400 |
/orders/{a}:{b}?sort=foo (qualsiasi forma di percorso) | sort/order ancora ignorato | HTTP 400 INVALID_PAGINATION |
DELETE /seohistorys?type=p&base_id[]=42 (così come base_id=abc, expired=yes) | ha eliminato tutte le voci di tipo p | HTTP 400, nulla cancellato |
DELETE /ticket_department/{id}?reassign_to[]=5 | ha spostato i ticket nel reparto 1 | HTTP 400, nulla cancellato |
POST/PUT /Import/JSON/…?_strict=1 | modalità rigorosa disattivata, l’importazione ha scritto solo in parte | HTTP 400, nulla scritto |
Regole
| Regola | valida | non valida (esempi) |
|---|
| numero intero | esattamente un numero: 5, -3, 007 | abc, 1.5, 1e3, +5, 7,8,9 |
| ID | numero intero a partire da 1 | 0, -4 |
| Interruttore | 0, 1 | true, yes, on, 2, 1abc |
| Data | dati liberi, così come venivano letti finora dal nodo finale (2026-10-01, 01.10.2026, yesterday) | quatsch, 0; a partire dalla v2.122.11 qualsiasi valore privo di lettere e cifre (vedi «Filtro data senza contenuto») |
| Ora | formati fissi: YYYY-MM-DD, YYYY-MM-DD HH:MM[:SS] (separatore: spazio, T o +), frazioni, fuso orario | yesterday, 01.10.2026, 2026-02-31, 2026/10/01 |
| Codice lingua | (senza distinzione tra maiuscole e minuscole) o ID di una lingua del negozio, anche di una lingua inattiva | sconosciuto, 02, 2.0, 99 |
| Quantità | esattamente uno dei valori indicati | tutto il resto |
| Testo | ogni singolo valore | solo valori dell'elenco |
| Classe di filtro | il punto finale verifica il valore stesso (già finora HTTP 400, vedi la relativa sezione) | Valori dell'elenco (finora in parte ignorati) |
| non applicato (dalla v2.122.11) | – | qualsiasi valore; il nome appartiene a un altro endpoint, il messaggio indica dove è valido |
L'ora è valida per last_modified su /tickets, /projects, /project_tasks e /appointments: finora il database interpretava le forme libere come yesterday come data nulla e la risposta non veniva filtrata. Inviate le ore nel formato 2026-10-01 06:00:00.
Parametri per ciascun endpoint
| Punto terminale | Parametri e regola |
|---|
| ogni endpoint | limit, offset, page Scorrimento · _strict true /false · language Lingua · numeric_check 0 /1/true/false/yes/no/on/off · format Testo (non viene valutato) |
/orders | status, customer_id, marketplace_id, products_id, categories_id numero intero · external_id, po_number, products_model, source testo · date_from, date_to, since, last_modified, delivery_country classe di filtro · sort, order ordinamento |
/products | status, tax_class_id, categories_id, products_id, manufacturers_id, ean_prefix, model_prefix, products_model, products_ean, seo_name (dalla v2.122.11), last_modified Classe di filtro (elenchi separati da virgola) · marketplace, marketplace_status, marketplace_upload_status, marketplace_sync_state Classe di filtro (dalla v2.122.11) · bonus_free_features, bundles, marketplaces (entrambi dalla v2.122.11) Interruttori · fields Selezione campi (dalla v2.122.11) · sort, order |
/customers | tutti i filtri Classe di filtro · sort, order |
/categories | parent_id, status, id numero intero (id non ha alcun effetto dalla v2.23.0) · recursive selettore · seo_string classe di filtro (dalla v2.122.11) |
/categories/productlist | categories_id, status numero intero (categories_id solo senza ID o intervallo nel percorso, altrimenti HTTP 400 FILTER_NOT_APPLICABLE, tranne se il valore è uguale a quello del singolo ID del percorso; a partire dalla v2.122.13) · include_inactive_products flag |
/tickets | status, priority, department, customer_id, admin_id, created_by_admin_id, order_id numero intero · type ticket /job · date_from, date_to data · last_modified ora · ticket_link_id solo lettere e cifre |
/contracts | status, customer_id, product_id numero intero · interval 1 , 2, 3, 4, 6, 12 · date_from, date_to data · active interruttore |
/projects | status, customer_id, category_id, leader_admin_id numero intero · is_private, include_tasks selettore · date_from, date_to data · last_modified ora |
/project_tasks | project_id, status, priority, admin_id, customer_id, category_id, progress_min, progress_max numero intero · due_from, due_to data · last_modified ora |
/appointments | done, vacation, private, allday, include_deleted Interruttore · admin_id Numero intero · ticket_id, customer_id, order_id, project_id, target_id ID · target_type orders_id , orders_products_id, ticket_id, customers_id, admin_note_id, project_id · date_from, date_to Data · last_modified Ora |
/wallet_logs | customer_id, order_id, coupon_id numero intero · source testo · date_from, date_to data · include_historic interruttore |
/medias | entity_type product, , , , , , , (senza distinzione tra maiuscole e minuscole) · numero intero · data products_images category manufacturer static option product_video download entity_id since |
/newsletters | status, language_id numero intero |
/porters | status, with_columns interruttore · rubric testo |
/ticket_departments | active interruttore |
/products_filters | options_id numero intero (negativo = filtri integrati) · categories_id ID |
/products_options | listing_status numero intero · with_values interruttore · name, name_prefix testo · sort, order |
/products_options_values | option_id numero intero · orphaned true /1/false/0 · name, name_prefix testo · sort, order |
/seohistorys | type c, , , , , · numero intero · classe di filtro (dalla v2.122.11) s m p n o base_id seo_string |
/sliders | status, type, categories_id, content_id numero intero |
/faqs, /faqcats | status numero intero |
/cms | status numero intero · module testo |
/ticket_attachment/{id} | file Nome file senza percorso |
/order_document/{id} | type Testo (il tipo di documento viene verificato dall'endpoint stesso: INVALID_DOCUMENT_TYPE) |
/newsletter_subscribers, /coupons, /customers_baskets, /reviews | tutti i filtri Classe di filtro |
/manufacturers, /suppliers, /customer_groups, /tax_classes, /shipping_profiles, /configuration, /newsdesks, /newsdesk_authors, /newsdeskcats, /ticket_attachments, /order_statuses | solo i parametri di ciascun nodo |
- Il singolare di un endpoint (
/ticket/{id}, /order/{id} …) viene verificato con le stesse regole del plurale. /categories/productlist dispone di filtri propri: ?categories_id= e ?include_inactive_products= funzionavano già in quel contesto, ma fino alla v2.122.9 segnalavano UNKNOWN_FILTER. Al contrario, ?parent_id= e ?recursive= ora segnalano UNKNOWN_FILTER (con ?_strict=true HTTP 400), poiché non hanno mai funzionato./categories?id= è inattivo dalla versione v2.23.0; un numero valido continua a essere ignorato. È possibile recuperare una singola categoria tramite /categories/{id}.
Il formato di percorso new:{datum} viene valutato solo da /customer(s) e /order(s), sia nell’esportazione JSON che in quella XML. Qualsiasi altro endpoint di esportazione risponde con un errore HTTP 400 INVALID_RANGE e il messaggio indica il filtro di data dell’endpoint, se presente.
GET /Export/JSON/products/new:2026-10-01
HTTP 400
{
"success": false,
"api_version": "2.122.10",
"error": {
"code": "INVALID_RANGE",
"message": "The new:{date} path form is not supported on /products. It is available on /customer, /customers, /order, /orders only. Filter by date with ?last_modified= instead."
}
}
# stattdessen
GET /Export/JSON/products?last_modified=2026-10-01
| Endpoint | Filtro data al posto di new: |
|---|
/products, /newsletter_subscribers, /tickets, /projects, /project_tasks, /appointments, /coupons | ?last_modified= |
/medias, /customers_baskets, /reviews | ?since= |
/contracts, /wallet_logs | ?date_from= |
Modificato nella v2.122.10: fino alla v2.122.9, l’API accettava new: su ogni endpoint. A seconda dell’endpoint, si verificava un errore del server (HTTP 500, ad esempio su prodotti, produttori, ricerca singola per categoria, notizie, FAQ, pagine CMS, slider e buoni sconto), una selezione in base all’ID anziché alla data (/tickets/new:2026-10-01 forniva i biglietti da 0 a 2026) oppure, con codice di stato HTTP 200, l’elenco completo (tra cui iscritti alla newsletter, progetti, appuntamenti, media). Chi utilizzava new: su un altro endpoint ed elaborava la risposta, ora riceve un codice HTTP 400 al posto dell’elenco errato. Rimangono invariati: new:{datum} per clienti e ordini, ID, aree {a}:{b} e la forma aperta {a}:.
Nell’esportazione JSON, il segmento successivo all’endpoint (/Export/JSON/{endpunkt}/{segment}) è un ID, un’area, il formato della data o una sottorota. Ciò vale per ogni endpoint di esportazione, compresi ticket, appuntamenti e contratti.
| Segmento | Significato |
|---|
{id}: numero intero con un massimo di 18 cifre | Richiesta singola o inizio intervallo, a seconda dell’endpoint come in precedenza |
{a}:{b}, {a}:: entrambi i limiti sono numeri interi | Intervallo o intervallo aperto |
new:{datum} | solo per clienti e ordini (vedi «Nuova forma del percorso:{datum}») |
productlist su /categories, scritto esattamente così | Sottoroute /categories/productlist |
| tutto il resto | HTTP 400 INVALID_RANGE; il messaggio indica il segmento |
GET /Export/JSON/product/42x
HTTP 400
{
"success": false,
"api_version": "2.122.12",
"error": {
"code": "INVALID_RANGE",
"message": "Malformed path segment \"42x\": not an id. Valid: {id}, {int}:{int}, {int}: or new:{date}."
}
}
- Lo spazio vuoto ai margini di un ID o al confine di un intervallo non conta (spazio
%20, tabulazione %09, interruzione di riga %0A/%0D, %00, %0B): /product/42%20 è l’articolo 42, così come ?customers_id=42%20 indica il cliente 42. Un segmento composto esclusivamente da spazio vuoto genera un errore HTTP 400. Un + nel percorso non è uno spazio. - Dopo un ID o un intervallo può seguire al massimo la sottoruta:
/categories/{id}/productlist. Qualsiasi altro segmento o segmento aggiuntivo genera un errore HTTP 400. A partire dalla versione v2.122.13, l’ID o l’intervallo che precede funge da filtro di categoria: /categories/5/productlist restituisce la categoria 5, /categories/5:10/productlist le categorie da 5 a 10, /categories/5:/productlist le categorie a partire dalla 5 (riquadro «Modificato nella v2.122.13» in basso, dettagli alla voce Categories). - Invariato: esportazione in formato XML, CSV e TXT (in questo caso un segmento senza numero corrisponde al nome di un modello, ad esempio
/Export/XML/order/{id}/opentrans), importazione ed eliminazione. Anche in questi casi, inviate gli ID come numeri interi senza caratteri residui.
Modificato nella v2.122.12: fino alla v2.122.11, un segmento che non fosse un numero e non contenesse i due punti veniva ignorato silenziosamente, e la risposta era l’elenco sfogliato con codice HTTP 200. Forme come 1e3, 4.2 o +5 venivano considerate rispettivamente come ID 1000, 4 e 5.
| Richiesta | fino alla v2.122.11 | dalla v2.122.12 |
|---|
/product/42%20, /order/42%20, /customer/%0942 | HTTP 200, l'elenco | Record 42 (articolo senza risultati: HTTP 404) |
/customers/100%20:200, /products/42%20: | HTTP 400 INVALID_RANGE | Intervallo da 100 a 200 o a partire da 42 |
/product/42x, /order/42%2B, /product/%20, /product//42 | HTTP 200, l'elenco | HTTP 400 INVALID_RANGE |
⚠️ /product/1e3, /customer/4.2, /order/+5 | Record 1000, 4 o 5 | HTTP 400 INVALID_RANGE |
⚠️ /product/42.0, /orders/100.0:200.0 (numero intero espresso in forma decimale) | Record 42 o intervallo da 100 a 200 | HTTP 400 INVALID_RANGE |
/products/1.5:3, /orders/1:1e3 | intervallo da 1 a 3 o da 1 a 1000 | HTTP 400 INVALID_RANGE |
/orders/ con 19 o più cifre | un limite oltre ogni ID; a partire da 309 cifre, l'elenco completo | HTTP 400 INVALID_RANGE |
/orders/5%3A10 (codificato con i due punti) | HTTP 200, l'elenco | HTTP 400 INVALID_RANGE |
⚠️ /orders/new%3A2026-10-01 (codificato in formato data, ad esempio con urlencode()) | HTTP 200, l'elenco completo anziché il delta | HTTP 400 INVALID_RANGE: inviare i due punti dopo new senza codificarli |
⚠️ /contracts/10/20 | Contratti a partire da 10 senza limite massimo | HTTP 400 INVALID_RANGE; l'intervallo è /contracts/10:20 |
/categories/5/Productlist, /product/42/x | Categoria 5 o Articolo 42, il segmento successivo è stato saltato | HTTP 400 INVALID_RANGE |
/products/productlist, /categories/Productlist | HTTP 200, l'elenco | HTTP 400 INVALID_RANGE |
/categories/5/productlist | sottoruta, la 5 viene saltata | invariato; dalla v2.122.13 solo categoria 5 |
- Chi invia un ID con caratteri residui e ha accettato l’elenco, ora riceve un HTTP 400. L’elenco non è mai stato la risposta prevista: correggere la codifica o il valore troncato nella connessione.
- ⚠️ Anche le connessioni che finora ricevevano il record di dati previsto ricevono ora un codice HTTP 400 (righe contrassegnate con ⚠️). Inviare l’ID come numero intero senza decimali e senza segno, come nei parametri di query a partire dalla v2.122.10; i valori provenienti dalle tabelle sono spesso del tipo
42.0. - La segnalazione avviene dopo la verifica dell’endpoint: un endpoint sconosciuto restituisce un codice HTTP 501.
Modificato nella v2.122.13: fino alla v2.122.12, /categories/{id}/productlist, /categories/{a}:{b}/productlist e /categories/{a}:/productlist ignoravano l’ID o l’area: con codice di stato HTTP 200 venivano restituiti gli elenchi dei prodotti di tutte le categorie. Ora restituiscono solo la categoria specificata o le categorie della sezione. ⚠️ ?categories_id= insieme all’ID o alla sezione nel percorso genera un errore HTTP 400 FILTER_NOT_APPLICABLE; è consentito solo lo stesso valore dell’ID del singolo percorso (/categories/5/productlist?categories_id=5). Ciò interrompe le chiamate che finora funzionavano: /categories/5/productlist?categories_id=7 e /categories/5:10/productlist?categories_id=5 fornivano fino alla v2.122.12 la categoria del parametro, ora restituiscono un errore HTTP 400. Inviate la categoria nel percorso o come parametro. Nei negozi con versione precedente alla 4.9.174 funziona solo il parametro (/categories/productlist?categories_id={id}), mentre la forma con il percorso restituisce tutte le categorie.
Per un indirizzo noto del negozio (Search Console, vecchia Sitemap, e-mail del cliente), tre filtri precisi restituiscono la categoria, l’articolo o la destinazione di un reindirizzamento. Fino alla versione v2.122.10 venivano riportati i nomi UNKNOWN_FILTER e l’elenco veniva fornito senza filtri.
| Filtri | Corrisponde | Valore |
|---|
GET /categories?seo_string= | Categorie presenti esattamente in questo percorso; ?language= effettua la ricerca solo in questa lingua, senza il parametro in tutti i | percorso senza host e senza lng/xx/, indipendentemente dalle barre esterne: angelruten/spinnruten |
GET /products?seo_name= | articoli con questo slug (seo_name; se vuoto, quello ricavato dal nome dell’articolo), tutte le lingue | ultimo segmento del percorso senza .html; elenco separato da virgole, massimo 100 valori |
GET /seohistorys?seo_string= | Reindirizzamenti da questo vecchio indirizzo; la destinazione è specificata in sh_item_type e sh_item_id | percorso senza host e senza lng/xx/, barre esterne e .html irrilevanti; così come appare nella barra degli indirizzi |
- Esatto: nessun prefisso e nessun modello,
% e _ sono caratteri dell’indirizzo. Non si fa distinzione tra maiuscole e minuscole. - Se ci sono più risultati, vengono visualizzati tutti, ad esempio due categorie con lo stesso indirizzo o lo stesso slug su due articoli. Se due categorie condividono un indirizzo, il negozio effettua la selezione senza un ordine prestabilito: il primo risultato non è necessariamente la pagina che viene visualizzata.
- I filtri non determinanose il negozio visualizzi o meno la pagina: lo stato, il blocco per gruppi di clienti o l’assegnazione al negozio rimangono, come in precedenza, nei campi del record.
/categories?seo_string= Funziona anche con ?parent_id=, ?status= e ?language=, /products?seo_name= con tutti i filtri di prodotto e ?fields=, /seohistorys?seo_string= con ?type= e ?base_id=.
Passo dopo passo dall’indirizzo all’ID, con esempi: SEO History.
Errore
| Dati inseriti | Risposta |
|---|
| valore vuoto | non impostato, come per ogni filtro |
solo barre (su /seohistorys anche solo .html) | HTTP 400 INVALID_FILTER_VALUE |
solo virgole ?seo_name= | HTTP 400 INVALID_FILTER_VALUE (“non ha alcun valore”) |
| Caratteri di controllo o UTF-8 non valido | HTTP 400 INVALID_FILTER_VALUE; il messaggio presenta caratteri illeggibili come U+FFFD |
carattere iniziale lng/xx/ | HTTP 400 INVALID_FILTER_VALUE, il messaggio contiene ?language=xx |
più di 255 caratteri ( /seohistorys, conteggiati così come inviati) | HTTP 400 INVALID_FILTER_VALUE |
Valore di elenco (?seo_string[]=…) | HTTP 400 INVALID_FILTER_VALUE |
a /categories/{id}, /products/{id} o un intervallo | HTTP 400 FILTER_NOT_APPLICABLE |
?seo_string= a DELETE /seohistory(s) | HTTP 400 INVALID_FILTER_VALUE (“does not apply to this endpoint”), nulla cancellato |
{
"success": false,
"api_version": "2.122.11",
"error": {
"code": "INVALID_FILTER_VALUE",
"message": "One or more filter values could not be used. No data was returned — see \"details\"."
},
"details": [
{ "param": "seo_string", "message": "Value \"lng/en/fishing-rods/\" starts with the language segment \"lng/en/\". Drop it and pass ?language=en instead." }
]
}
Solo con GET: il filtro di indirizzo seo_string funziona solo in lettura. Su DELETE /seohistory(s) è considerato un errore, invece di essere ignorato: DELETE /seohistory(s)?seo_string= restituisce HTTP 400, nulla viene eliminato. Fino alla v2.122.10 il nome veniva ignorato e venivano eliminati solo ?type=/?base_id=, quindi con ?type=p veniva eliminata ogni voce di prodotto. L’eliminazione avviene tramite sh_id dal GET.
| Richiesta | fino alla v2.122.10 | a partire dalla v2.122.11 |
|---|
/coupons?type=, (solo virgole e spazi, ad esempio un elenco vuoto) | Filtro non applicabile: l'elenco completo dei coupon, compresi i codici di credito | HTTP 400 INVALID_FILTER_VALUE (“holds no value”) |
nome parametro sconosciuto con UTF-8 non valido (?a%C3%28=1), su ogni endpoint di esportazione | HTTP 200 con corpo vuoto; con ?_strict=true HTTP 400 senza corpo | Avviso UNKNOWN_FILTER come per ogni nome sconosciuto, caratteri illeggibili come U+FFFD; con ?_strict=true HTTP 400 con corpo |
Rifiuto della verifica del valore (INVALID_FILTER_VALUE, INVALID_PAGINATION) a causa di UTF-8 non valido nel valore | HTTP 400 senza corpo | HTTP 400 con corpo, il valore con U+FFFD |
/ticket_attachment/{id}?file= rispettivamente DELETE /ticket_attachment/{id}?filename= con UTF-8 non valido | HTTP 404 senza corpo | HTTP 404 con corpo |
- Un valore composto esclusivamente da virgole è considerato un errore in ogni lista di filtri, mai come "non impostato". Un elemento vuoto tra i valori (
P,,F, P,) viene ignorato; se completamente vuoto (?type=) significa "non impostato". Fa eccezione la selezione del campo, che non è un filtro: ?fields=, non seleziona alcuna chiave e restituisce il record completo. - Viene sostituito solo il nome o il valore ripetuto nell’avviso e nel messaggio, mai un campo dati.
- Le richieste valide restituiscono una risposta invariata. Risposta vuota nonostante un codice di stato HTTP 200 su un negozio online meno recente: verificare innanzitutto che i nomi dei parametri della richiesta non contengano caratteri codificati in modo errato.
I filtri data che leggono input liberi come yesterday o 01.10.2026 finora interpretavano come “ora” solo un valore ricavato dai segni di punteggiatura. Il filtro veniva così impostato, ma non conteneva una data.
| Richiesta | fino alla v2.122.10 | a partire dalla v2.122.11 |
|---|
/tickets?date_to=,, così come date_from e /contracts, /projects, /appointments, /wallet_logs; due_from/due_to a /project_tasks; since a /medias | "finora" o "da ora in poi": HTTP 200 con una selezione che nessuno aveva richiesto | HTTP 400 INVALID_FILTER_VALUE («holds no value») |
/products?last_modified=. | solo gli articoli modificati da quel momento in poi, di solito nessuno | HTTP 400 |
/coupons?valid_on=, | i buoni validi oggi | HTTP 400 |
solo spazi vuoti (?date_from=+, %20, %0D …) in questi filtri | «da ora» o «fino ad ora» oppure da o fino al 01/01/1970 (?date_to=%0D: un elenco vuoto) | non sono state impostate, come ?date_from= |
data valida con interruzione di riga a margine (?date_to=2026-10-01%0D) | filtrata «fino al 01.01.1970» (un elenco vuoto) | filtrata in base alla data |
last_modified su /tickets, /projects, /project_tasks e /appointments solo da spazi vuoti | a seconda del database, errore HTTP 500 o elenco incompleto | non impostato |
- Per «vuoto» si intende qui: né lettere né cifre. Le forme libere rimangono valide e funzionano come prima (
yesterday, -1 day, 01.10.2026). - Un
+ nell'indirizzo è uno spazio; per inviare il segno più come carattere, utilizzare %2B. - Messaggio:
Value "," holds no value, only punctuation and white space (no letter or digit). Leave the parameter out (or empty) for no filter. - I filtri con orari fissi, ad esempio
last_modified a /customers e /orders, hanno sempre rifiutato tali valori.
La verifica dei valori valuta ogni valore di query senza spazi ai margini: spazi (nell'indirizzo anche +), tabulazione %09, interruzioni di riga %0A/%0D, %00 e %0B. A partire dalla v2.122.12, l'endpoint riceve esattamente questo valore verificato per le operazioni di esportazione, importazione ed eliminazione. Un valore vuoto o solo spazi vuoti indica «non impostato» per ogni parametro con regola fissa (numero, ID, pulsante, valore di selezione, data, ora, lingua, nome file, lettere e cifre), anche nei casi in cui l’endpoint finora verificava solo la presenza del parametro.
| Richiesta | fino alla v2.122.11 | dalla v2.122.12 |
|---|
?_strict=true%0A con filtro o campo sconosciuto | HTTP 200 con avviso | HTTP 400 come con ?_strict=true |
/tickets?type=%20job | ticket e lavori | solo lavori |
/categories?parent_id=5%00, così come status e recursive, nonché filtri numerici e di selezione su contratti, ticket, progetti, attività, scadenze e registrazioni di credito | Filtro omesso | Filtro applicabile |
/products?bundles=%201, così come marketplaces e bonus_free_features; /porters?with_columns=1%20 | Blocco mancante | Blocco presente |
/products_options_values?orphaned=%20true | tutti i valori | solo quelli orfani |
/porters?status=%20, /products_options?listing_status=%20 | filtrati a 0, quindi per i Porter quelli inattivi | non impostati |
%00 prima del numero: /porters?status=%001, /products_options?listing_status=%001, /products_options_values?option_id=%005 | interpretati come 0: i porter inattivi, stato 0 o caratteristica 0 | il valore inviato, nel caso dei porter i valori attivi |
/products_options_values?option_id=%20 | i valori della caratteristica 0, ovvero una lista vuota; con orphaned=true HTTP 400 | non impostato: tutti i valori o quelli orfani |
/faqs?language=, così come /faqcats, /cms e /sliders (anche %20); /categories?language=%20 | un elenco vuoto | tutte le lingue, come senza language |
/categories/productlist?language=%20 | un elenco vuoto | la lingua come senza language (a partire dalla v2.122.13 quella con il valore più basso di languages_id) |
/medias?entity_type= oppure %20 | un elenco vuoto con una nota | le immagini del prodotto, come senza entity_type |
/appointments?ticket_id=5&target_type=%20&target_id=7 | filtro dei ticket non applicato | si applica il filtro dei ticket |
/products_options?with_values= ovvero %20 | HTTP 400 | non impostato |
GET /seohistorys?type=%20p | Voci di tutti i tipi | solo tipo p |
/wallet_logs?source=%20 v2.122.13 | fino alla v2.122.12: filtrato in base a una fonte vuota, solitamente un elenco vuoto | a partire dalla v2.122.13: non impostato, tutte le fonti |
- Rimangono invariati il testo libero (termini di ricerca, nomi, codici come
name o rubric), i filtri con verifica autonoma del valore (i filtri per prodotto, cliente e buono sconto; per gli ordini, la data e il paese di consegna; in questi casi il valore verificato era già valido), nonché lo scorrimento e l’ordinamento (limit, offset, page, sort, order). Il testo libero viene troncato dall’endpoint stesso prima di verificare se è presente un valore: anche in questo caso, solo spazi vuoti significano «non impostato», su /wallet_logs?source= a partire dalla v2.122.13 (ultima riga della tabella). Da allora, anche ?source=0 applica un filtro su una fonte «0» che non esiste: una lista vuota. Fino alla v2.122.12, 0 veniva silenziosamente ignorato (tutte le fonti). Nei negozi precedenti alla versione 4.9.174, omettete il parametro se non volete applicare alcun filtro. - I valori non vuoti senza spazi ai margini rispondono come prima; eccezione a partire dalla v2.122.13:
/wallet_logs?source=0 (vedi sopra). - Importa (
_strict) ed Elimina (ciò che ora viene eliminato): si vedano l’API di importazione e l’API di eliminazione. - I negozi precedenti alla versione 4.9.173 continuano a leggere il valore non troncato: in tal caso, inviare valori senza spazi ai margini e omettere i parametri vuoti (
/faqs?language= fornisce in questo caso un elenco vuoto).