API di esportazione: recuperare i dati del negozio tramite GET

GET · Esportazione · Lettura · v2.1.0

API 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

Percorsi URL RESTful (v2.1.0)

Indirizzamento intuitivo delle risorse:

/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.

Esportazione delle categorie

EndpointDescrizioneEsempio
GET /categoriesTutte le categorieAlbero 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=1Sottostruttura completaTutti i discendenti
GET /categories?status=1Solo attiviFiltro
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=deSolo tedescoFiltro per lingua
GET /categories/productlistLightweight: Mappatura categoria→prodotto NUOVO v2.12.0Per categoria: ID + modelli
GET /categories/productlist?categories_id={id}Prodotti di una categoria?categories_id=73
Media NUOVO v2.16.0GET /Export/JSON/mediasmedia:read

Altri endpoint di esportazione

EntitàTuttiSingoloAmbito
Prodotti Pagination SQL v2.12.0GET /productsGET /product/{id}products:read
ClientiGET /customersGET /customer/{id}customers:read
Carrelli NUOVO v2.122.10GET /customers_basketsGET /customers_basket/{customers_id}customers:read
ProduttoriGET /manufacturersGET /manufacturer/{id}manufacturers:read
OrdiniGET /ordersGET /order/{id}orders:read
Stato dell'ordine NUOVO v2.122.10GET /order_statusesGET /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=rgorders:read
NotizieGET /newsdesksGET /newsdesk/{id}news:read
Categorie delle notizieGET /newsdeskcatsGET /newsdeskcat/{id}newscategories:read
Domande frequentiGET /faqsGET /faq/{id}faq:read
Categorie delle FAQGET /faqcatsGET /faqcat/{id}faqcategories:read
Cronologia SEO
Cerca vecchio indirizzo: ?seo_string= (v2.122.11)
GET /seohistorysGET /seohistory/{id}seohistory:read
ContrattiGET /contractsGET /contract/{id}contracts:read
Abbonati alla newsletterGET /newsletter_subscribersGET /newsletter_subscriber/{id}newsletter:read
Campagne newsletterGET /newslettersGET /newsletter/{id}newsletters:read
Ticket CRUD v2.11.0
Con claim e edit_lock (v2.118.0)
GET /ticketsGET /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=nametickets:read
Slider NOVITÀ v2.22.0GET /slidersGET /slider/{id}slider:read
Progetti (xoCRM) NOVITÀ v2.35.0GET /projectsGET /project/{id}projects:read
Attività di progetto NOVITÀ v2.35.0GET /project_tasksGET /project_task/{id}project_tasks:read
Appuntamenti (xoCRM) NOVITÀ v2.44.0GET /appointmentsGET /appointment/{id}appointments:read
Caratteristiche e valori delle opzioni NOVITÀ v2.96.0GET /products_options
GET /products_options_values
GET /products_option/{id}products:read
Profili tempi di consegna NOVITÀ v2.94.0GET /shipping_profilesGET /shipping_profile/{id}products:read
Classi fiscali NOVITÀ v2.90.0GET /tax_classesGET /tax_class/{id}products:read
Filtri delle pagine delle categorie NOVITÀ v2.100.0GET /products_filtersGET /products_filter/{fid}products:read
Buoni e coupon NOVITÀ v2.102.0GET /couponsGET /coupon/{id}orders:read
Reparti dei biglietti NOVITÀ v2.103.0GET /ticket_departmentsGET /ticket_department/{id}tickets:read
Impostazioni NOVITÀ v2.108.0GET /configuration–configuration:read
Importatore CSV/XLS NOVITÀ v2.109.0GET /portersGET /porter/{id}porters:read
Recensioni NOVITÀ v2.122.6GET /reviewsGET /review/{id}products:read

Recensioni dei prodotti v2.122.6

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.

ParametriFunzionalitàEsempio
products_idRecensioni di uno o più articoli?products_id=104648,104650
status1 pubblicate (impostazione predefinita), 0 in attesa di pubblicazione, all entrambe?status=all
sincecreati 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.

Formato della risposta

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

Pagination v2.10.0

Tutti gli endpoint di esportazione utilizzano gli stessi parametri di query:

