Categorie Endpoint

Endpoint

Categorie

Gestire le categorie di prodotti con supporto gerarchico.


Panoramica

OperazioneMetodoEndpointAmbito
EsportazioneGET/xpanel/xoport/export/json/categoriescategories:read
ImportazionePOST/xpanel/xoport/import/json/categoriescategories:write
AggiornamentoPUT/xpanel/xoport/import/json/categoriescategories:write
EliminaDELETE/xpanel/xoport/delete/json/categories/{id}categories:delete

Esporta (GET)

Parametri di query

ParametriTipoDescrizione
/categories/{id}PercorsoCategoria singola: la categoria stessa, come segmento del percorso, non come parametro di query (i suoi elementi secondari tramite parent_id). v2.122.12 Il segmento è un numero intero; un valore diverso (/categories/5x, /categories/5.0) genera un errore HTTP 400 INVALID_RANGE
parent_idintSolo sottocategorie di questo ID
seo_stringTestoNOVITÀ v2.122.11 Categoria sotto un indirizzo del negozio, percorso completo esatto
recursive0/1Solo con parent_id: 1 restituisce l'intero albero secondario anziché solo i figli diretti. Impostazione predefinita 0; senza parent_id non ha alcun effetto
statusintSolo categorie con questo stato: 1 attivo, 0 inattivo. Senza il parametro, tutte le
languageLinguaIn languages{} solo questa lingua, come codice (de) o ID. Senza il parametro, tutte le lingue. A partire dalla v2.122.10, una lingua non presente nel negozio genera un errore HTTP 400 INVALID_FILTER_VALUE
limitintNumero massimo per pagina (al massimo 250). Senza limit vengono visualizzate fino a 250 categorie senza scorrimento; se sono di più, le prime 50 e stats.has_more
offsetintposizione iniziale; funziona solo con limit o in caso di più di 250 risultati

v2.122.12 Lo spazio vuoto ai margini non conta; un valore vuoto significa «non impostato»: ?parent_id=5%00 restituisce i figli di 5 (fino alla v2.122.11 il filtro non era presente e veniva restituito l’intero albero), così come status e recursive; ?language=%20 restituisce tutte le lingue (finora un elenco vuoto).

NOVITÀ v2.122.11 Indirizzo del negozio → Categoria: ?seo_string= cerca esattamente l’intero percorso così come viene fornito dal negozio, senza host e senza il segmento di lingua lng/xx/ (in compenso ?language=xx, senza il parametro, in tutte le lingue); le barre esterne non hanno importanza. In caso di più risultati, vengono restituiti tutti; se due categorie condividono un indirizzo, il negozio effettua la selezione senza un ordine prestabilito e il primo risultato non è necessariamente la pagina che restituisce. Il filtro funziona anche con parent_id e status; su /categories/{id} restituisce un errore HTTP 400 FILTER_NOT_APPLICABLE. Fino alla versione v2.122.10, il nome veniva ignorato come UNKNOWN_FILTER e veniva restituita l’intera struttura.

# Kategorie zu https://shop.de/lng/en/fishing-rods/spinning-rods/
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  "https://shop.de/xpanel/xoport/export/json/categories?seo_string=fishing-rods/spinning-rods&language=en"

Regole e casi di errore: API di esportazione; passo dopo passo dall’indirizzo all’ID: SEO History.

Campi della risposta

  • categories_id - ID univoco
  • parent_id - Categoria padre (0 = radice)
  • status - Attivo (1) o inattivo (0)
  • sort_order - Ordine di ordinamento
  • restricted_customer_groups - ID dei gruppi di clienti che non vedono la categoria; [] se nessun gruppo è bloccato. Presente in ogni categoria (dalla v2.47.0). Se l'importazione blocca una categoria principale, blocca anche le sue sottocategorie attive per quel gruppo; queste appariranno quindi anch'esse qui
  • categories_image, header_category, header_nav_template, template, sitemap, shop_ids, hide_subcategory_tiles, hide_page_title, show_last_modified, redirect_type, redirect_url, subs_block, tree_block - Impostazioni della categoria, presenti nell’importazione con lo stesso nome
  • date_added, last_modified, tagcloud, lft, rgt, path - solo in lettura
  • languages{} - Per lingua: categories_name, categories_heading, categories_short_description, categories_description, title_tag, desc_tag, keywords_tag, seo_name, seo_text, oltre a categories_id, language_id e language_code; di sola lettura seo_string (indirizzo della categoria) e cpath

Le colonne della categoria vengono riportate così come sono gestite dal negozio; una colonna che non è ancora presente in un'installazione precedente non compare nella risposta.


Importazione (POST/PUT)

Richiesta di esempio

curl -X POST "https://shop.de/xpanel/xoport/import/json/categories" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "categories",
    "data": [{
      "parent_id": 0,
      "status": 1,
      "sort_order": 10,
      "languages": {
        "de": {
          "categories_name": "Neue Kategorie",
          "categories_heading": "Neue Kategorie Überschrift"
        }
      }
    }]
  }'