ParametriPredefinitoMaxDescrizione
limit50 o nessuno (vedi sotto)250Record per pagina. Un valore superiore viene limitato a 250, con l'aggiunta dell'avviso LIMIT_CAPPED
offset0—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:

Endpointsenza limitpage 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 percorsoscorrimento sempre attivo, 50 per pagina; stats contiene sempre limit, offset e has_more50 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 clientefino 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_more250 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 scorrimento
  • has_more — true, se dopo questa pagina seguono altri risultati; solo se si scorre la pagina
  • page — 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.

Filtro prodotti v2.65.0

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”.

ParametriEffettoEsempio
statusStato articolo?status=1
tax_class_idClasse fiscale?tax_class_id=0,1
categories_idL'articolo rientra in una delle seguenti categorie?categories_id=10039,10104
ean_prefixIl codice EAN inizia con …?ean_prefix=978,979,977
model_prefixIl numero articolo inizia con …?model_prefix=166-
products_model, products_eanil codice articolo o l’EAN, esattamente?products_model=KB
last_modifiedmodificato 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_nameIndirizzo 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_stateFiltro marketplace: canale (ID o codice) e almeno una condizione, tutte sullo stesso canale NOVITÀ v2.122.11?marketplace=idealo&marketplace_sync_state=pending
fieldsNessun 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.

Buoni e coupon v2.102.0

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.

ParametriEffettoEsempio
codeCodice del buono, esatto (non fa differenza maiuscolo/minuscolo)?code=SOMMER10
typeP Percentuale, S spedizione gratuita, F importo fisso, G/N credito; elenco separato da virgole?type=P,F
active1 attivo, 0 inattivo?active=1
kinddiscount oppure credit?kind=credit
valid_onsolo coupon validi in quel giorno?valid_on=2026-09-13
last_modifiedDelta: 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».

Valori non validi e valori di elenco v2.122.10

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.
Richiestafino alla v2.122.9dalla v2.122.10
/orders?status=abc, ?customer_id=7,8,9, ?status=3,4Filtro non applicabile: tutti gli ordini di tutti i clientiHTTP 400 INVALID_FILTER_VALUE
/orders?status=1.5, ?products_id=1e3interpretato come 1 o 1000HTTP 400
/tickets?status=abc, /contracts?interval=5, /medias?since=quatschFiltro non applicabileHTTP 400
/tickets?date_from=quatsch (lo stesso vale per contratti, progetti, attività, appuntamenti, accrediti)dal 01/01/1970, ovvero tuttoHTTP 400
/products?status[]=1, /faqs?status[]=1, /cms?module[]=stripeil filtro non è necessario: l’intero catalogo, ovvero tutte le FAQ o le pagineHTTP 400
?language=xxper ogni endpoint un elenco vuoto, tutte le lingue o, in caso di omissione, la lingua predefinitaHTTP 400
?language[]=de per ogni endpointHTTP 500HTTP 400
/orders/{a}:{b}?sort=foo (qualsiasi forma di percorso)sort/order ancora ignoratoHTTP 400 INVALID_PAGINATION
DELETE /seohistorys?type=p&base_id[]=42 (così come base_id=abc, expired=yes)ha eliminato tutte le voci di tipo pHTTP 400, nulla cancellato
DELETE /ticket_department/{id}?reassign_to[]=5ha spostato i ticket nel reparto 1HTTP 400, nulla cancellato
POST/PUT /Import/JSON/…?_strict=1modalità rigorosa disattivata, l’importazione ha scritto solo in parteHTTP 400, nulla scritto

Regole

Regolavalidanon valida (esempi)
numero interoesattamente un numero: 5, -3, 007abc, 1.5, 1e3, +5, 7,8,9
IDnumero intero a partire da 10, -4
Interruttore0, 1true, yes, on, 2, 1abc
Datadati 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»)
Oraformati fissi: YYYY-MM-DD, YYYY-MM-DD HH:MM[:SS] (separatore: spazio, T o +), frazioni, fuso orarioyesterday, 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 inattivasconosciuto, 02, 2.0, 99
Quantitàesattamente uno dei valori indicatitutto il resto
Testoogni singolo valoresolo valori dell'elenco
Classe di filtroil 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 terminaleParametri e regola
ogni endpointlimit, offset, page Scorrimento · _strict true /false · language Lingua · numeric_check 0 /1/true/false/yes/no/on/off · format Testo (non viene valutato)
/ordersstatus, 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
/productsstatus, 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
/customerstutti i filtri Classe di filtro · sort, order
/categoriesparent_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/productlistcategories_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
/ticketsstatus, 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
/contractsstatus, customer_id, product_id numero intero · interval 1 , 2, 3, 4, 6, 12 · date_from, date_to data · active interruttore
/projectsstatus, customer_id, category_id, leader_admin_id numero intero · is_private, include_tasks selettore · date_from, date_to data · last_modified ora
/project_tasksproject_id, status, priority, admin_id, customer_id, category_id, progress_min, progress_max numero intero · due_from, due_to data · last_modified ora
/appointmentsdone, 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_logscustomer_id, order_id, coupon_id numero intero · source testo · date_from, date_to data · include_historic interruttore
/mediasentity_type product, , , , , , , (senza distinzione tra maiuscole e minuscole) · numero intero · data products_images category manufacturer static option product_video download entity_id since
/newslettersstatus, language_id numero intero
/portersstatus, with_columns interruttore · rubric testo
/ticket_departmentsactive interruttore
/products_filtersoptions_id numero intero (negativo = filtri integrati) · categories_id ID
/products_optionslisting_status numero intero · with_values interruttore · name, name_prefix testo · sort, order
/products_options_valuesoption_id numero intero · orphaned true /1/false/0 · name, name_prefix testo · sort, order
/seohistorystype c, , , , , · numero intero · classe di filtro (dalla v2.122.11) s m p n o base_id seo_string
/slidersstatus, type, categories_id, content_id numero intero
/faqs, /faqcatsstatus numero intero
/cmsstatus 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, /reviewstutti i filtri Classe di filtro
/manufacturers, /suppliers, /customer_groups, /tax_classes, /shipping_profiles, /configuration, /newsdesks, /newsdesk_authors, /newsdeskcats, /ticket_attachments, /order_statusessolo 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}.

Formato del percorso new:{datum} v2.122.10

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
EndpointFiltro 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}:.

Segmento di percorso: ID, area o sottoroute v2.122.12

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.

SegmentoSignificato
{id}: numero intero con un massimo di 18 cifreRichiesta singola o inizio intervallo, a seconda dell’endpoint come in precedenza
{a}:{b}, {a}:: entrambi i limiti sono numeri interiIntervallo 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 restoHTTP 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.
Richiestafino alla v2.122.11dalla v2.122.12
/product/42%20, /order/42%20, /customer/%0942HTTP 200, l'elencoRecord 42 (articolo senza risultati: HTTP 404)
/customers/100%20:200, /products/42%20:HTTP 400 INVALID_RANGEIntervallo da 100 a 200 o a partire da 42
/product/42x, /order/42%2B, /product/%20, /product//42HTTP 200, l'elencoHTTP 400 INVALID_RANGE
⚠️ /product/1e3, /customer/4.2, /order/+5Record 1000, 4 o 5HTTP 400 INVALID_RANGE
⚠️ /product/42.0, /orders/100.0:200.0 (numero intero espresso in forma decimale)Record 42 o intervallo da 100 a 200HTTP 400 INVALID_RANGE
/products/1.5:3, /orders/1:1e3intervallo da 1 a 3 o da 1 a 1000HTTP 400 INVALID_RANGE
/orders/ con 19 o più cifreun limite oltre ogni ID; a partire da 309 cifre, l'elenco completoHTTP 400 INVALID_RANGE
/orders/5%3A10 (codificato con i due punti)HTTP 200, l'elencoHTTP 400 INVALID_RANGE
⚠️ /orders/new%3A2026-10-01 (codificato in formato data, ad esempio con urlencode())HTTP 200, l'elenco completo anziché il deltaHTTP 400 INVALID_RANGE: inviare i due punti dopo new senza codificarli
⚠️ /contracts/10/20Contratti a partire da 10 senza limite massimoHTTP 400 INVALID_RANGE; l'intervallo è /contracts/10:20
/categories/5/Productlist, /product/42/xCategoria 5 o Articolo 42, il segmento successivo è stato saltatoHTTP 400 INVALID_RANGE
/products/productlist, /categories/ProductlistHTTP 200, l'elencoHTTP 400 INVALID_RANGE
/categories/5/productlistsottoruta, la 5 viene saltatainvariato; 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.