Elimina (DELETE)

curl -X DELETE "https://shop.de/xpanel/xoport/delete/json/categories/99" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Attenzione: viene eliminata solo una categoria vuota. Se contiene sottocategorie o prodotti, il negozio risponde con HTTP 409 (HAS_SUBCATEGORIES o HAS_PRODUCTS) e non elimina nulla. L’ID è presente nel percorso; senza di esso, ad esempio con ?categories_id=, viene restituito un errore HTTP 400 MISSING_ID.


Categorie Elenco prodotti NUOVO v2.12.0

Endpoint leggero per la mappatura categoria→prodotto. Ideale per strumenti di sincronizzazione che devono solo sapere quali prodotti si trovano in quali categorie.

EndpointDescrizioneEsempio
GET /categories/productlistTutte le categorie con prodottiMappatura completa
GET /categories/productlist?categories_id={id}Singola categoria?categories_id=73
GET /categories/productlist?status=1Solo categorie attiveSenza il parametro "tutte"
GET /categories/productlist?include_inactive_products=1Includi anche i prodotti inattiviImpostazione predefinita: solo attivi
GET /categories/productlist?language=deFiltro per linguaNome della categoria nella lingua; senza il parametro (a partire dalla v2.122.12 anche vuoto o solo spazio) nella lingua con l'languages_id più basso, solitamente 1 = inglese, indipendentemente dalla lingua predefinita del negozio. v2.122.13 Fino alla v2.122.12 era valida la prima riga della tabella delle lingue, non necessariamente l’ID più basso.
GET /categories/{id}/productlistProprio questa categoria v2.122.13/categories/73/productlist
GET /categories/{von}:{bis}/productlistCategorie nell’intervallo di ID v2.122.13/categories/70:80/productlist
GET /categories/{von}:/productlistCategorie a partire da questo ID v2.122.13/categories/70:/productlist
Modificato nella v2.122.12: il percorso secondario è esattamente productlist. /categories/Productlist, /categories/5/Productlist e ulteriori segmenti successivi generano un errore HTTP 400 INVALID_RANGE. Fino alla v2.122.11, /categories/5/Productlist forniva comunque la categoria 5 anziché l’elenco dei prodotti.
Modificato nella v2.122.13: l’ID o l’intervallo prima di productlist costituisce il filtro di categoria; ?status=, ?include_inactive_products= e ?language= continuano a funzionare. Fino alla v2.122.12, /categories/{id}/productlist, /categories/{von}:{bis}/productlist e /categories/{von}:/productlist ignoravano l’indicazione nel percorso e restituivano con codice HTTP 200 gli elenchi dei prodotti di tutte le categorie; in caso di singolo ID e di intervallo aperto, veniva visualizzato l’avviso RANGE_START_NOT_SINGLE_RECORD.
  • ⚠️ ?categories_id= insieme a un ID o a un intervallo nel percorso restituisce un codice HTTP 400 FILTER_NOT_APPLICABLE, poiché la categoria verrebbe menzionata due volte. È consentito solo lo stesso valore dell’ID del percorso singolo: /categories/5/productlist?categories_id=5 restituisce, come in precedenza, la categoria 5. Un ?categories_id= vuoto non viene considerato.
  • ⚠️ Incompatibilità rispetto alla v2.122.12: /categories/5/productlist?categories_id=7 e /categories/5:10/productlist?categories_id=5 fornivano finora la categoria del parametro, ora restituiscono un errore HTTP 400. Inviate la categoria nel percorso o come parametro; se li utilizzate entrambi, assicuratevi che abbiano lo stesso ID. Nei negozi precedenti alla versione 4.9.174 funziona solo il parametro.
  • Messaggio: Filter(s) categories_id apply to the /categories/productlist list only, not to /categories/{id}/productlist or an id range. Drop the id from the path to use them.

Formato della risposta

{
  "success": true,
  "api_version": "2.122.12",
  "type": "categories_productlist",
  "data": [
    {
      "categories_id": 73,
      "categories_name": "Drucker",
      "products_count": 3,
      "products": [
        { "id": 101, "model": "HP-LJ-4050" },
        { "id": 102, "model": "EP-WF-7840" },
        { "id": 103, "model": "BR-HL-L6400" }
      ]
    }
  ],
  "stats": {
    "total": 1,
    "count": 1,
    "timestamp": "2026-10-18 14:00:00"
  }
}

La navigazione avviene come nell’elenco delle categorie: senza limit, vengono visualizzate fino a 250 categorie; se ce ne sono di più, vengono visualizzate le prime 50 e stats.has_more; con limit e offset, come di consueto.

Suggerimento: l’endpoint Productlist è efficiente in termini di memoria — una singola query SQL senza caricamento delle relazioni. Perfetto per cataloghi di grandi dimensioni con oltre 10.000 prodotti. Ambito: categories:read.