Indirizzo del negozio → ID v2.122.11

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.

FiltriCorrispondeValore
GET /categories?seo_string=Categorie presenti esattamente in questo percorso; ?language= effettua la ricerca solo in questa lingua, senza il parametro in tutti ipercorso 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 lingueultimo 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_idpercorso 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 inseritiRisposta
valore vuotonon 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 validoHTTP 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 intervalloHTTP 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.

Solo separatori, UTF-8 non valido v2.122.11

Richiestafino alla v2.122.10a 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 creditoHTTP 400 INVALID_FILTER_VALUE (“holds no value”)
nome parametro sconosciuto con UTF-8 non valido (?a%C3%28=1), su ogni endpoint di esportazioneHTTP 200 con corpo vuoto; con ?_strict=true HTTP 400 senza corpoAvviso 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 valoreHTTP 400 senza corpoHTTP 400 con corpo, il valore con U+FFFD
/ticket_attachment/{id}?file= rispettivamente DELETE /ticket_attachment/{id}?filename= con UTF-8 non validoHTTP 404 senza corpoHTTP 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.

Filtro data senza contenuto v2.122.11

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.

Richiestafino alla v2.122.10a 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 richiestoHTTP 400 INVALID_FILTER_VALUE («holds no value»)
/products?last_modified=.solo gli articoli modificati da quel momento in poi, di solito nessunoHTTP 400
/coupons?valid_on=,i buoni validi oggiHTTP 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 vuotia seconda del database, errore HTTP 500 o elenco incompletonon 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.

Spazio vuoto ai margini: il valore verificato è v2.122.12

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.

Richiestafino alla v2.122.11dalla v2.122.12
?_strict=true%0A con filtro o campo sconosciutoHTTP 200 con avvisoHTTP 400 come con ?_strict=true
/tickets?type=%20jobticket e lavorisolo 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 creditoFiltro omessoFiltro applicabile
/products?bundles=%201, così come marketplaces e bonus_free_features; /porters?with_columns=1%20Blocco mancanteBlocco presente
/products_options_values?orphaned=%20truetutti i valorisolo quelli orfani
/porters?status=%20, /products_options?listing_status=%20filtrati a 0, quindi per i Porter quelli inattivinon impostati
%00 prima del numero: /porters?status=%001, /products_options?listing_status=%001, /products_options_values?option_id=%005interpretati come 0: i porter inattivi, stato 0 o caratteristica 0il valore inviato, nel caso dei porter i valori attivi
/products_options_values?option_id=%20i valori della caratteristica 0, ovvero una lista vuota; con orphaned=true HTTP 400non impostato: tutti i valori o quelli orfani
/faqs?language=, così come /faqcats, /cms e /sliders (anche %20); /categories?language=%20un elenco vuototutte le lingue, come senza language
/categories/productlist?language=%20un elenco vuotola lingua come senza language (a partire dalla v2.122.13 quella con il valore più basso di languages_id)
/medias?entity_type= oppure %20un elenco vuoto con una notale immagini del prodotto, come senza entity_type
/appointments?ticket_id=5&target_type=%20&target_id=7filtro dei ticket non applicatosi applica il filtro dei ticket
/products_options?with_values= ovvero %20HTTP 400non impostato
GET /seohistorys?type=%20pVoci di tutti i tipisolo tipo p
/wallet_logs?source=%20 v2.122.13fino alla v2.122.12: filtrato in base a una fonte vuota, solitamente un elenco vuotoa 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).

Autenticazione API sicura

L'API xoPort utilizza un approccio alla sicurezza a più livelli che supporta sia metodi di autenticazione semplici che altamente sicuri. Dalla whitelist basata su IP per i server interni alle chiavi API con ambito limitato per le integrazioni di terze parti.

Best practice

  • Utilizzate una chiave API separata per ogni integrazione
  • Limitate gli ambiti al minimo necessario (principio del privilegio minimo)
  • Impostare date di scadenza per le integrazioni temporanee
  • Monitorate regolarmente i log di utilizzo
  • Effettuare la rotazione periodica delle chiavi API