Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.
La Admin API (/api/v1/admin/*) espone la gestione completa del negozio: catalogo,
prezzi, stock, ordini, clienti, contenuti, marketing, report, impostazioni. È pensata per
backend, integrazioni (ERP/PIM/fatturazione) e automazioni — inclusi gli
agenti AI via MCP.
Autenticazione e permessi
Ogni chiamata porta un Bearer token:
Authorization: Bearer <token>
Il token può essere:
di un utente staff: si ottiene con POST /auth/login e si rinnova con il refresh a
rotazione (vedi Autenticazione). Per gli account staff un refresh token
superato e riusato chiude la sessione: non condividerlo fra processi.
un token API: la credenziale consigliata per integrazioni e agenti che lavorano a lungo.
Si usa come Bearer, senza login né refresh, ha un ruolo scelto e una scadenza obbligatoria
(da 1 a 365 giorni) e si revoca all’istante. Lo genera un amministratore, se la funzione è
abilitata per il negozio (GET /admin/api-tokens/status; altrimenti 403
tenant_keys.admin_api_disabled).
curl -X POST "$BASE/api/v1/admin/api-tokens" -H "Authorization: Bearer $STAFF" \ -H "Content-Type: application/json" \ -d '{"label":"Sync ERP","role":"catalog_manager","expires_in_days":90}'# data.token è mostrato una sola volta: conservalo come un segreto.# Revoca: POST /admin/api-tokens/{id}/revoke
I permessi sono granulari: catalog, sales, customers, marketing, content,
reviews, reports, tax, shipping, system, users. Il ruolo dell’utente o del token
decide quali ha (admin, manager, catalog_manager, sales_manager, marketing_manager,
content_editor, customer_service, accountant): la matrice completa è in
GET /admin/roles. Senza il permesso dell’area la risposta è 403
auth.permission_required. Ogni chiamata è vincolata al suo negozio (claim tenant_id).
La Admin API è server-side. Non incorporare mai un token staff o un token API in un client
pubblico.
Regole che contano per chi integra
Dal rilascio del 10 ottobre 2026 l’API applica le regole qui sotto. Campi, corpi e risposte
completi sono nella API Reference.
Soldi: chi può fare cosa
Oltre al permesso dell’area, alcune azioni guardano il ruolo:
Azione
Chi
Rifiuto
Rimborso: POST /admin/orders/{id}/refunds, stato refunded su un ordine incassato, stato cancelled su un ordine incassato che trattiene un buono regalo
admin, manager, sales_manager
403 order.refund_forbidden
Pagamento registrato a mano («segna pagato»): PATCH /admin/orders/{id}/payment
gli stessi più accountant
403 order.payment_forbidden
Gruppo prezzi di un cliente e scritture dei gruppi clienti
customersecatalog
403 auth.permission_required
Denaro degli affiliati: commissione, beneficiario e dati di pagamento (payment_method, paypal_email, bank_name, bank_account), riattivazione; approvare, pagare o rifiutare una commissione
customersereports
403 auth.permission_required
Titolare, utenti staff e token API
Ogni negozio ha un titolare: un amministratore attivo, registrato e stabile, che non
cambia se si promuove un altro account. GET /auth/me e la lista utenti lo indicano con
is_owner: true. Lo cambia solo l’assistenza Vellaro.
Il titolare è protetto: password, ruolo, disattivazione, eliminazione e reset della 2FA del
suo account rispondono 403 user.owner_protected. Sugli altri amministratori le stesse
azioni le fa solo il titolare (403 user.owner_only). Un’azione che lascerebbe il negozio
senza amministratori attivi dà 409 user.last_admin.
Un token API non gestisce utenti né credenziali: creare, modificare o eliminare utenti
staff, resettarne la 2FA, generare o revocare token API e chiavi publishable risponde 403
auth.api_token_forbidden. Le letture restano permesse.
Ordini, rimborsi e resi
PATCH /admin/orders/{id} con "status": "refunded" su un ordine paid o
partially_refunded esegue un rimborso vero del residuo sul gateway di pagamento: muove
denaro, come POST /admin/orders/{id}/refunds. Se il gateway fallisce la risposta è 502
order.refund_gateway_error e l’ordine resta com’era. Su un ordine non incassato la risposta è
409 order.refund_not_collected: lo stato giusto è cancelled.
Le transizioni di stato sono validate: una non ammessa dà 409 order.invalid_transition.
comment è una nota interna per impostazione predefinita; con comment_public: true
la vede anche il cliente nella sua cronologia.
Un rimborso totale o l’annullo di un ordine pagato restituiscono anche la parte pagata con
un buono regalo. Lo stock rientra una volta sola.
I resi partono da una riga dell’ordine: GET /admin/returns/order-context/{order_id}
elenca le righe con le quantità restituibili, poi POST /admin/returns. Una variante fuori
dall’ordine o una quantità oltre il restituibile danno 422 return.item_not_in_order /
return.quantity_exceeds_order. Motivi e stati dei resi sono un catalogo comune in sola
lettura (403 return.lookup_global sulle scritture).
Rimborso esplicito, anche parziale (amount omesso = tutto il residuo):
POST /admin/products salva tutti i campi del prodotto e crea le varianti inline nella
stessa transazione. Lo SKU è unico nel negozio: un doppione (anche fra due varianti inline) dà
409 product.sku_taken e nulla viene scritto. Uno slug doppio dà 409 product.slug_taken;
lo slug di un prodotto eliminato si libera da solo.
Prezzi speciali e sconti a quantità (/admin/products/{id}/specials, /discounts):
il price deve essere maggiore di zero, altrimenti 422 product.price_rule_not_positive.
Uno speciale vale per tutti (customer_group_id: null) o per un gruppo clienti attivo, nella
sua finestra di date; fra più speciali vince la priority più bassa, poi il prezzo più basso.
Lo speciale può solo abbassare il prezzo, e carrello e checkout lo applicano.
Saldo sulla variante: sale_price, sale_start e sale_end vanno insieme (422
product.sale_window_invalid se la finestra non è valida); per toglierlo mandali tutti e tre
a null.
Coupon e buoni regalo
I coupon sono validati in creazione e modifica: 422 coupon.percentage_out_of_range,
coupon.negative_discount, coupon.dates_inverted; 409 coupon.code_taken. La lista ha il
filtro status (active, scheduled, expired, exhausted, inactive).
DELETE /admin/coupons/{id} elimina davvero un coupon mai usato (il codice torna libero)
e disattiva quello già usato: leggi deleted e deactivated nella risposta.
Buoni regalo (/admin/vouchers, permesso marketing): codice, importo e saldo. Il saldo
si spende al checkout (voucher_code), con amount_spent, redemption_count e lo storico in
GET /admin/vouchers/{id}/history. Anche qui DELETE elimina solo un buono mai speso e
altrimenti lo disattiva.
Abbonamenti e piani ricorrenti
Un piano (POST /admin/recurrings, permesso system) descrive la cadenza dei rinnovi:
Campo
Significato
frequency
unità: day, week, month, quarter, year
duration
intervallo: ogni quante unità si addebita (1 = ogni unità)
cycle
numero totale di addebiti (0 = senza fine). Senza prova conta anche l’acquisto, con la prova conta i rinnovi
price
prezzo di ogni rinnovo (maggiore di zero)
trial_status, trial_duration, trial_frequency
la prova sposta solo il primo rinnovo; con trial_status: true serve trial_duration ≥ 1 (422 recurring.trial_duration_required)
All’acquisto il cliente paga il prezzo del prodotto; il primo rinnovo a 9,90 arriva dopo 14
giorni, poi ogni mese, per 12 rinnovi. trial_price è accettato ma non applicato.Un abbonamento con tutte le rate addebitate passa a completed, stato terminale (409
subscription.already_completed su cancel). Un piano che ha avuto abbonamenti non si
elimina (409 recurring.has_subscriptions): disattivalo con {"is_active": false}. Se il
piano del negozio non include gli abbonamenti, la creazione risponde 403 plan.required.
Clienti e affiliati
Anonimizzazione (diritto all’oblio), irreversibile: i dati personali spariscono, gli
ordini restano per gli obblighi fiscali. Il corpo ripete l’email attuale del cliente come
conferma.
Email di conferma sbagliata: 422 customer.anonymize_confirmation; cliente già
anonimizzato: 409 customer.anonymized.
Disattivare un cliente (PATCH /admin/customers/{id} con is_active: false) chiude subito
tutte le sue sessioni.
Commissioni degli affiliati (/admin/affiliate-commissions): si leggono con
customers; approvare, segnare pagata o rifiutare richiede anche reports. Il riepilogo
(/summary) ha una riga per affiliato e valuta: le valute non si sommano mai.
Report
Un ordine conta come ricavo se è incassato (paid o partially_refunded, non
refunded); l’importo è il netto, totale meno rimborsato.
I numeri principali sono nella valuta base del negozio (campo currency); gli incassi in
altre valute stanno a parte in other_currencies.
«Oggi», giorni e mesi seguono il fuso del negozio, restituito in timezone.
Impostazioni del negozio
PUT /admin/settings (permesso system) salva le chiavi di un gruppo. Un valore fuori regola
blocca tutto il salvataggio con 422 settings.invalid_value (data.key dice quale).
Gruppo e chiave
Effetto
orders.guest_checkout_allowed
"false" = solo clienti registrati (il checkout ospite dà 401 checkout.login_required); se manca vale "true". La chiave vecchia orders.checkout_guest_enabled non è più letta
orders.min_order_total
ordine minimo sul subtotale (422 checkout.min_order_not_met sotto la soglia)
# lista prodotti (include gli inattivi, per la gestione)curl "$BASE/api/v1/admin/products?page=1&page_size=24" -H "Authorization: Bearer $STAFF"# ordini + cambio stato (con transizioni validate)curl "$BASE/api/v1/admin/orders?status=pending" -H "Authorization: Bearer $STAFF"curl -X PATCH "$BASE/api/v1/admin/orders/<id>" -H "Authorization: Bearer $STAFF" \ -H "Content-Type: application/json" -d '{ "status":"processing" }'
Buone pratiche
Errori: fai switch su error_code. Un 403 plan.required significa che la funzione non
è inclusa nel piano del negozio: non ritentare.
Idempotenza & bulk: per aggiornamenti massivi (prezzi, stock), procedi a batch e
gestisci i 409/422 per riga.
Audit: ogni mutazione admin è registrata nell’audit log del negozio.
Soft-delete: eliminare un prodotto imposta deleted_at (non distrugge lo storico ordini);
disattivare è cosa diversa (is_active).
Webhook: per reagire agli eventi senza polling usa i webhook.
Versioning: l’API è su /api/v1 — cambi retrocompatibili; le rotture andranno su una
nuova versione.
Il riferimento completo delle centinaia di endpoint admin è nella
API Reference (gruppo Admin API), generata dallo schema OpenAPI live.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Vellaro","description":"Il motore e-commerce API-first. Costruisci il tuo storefront, la tua app mobile e le tue automazioni AI su Vellaro.","colors":{"primary":"#0b576a","light":"#f7b05f","dark":"#0b576a"},"logo":{"light":"https://mintcdn.com/vellaro/CDVwR-ZaR80yGHu7/logo/vellaro.svg?fit=max\u0026auto=format\u0026n=CDVwR-ZaR80yGHu7\u0026q=85\u0026s=a7c5ae3c45fc8d042cf947f11fc432e2","dark":"https://mintcdn.com/vellaro/CDVwR-ZaR80yGHu7/logo/vellaro.svg?fit=max\u0026auto=format\u0026n=CDVwR-ZaR80yGHu7\u0026q=85\u0026s=a7c5ae3c45fc8d042cf947f11fc432e2"},"favicon":"https://mintcdn.com/vellaro/CDVwR-ZaR80yGHu7/favicon.svg?fit=max\u0026auto=format\u0026n=CDVwR-ZaR80yGHu7\u0026q=85\u0026s=c36c02eac46650cc84584048f28dfd32","navbar":{"links":[{"href":"https://demo.vellaro.io","label":"Storefront demo"}],"primary":{"type":"button","label":"Ottieni una chiave","href":"https://vellaro.io"}},"footer":{"socials":{"website":"https://vellaro.io"}},"styling":{"latex":false},"navigation":{"languages":[{"language":"it","default":true,"href":"introduction"},{"language":"en","href":"en/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"vellaro","hasAudioNarration":false,"actualSubdomain":"vellaro","customDomains":["docs.vellaro.io"],"gitSource":{"type":"github","owner":"edhima","repo":"vallero.io","deployBranch":"feat/i18n-backend-admin-sweep","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aed71c2985c6afa94171d67","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"API Reference","count":581},{"language":"default","tag":"Admin API","count":475},{"language":"default","tag":"Storefront API","count":106},{"language":"default","tag":"Integrations \u0026 modules","count":88},{"language":"default","tag":"Content","count":65},{"language":"default","tag":"Orders","count":48},{"language":"default","tag":"Categories \u0026 catalog setup","count":44},{"language":"default","tag":"Products","count":36},{"language":"default","tag":"Imports","count":29},{"language":"default","tag":"Taxes \u0026 geo","count":28},{"language":"it","tag":"Documentazione","count":10},{"language":"en","tag":"Documentation","count":10},{"language":"it","tag":"Inizia","count":5},{"language":"en","tag":"Get started","count":5},{"language":"it","tag":"Guide","count":4},{"language":"en","tag":"Guides","count":4},{"language":"it","tag":"AI \u0026 MCP","count":1},{"language":"it","tag":"API Reference","count":1},{"language":"it","tag":"Model Context Protocol","count":1},{"language":"en","tag":"AI \u0026 MCP","count":1},{"language":"en","tag":"API Reference","count":1},{"language":"en","tag":"Model Context Protocol","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/admin-api","slug":"/guides/admin-api","pageMetadata":{"title":"Gestisci il negozio via API","description":"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.","href":"/guides/admin-api"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`La `,_jsx(_components.strong,{children:`Admin API`}),` (`,_jsx(_components.code,{children:`/api/v1/admin/*`}),`) espone la gestione completa del negozio: catalogo,\nprezzi, stock, ordini, clienti, contenuti, marketing, report, impostazioni. È pensata per\nbackend, integrazioni (ERP/PIM/fatturazione) e automazioni — inclusi gli\n`,_jsx(_components.a,{href:`/ai-mcp`,children:`agenti AI via MCP`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`autenticazione-e-permessi`,children:`Autenticazione e permessi`}),`\n`,_jsx(_components.p,{children:`Ogni chiamata porta un Bearer token:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Authorization: Bearer \u003ctoken>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Il token può essere:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`di un utente staff`}),`: si ottiene con `,_jsx(_components.code,{children:`POST /auth/login`}),` e si rinnova con il refresh a\nrotazione (vedi `,_jsx(_components.a,{href:`/authentication`,children:`Autenticazione`}),`). Per gli account staff un refresh token\nsuperato e riusato chiude la sessione: non condividerlo fra processi.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`un token API`}),`: la credenziale consigliata per integrazioni e agenti che lavorano a lungo.\nSi usa come Bearer, senza login né refresh, ha un ruolo scelto e una scadenza obbligatoria\n(da 1 a 365 giorni) e si revoca all’istante. Lo genera un amministratore, se la funzione è\nabilitata per il negozio (`,_jsx(_components.code,{children:`GET /admin/api-tokens/status`}),`; altrimenti 403\n`,_jsx(_components.code,{children:`tenant_keys.admin_api_disabled`}),`).`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/api-tokens\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"label\":\"Sync ERP\",\"role\":\"catalog_manager\",\"expires_in_days\":90}'`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# data.token è mostrato una sola volta: conservalo come un segreto.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Revoca: POST /admin/api-tokens/{id}/revoke`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`I permessi sono granulari: `,_jsx(_components.code,{children:`catalog`}),`, `,_jsx(_components.code,{children:`sales`}),`, `,_jsx(_components.code,{children:`customers`}),`, `,_jsx(_components.code,{children:`marketing`}),`, `,_jsx(_components.code,{children:`content`}),`,\n`,_jsx(_components.code,{children:`reviews`}),`, `,_jsx(_components.code,{children:`reports`}),`, `,_jsx(_components.code,{children:`tax`}),`, `,_jsx(_components.code,{children:`shipping`}),`, `,_jsx(_components.code,{children:`system`}),`, `,_jsx(_components.code,{children:`users`}),`. Il ruolo dell’utente o del token\ndecide quali ha (`,_jsx(_components.code,{children:`admin`}),`, `,_jsx(_components.code,{children:`manager`}),`, `,_jsx(_components.code,{children:`catalog_manager`}),`, `,_jsx(_components.code,{children:`sales_manager`}),`, `,_jsx(_components.code,{children:`marketing_manager`}),`,\n`,_jsx(_components.code,{children:`content_editor`}),`, `,_jsx(_components.code,{children:`customer_service`}),`, `,_jsx(_components.code,{children:`accountant`}),`): la matrice completa è in\n`,_jsx(_components.code,{children:`GET /admin/roles`}),`. Senza il permesso dell’area la risposta è 403\n`,_jsx(_components.code,{children:`auth.permission_required`}),`. Ogni chiamata è vincolata al `,_jsx(_components.strong,{children:`suo negozio`}),` (claim `,_jsx(_components.code,{children:`tenant_id`}),`).`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`La Admin API è `,_jsx(_components.strong,{children:`server-side`}),`. Non incorporare mai un token staff o un token API in un client\npubblico.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`regole-che-contano-per-chi-integra`,children:`Regole che contano per chi integra`}),`\n`,_jsxs(_components.p,{children:[`Dal rilascio del 10 ottobre 2026 l’API applica le regole qui sotto. Campi, corpi e risposte\ncompleti sono nella `,_jsx(_components.a,{href:`/api-reference`,children:`API Reference`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`soldi-chi-può-fare-cosa`,children:`Soldi: chi può fare cosa`}),`\n`,_jsx(_components.p,{children:`Oltre al permesso dell’area, alcune azioni guardano il ruolo:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Azione`}),_jsx(_components.th,{children:`Chi`}),_jsx(_components.th,{children:`Rifiuto`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Rimborso: `,_jsx(_components.code,{children:`POST /admin/orders/{id}/refunds`}),`, stato `,_jsx(_components.code,{children:`refunded`}),` su un ordine incassato, stato `,_jsx(_components.code,{children:`cancelled`}),` su un ordine incassato che trattiene un buono regalo`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`admin`}),`, `,_jsx(_components.code,{children:`manager`}),`, `,_jsx(_components.code,{children:`sales_manager`})]}),_jsxs(_components.td,{children:[`403 `,_jsx(_components.code,{children:`order.refund_forbidden`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Pagamento registrato a mano («segna pagato»): `,_jsx(_components.code,{children:`PATCH /admin/orders/{id}/payment`})]}),_jsxs(_components.td,{children:[`gli stessi più `,_jsx(_components.code,{children:`accountant`})]}),_jsxs(_components.td,{children:[`403 `,_jsx(_components.code,{children:`order.payment_forbidden`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Gruppo prezzi di un cliente e scritture dei gruppi clienti`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`customers`}),` `,_jsx(_components.strong,{children:`e`}),` `,_jsx(_components.code,{children:`catalog`})]}),_jsxs(_components.td,{children:[`403 `,_jsx(_components.code,{children:`auth.permission_required`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Denaro degli affiliati: commissione, beneficiario e dati di pagamento (`,_jsx(_components.code,{children:`payment_method`}),`, `,_jsx(_components.code,{children:`paypal_email`}),`, `,_jsx(_components.code,{children:`bank_name`}),`, `,_jsx(_components.code,{children:`bank_account`}),`), riattivazione; approvare, pagare o rifiutare una commissione`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`customers`}),` `,_jsx(_components.strong,{children:`e`}),` `,_jsx(_components.code,{children:`reports`})]}),_jsxs(_components.td,{children:[`403 `,_jsx(_components.code,{children:`auth.permission_required`})]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`titolare-utenti-staff-e-token-api`,children:`Titolare, utenti staff e token API`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Ogni negozio ha `,_jsx(_components.strong,{children:`un titolare`}),`: un amministratore attivo, registrato e stabile, che non\ncambia se si promuove un altro account. `,_jsx(_components.code,{children:`GET /auth/me`}),` e la lista utenti lo indicano con\n`,_jsx(_components.code,{children:`is_owner: true`}),`. Lo cambia solo l’assistenza Vellaro.`]}),`\n`,_jsxs(_components.li,{children:[`Il titolare è protetto: password, ruolo, disattivazione, eliminazione e reset della 2FA del\nsuo account rispondono 403 `,_jsx(_components.code,{children:`user.owner_protected`}),`. Sugli altri amministratori le stesse\nazioni le fa solo il titolare (403 `,_jsx(_components.code,{children:`user.owner_only`}),`). Un’azione che lascerebbe il negozio\nsenza amministratori attivi dà 409 `,_jsx(_components.code,{children:`user.last_admin`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Un `,_jsx(_components.strong,{children:`token API non gestisce utenti né credenziali`}),`: creare, modificare o eliminare utenti\nstaff, resettarne la 2FA, generare o revocare token API e chiavi publishable risponde 403\n`,_jsx(_components.code,{children:`auth.api_token_forbidden`}),`. Le letture restano permesse.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`ordini-rimborsi-e-resi`,children:`Ordini, rimborsi e resi`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`PATCH /admin/orders/{id}`}),` con `,_jsx(_components.code,{children:`\"status\": \"refunded\"`}),` su un ordine `,_jsx(_components.code,{children:`paid`}),` o\n`,_jsx(_components.code,{children:`partially_refunded`}),` esegue un `,_jsx(_components.strong,{children:`rimborso vero`}),` del residuo sul gateway di pagamento: muove\ndenaro, come `,_jsx(_components.code,{children:`POST /admin/orders/{id}/refunds`}),`. Se il gateway fallisce la risposta è 502\n`,_jsx(_components.code,{children:`order.refund_gateway_error`}),` e l’ordine resta com’era. Su un ordine non incassato la risposta è\n409 `,_jsx(_components.code,{children:`order.refund_not_collected`}),`: lo stato giusto è `,_jsx(_components.code,{children:`cancelled`}),`.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Le transizioni di stato sono validate: una non ammessa dà 409 `,_jsx(_components.code,{children:`order.invalid_transition`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`comment`}),` è una `,_jsx(_components.strong,{children:`nota interna`}),` per impostazione predefinita; con `,_jsx(_components.code,{children:`comment_public: true`}),`\nla vede anche il cliente nella sua cronologia.`]}),`\n`,_jsx(_components.li,{children:`Un rimborso totale o l’annullo di un ordine pagato restituiscono anche la parte pagata con\nun buono regalo. Lo stock rientra una volta sola.`}),`\n`,_jsxs(_components.li,{children:[`I `,_jsx(_components.strong,{children:`resi`}),` partono da una riga dell’ordine: `,_jsx(_components.code,{children:`GET /admin/returns/order-context/{order_id}`}),`\nelenca le righe con le quantità restituibili, poi `,_jsx(_components.code,{children:`POST /admin/returns`}),`. Una variante fuori\ndall’ordine o una quantità oltre il restituibile danno 422 `,_jsx(_components.code,{children:`return.item_not_in_order`}),` /\n`,_jsx(_components.code,{children:`return.quantity_exceeds_order`}),`. Motivi e stati dei resi sono un catalogo comune in sola\nlettura (403 `,_jsx(_components.code,{children:`return.lookup_global`}),` sulle scritture).`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Rimborso esplicito, anche parziale (`,_jsx(_components.code,{children:`amount`}),` omesso = tutto il residuo):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/orders/\u003cid>/refunds\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"amount\":\"20.00\",\"reason\":\"Articolo danneggiato\",\"restock\":true,\"notify_customer\":true}'`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# → { \"data\": { \"transaction\": {...}, \"payment_status\": \"partially_refunded\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# \"amount_refunded\": \"20.00\", \"restocked\": false } }`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`catalogo-e-prezzi`,children:`Catalogo e prezzi`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /admin/products`}),` salva `,_jsx(_components.strong,{children:`tutti`}),` i campi del prodotto e crea le varianti inline nella\nstessa transazione. Lo SKU è unico nel negozio: un doppione (anche fra due varianti inline) dà\n409 `,_jsx(_components.code,{children:`product.sku_taken`}),` e nulla viene scritto. Uno slug doppio dà 409 `,_jsx(_components.code,{children:`product.slug_taken`}),`;\nlo slug di un prodotto eliminato si libera da solo.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/products\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"name\": \"Divano Como 3 posti\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"slug\": \"divano-como-3-posti\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"category_id\": \"\u003cuuid categoria>\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"is_active\": true,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"variants\": [`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"sku\": \"COMO-3P-GRIGIO\", \"name\": \"Grigio\", \"price\": \"1299.00\", \"stock\": 5 },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"sku\": \"COMO-3P-BLU\", \"name\": \"Blu\", \"price\": \"1299.00\", \"stock\": 2 }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Prezzi speciali e sconti a quantità`}),` (`,_jsx(_components.code,{children:`/admin/products/{id}/specials`}),`, `,_jsx(_components.code,{children:`/discounts`}),`):\nil `,_jsx(_components.code,{children:`price`}),` deve essere maggiore di zero, altrimenti 422 `,_jsx(_components.code,{children:`product.price_rule_not_positive`}),`.\nUno speciale vale per tutti (`,_jsx(_components.code,{children:`customer_group_id: null`}),`) o per un gruppo clienti attivo, nella\nsua finestra di date; fra più speciali vince la `,_jsx(_components.code,{children:`priority`}),` più bassa, poi il prezzo più basso.\nLo speciale può solo `,_jsx(_components.strong,{children:`abbassare`}),` il prezzo, e carrello e checkout lo applicano.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Saldo sulla variante`}),`: `,_jsx(_components.code,{children:`sale_price`}),`, `,_jsx(_components.code,{children:`sale_start`}),` e `,_jsx(_components.code,{children:`sale_end`}),` vanno insieme (422\n`,_jsx(_components.code,{children:`product.sale_window_invalid`}),` se la finestra non è valida); per toglierlo mandali tutti e tre\na `,_jsx(_components.code,{children:`null`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`coupon-e-buoni-regalo`,children:`Coupon e buoni regalo`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`I coupon sono validati in creazione e modifica: 422 `,_jsx(_components.code,{children:`coupon.percentage_out_of_range`}),`,\n`,_jsx(_components.code,{children:`coupon.negative_discount`}),`, `,_jsx(_components.code,{children:`coupon.dates_inverted`}),`; 409 `,_jsx(_components.code,{children:`coupon.code_taken`}),`. La lista ha il\nfiltro `,_jsx(_components.code,{children:`status`}),` (`,_jsx(_components.code,{children:`active`}),`, `,_jsx(_components.code,{children:`scheduled`}),`, `,_jsx(_components.code,{children:`expired`}),`, `,_jsx(_components.code,{children:`exhausted`}),`, `,_jsx(_components.code,{children:`inactive`}),`).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`DELETE /admin/coupons/{id}`}),` elimina `,_jsx(_components.strong,{children:`davvero`}),` un coupon mai usato (il codice torna libero)\ne disattiva quello già usato: leggi `,_jsx(_components.code,{children:`deleted`}),` e `,_jsx(_components.code,{children:`deactivated`}),` nella risposta.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Buoni regalo`}),` (`,_jsx(_components.code,{children:`/admin/vouchers`}),`, permesso `,_jsx(_components.code,{children:`marketing`}),`): codice, importo e saldo. Il saldo\nsi spende al checkout (`,_jsx(_components.code,{children:`voucher_code`}),`), con `,_jsx(_components.code,{children:`amount_spent`}),`, `,_jsx(_components.code,{children:`redemption_count`}),` e lo storico in\n`,_jsx(_components.code,{children:`GET /admin/vouchers/{id}/history`}),`. Anche qui `,_jsx(_components.code,{children:`DELETE`}),` elimina solo un buono mai speso e\naltrimenti lo disattiva.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`abbonamenti-e-piani-ricorrenti`,children:`Abbonamenti e piani ricorrenti`}),`\n`,_jsxs(_components.p,{children:[`Un piano (`,_jsx(_components.code,{children:`POST /admin/recurrings`}),`, permesso `,_jsx(_components.code,{children:`system`}),`) descrive la cadenza dei rinnovi:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Campo`}),_jsx(_components.th,{children:`Significato`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`frequency`})}),_jsxs(_components.td,{children:[`unità: `,_jsx(_components.code,{children:`day`}),`, `,_jsx(_components.code,{children:`week`}),`, `,_jsx(_components.code,{children:`month`}),`, `,_jsx(_components.code,{children:`quarter`}),`, `,_jsx(_components.code,{children:`year`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`duration`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`intervallo`}),`: ogni quante unità si addebita (1 = ogni unità)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cycle`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`numero totale di addebiti`}),` (0 = senza fine). Senza prova conta anche l’acquisto, con la prova conta i rinnovi`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`price`})}),_jsxs(_components.td,{children:[`prezzo di ogni `,_jsx(_components.strong,{children:`rinnovo`}),` (maggiore di zero)`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`trial_status`}),`, `,_jsx(_components.code,{children:`trial_duration`}),`, `,_jsx(_components.code,{children:`trial_frequency`})]}),_jsxs(_components.td,{children:[`la prova sposta solo il `,_jsx(_components.strong,{children:`primo rinnovo`}),`; con `,_jsx(_components.code,{children:`trial_status: true`}),` serve `,_jsx(_components.code,{children:`trial_duration`}),` ≥ 1 (422 `,_jsx(_components.code,{children:`recurring.trial_duration_required`}),`)`]})]})]})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name_i18n\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"it\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Ricarica mensile\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"en\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Monthly top-up\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"price\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"9.90\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"frequency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"month\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"duration\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"cycle\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`12`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"trial_status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"trial_frequency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"day\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"trial_duration\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`14`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"is_active\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`All’acquisto il cliente paga il prezzo del prodotto; il primo rinnovo a 9,90 arriva dopo 14\ngiorni, poi ogni mese, per 12 rinnovi. `,_jsx(_components.code,{children:`trial_price`}),` è accettato ma non applicato.`]}),`\n`,_jsxs(_components.p,{children:[`Un abbonamento con tutte le rate addebitate passa a `,_jsx(_components.code,{children:`completed`}),`, stato terminale (409\n`,_jsx(_components.code,{children:`subscription.already_completed`}),` su `,_jsx(_components.code,{children:`cancel`}),`). Un piano che ha avuto abbonamenti non si\nelimina (409 `,_jsx(_components.code,{children:`recurring.has_subscriptions`}),`): disattivalo con `,_jsx(_components.code,{children:`{\"is_active\": false}`}),`. Se il\npiano del negozio non include gli abbonamenti, la creazione risponde 403 `,_jsx(_components.code,{children:`plan.required`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`clienti-e-affiliati`,children:`Clienti e affiliati`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Anonimizzazione`}),` (diritto all’oblio), irreversibile: i dati personali spariscono, gli\nordini restano per gli obblighi fiscali. Il corpo ripete l’email attuale del cliente come\nconferma.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/customers/\u003cid>/anonymize\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"confirm_email\":\"cliente@example.com\"}'`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Email di conferma sbagliata: 422 `,_jsx(_components.code,{children:`customer.anonymize_confirmation`}),`; cliente già\nanonimizzato: 409 `,_jsx(_components.code,{children:`customer.anonymized`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Disattivare un cliente (`,_jsx(_components.code,{children:`PATCH /admin/customers/{id}`}),` con `,_jsx(_components.code,{children:`is_active: false`}),`) chiude subito\ntutte le sue sessioni.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Commissioni degli affiliati`}),` (`,_jsx(_components.code,{children:`/admin/affiliate-commissions`}),`): si leggono con\n`,_jsx(_components.code,{children:`customers`}),`; approvare, segnare pagata o rifiutare richiede anche `,_jsx(_components.code,{children:`reports`}),`. Il riepilogo\n(`,_jsx(_components.code,{children:`/summary`}),`) ha una riga per affiliato e valuta: le valute non si sommano mai.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`report`,children:`Report`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Un ordine conta come `,_jsx(_components.strong,{children:`ricavo`}),` se è incassato (`,_jsx(_components.code,{children:`paid`}),` o `,_jsx(_components.code,{children:`partially_refunded`}),`, non\n`,_jsx(_components.code,{children:`refunded`}),`); l’importo è il `,_jsx(_components.strong,{children:`netto`}),`, totale meno rimborsato.`]}),`\n`,_jsxs(_components.li,{children:[`I numeri principali sono nella valuta base del negozio (campo `,_jsx(_components.code,{children:`currency`}),`); gli incassi in\naltre valute stanno a parte in `,_jsx(_components.code,{children:`other_currencies`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`«Oggi», giorni e mesi seguono il `,_jsx(_components.strong,{children:`fuso del negozio`}),`, restituito in `,_jsx(_components.code,{children:`timezone`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`impostazioni-del-negozio`,children:`Impostazioni del negozio`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`PUT /admin/settings`}),` (permesso `,_jsx(_components.code,{children:`system`}),`) salva le chiavi di un gruppo. Un valore fuori regola\nblocca tutto il salvataggio con 422 `,_jsx(_components.code,{children:`settings.invalid_value`}),` (`,_jsx(_components.code,{children:`data.key`}),` dice quale).`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Gruppo e chiave`}),_jsx(_components.th,{children:`Effetto`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orders.guest_checkout_allowed`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\"false\"`}),` = solo clienti registrati (il checkout ospite dà 401 `,_jsx(_components.code,{children:`checkout.login_required`}),`); se manca vale `,_jsx(_components.code,{children:`\"true\"`}),`. La chiave vecchia `,_jsx(_components.code,{children:`orders.checkout_guest_enabled`}),` non è più letta`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orders.min_order_total`})}),_jsxs(_components.td,{children:[`ordine minimo sul subtotale (422 `,_jsx(_components.code,{children:`checkout.min_order_not_met`}),` sotto la soglia)`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`payment.stripe_enabled`}),`, `,_jsx(_components.code,{children:`payment.paypal_enabled`}),`, `,_jsx(_components.code,{children:`payment.pokpay_enabled`}),`, `,_jsx(_components.code,{children:`payment.paysera_enabled`}),`, `,_jsx(_components.code,{children:`payment.bank_enabled`}),`, `,_jsx(_components.code,{children:`payment.cod_enabled`})]}),_jsxs(_components.td,{children:[`il checkout accetta solo i metodi accesi (422 `,_jsx(_components.code,{children:`checkout.payment_method_disabled`}),`); nessuno acceso = solo Stripe`]})]})]})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PUT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/settings\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"group\": \"orders\", \"store_id\": null,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"settings\": [`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"key\": \"guest_checkout_allowed\", \"value\": \"false\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"key\": \"min_order_total\", \"value\": \"20.00\" }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`esempi`,children:`Esempi`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# lista prodotti (include gli inattivi, per la gestione)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/products?page=1\u0026page_size=24\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# ordini + cambio stato (con transizioni validate)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/orders?status=pending\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PATCH`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$BASE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/admin/orders/\u003cid>\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$STAFF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{ \"status\":\"processing\" }'`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`buone-pratiche`,children:`Buone pratiche`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Errori`}),`: fai switch su `,_jsx(_components.code,{children:`error_code`}),`. Un 403 `,_jsx(_components.code,{children:`plan.required`}),` significa che la funzione non\nè inclusa nel piano del negozio: non ritentare.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Idempotenza \u0026 bulk`}),`: per aggiornamenti massivi (prezzi, stock), procedi a batch e\ngestisci i 409/422 per riga.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Audit`}),`: ogni mutazione admin è registrata nell’audit log del negozio.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Soft-delete`}),`: eliminare un prodotto imposta `,_jsx(_components.code,{children:`deleted_at`}),` (non distrugge lo storico ordini);\ndisattivare è cosa diversa (`,_jsx(_components.code,{children:`is_active`}),`).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Webhook`}),`: per reagire agli eventi senza polling usa i `,_jsx(_components.a,{href:`/webhooks`,children:`webhook`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Versioning`}),`: l’API è su `,_jsx(_components.code,{children:`/api/v1`}),` — cambi retrocompatibili; le rotture andranno su una\nnuova versione.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Il riferimento completo delle centinaia di endpoint admin è nella\n`,_jsx(_components.a,{href:`/api-reference`,children:`API Reference`}),` (gruppo `,_jsx(_components.strong,{children:`Admin API`}),`), generata dallo schema OpenAPI live.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Gestisci il negozio via API","description":"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.","href":"/guides/admin-api"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Autenticazione e permessi","slug":"autenticazione-e-permessi","depth":2,"children":[]},{"title":"Regole che contano per chi integra","slug":"regole-che-contano-per-chi-integra","depth":2,"children":[{"title":"Soldi: chi può fare cosa","slug":"soldi-chi-può-fare-cosa","depth":3,"children":[]},{"title":"Titolare, utenti staff e token API","slug":"titolare-utenti-staff-e-token-api","depth":3,"children":[]},{"title":"Ordini, rimborsi e resi","slug":"ordini-rimborsi-e-resi","depth":3,"children":[]},{"title":"Catalogo e prezzi","slug":"catalogo-e-prezzi","depth":3,"children":[]},{"title":"Coupon e buoni regalo","slug":"coupon-e-buoni-regalo","depth":3,"children":[]},{"title":"Abbonamenti e piani ricorrenti","slug":"abbonamenti-e-piani-ricorrenti","depth":3,"children":[]},{"title":"Clienti e affiliati","slug":"clienti-e-affiliati","depth":3,"children":[]},{"title":"Report","slug":"report","depth":3,"children":[]},{"title":"Impostazioni del negozio","slug":"impostazioni-del-negozio","depth":3,"children":[]}]},{"title":"Esempi","slug":"esempi","depth":2,"children":[]},{"title":"Buone pratiche","slug":"buone-pratiche","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"vellaro","siteName":"Vellaro","title":"Gestisci il negozio via API - Vellaro","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"it":{"href":"/guides/admin-api","matchLevel":0},"en":{"href":"/en/guides/admin-api","matchLevel":1}}},"lastModified":"2026-11-05T16:25:43.663Z","originalFileLocation":"guides/admin-api.mdx","locale":"it"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Vellaro\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Gestisci il negozio via API - Vellaro\">\u003cmeta data-mint-head property=\"og:description\" content=\"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vellaro\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.vellaro.io/guides/admin-api\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://vellaro.mintlify.site/_mintlify/api/og/v2?division=Guide\u0026amp;title=Gestisci+il+negozio+via+API\u0026amp;description=Catalogo%2C+ordini%2C+clienti+e+configurazione+con+la+Admin+API%2C+e+le+regole+che+contano+per+chi+integra.\u0026amp;theme=b820f5b71ce5aa6d495245fd\u0026amp;signature=c9e2bbd93e068425eea07c9fca4721300b7274b5ae32f1631752ebb57f80355e\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Gestisci il negozio via API - Vellaro\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vellaro.mintlify.site/_mintlify/api/og/v2?division=Guide\u0026amp;title=Gestisci+il+negozio+via+API\u0026amp;description=Catalogo%2C+ordini%2C+clienti+e+configurazione+con+la+Admin+API%2C+e+le+regole+che+contano+per+chi+integra.\u0026amp;theme=b820f5b71ce5aa6d495245fd\u0026amp;signature=c9e2bbd93e068425eea07c9fca4721300b7274b5ae32f1631752ebb57f80355e\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/vellaro/O-EcI1enAyFiSZlI/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Vellaro\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0b576a\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.vellaro.io/guides/admin-api\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/admin-api.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://docs.vellaro.io/guides/admin-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.vellaro.io/en/guides/admin-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.vellaro.io/guides/admin-api\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.vellaro.io/#organization\",\"name\":\"Vellaro\",\"url\":\"https://docs.vellaro.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/vellaro/CDVwR-ZaR80yGHu7/logo/vellaro.svg?fit=max\u0026auto=format\u0026n=CDVwR-ZaR80yGHu7\u0026q=85\u0026s=a7c5ae3c45fc8d042cf947f11fc432e2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.vellaro.io#website\",\"name\":\"Vellaro\",\"url\":\"https://docs.vellaro.io\",\"publisher\":{\"@id\":\"https://docs.vellaro.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.vellaro.io/guides/admin-api#webpage\",\"url\":\"https://docs.vellaro.io/guides/admin-api\",\"name\":\"Gestisci il negozio via API\",\"description\":\"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.\",\"dateModified\":\"2026-11-05T16:25:43.663Z\",\"isPartOf\":{\"@id\":\"https://docs.vellaro.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.vellaro.io/guides/admin-api#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.vellaro.io/guides/admin-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guide\",\"item\":\"https://docs.vellaro.io/guides/build-storefront\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gestisci il negozio via API\",\"item\":\"https://docs.vellaro.io/guides/admin-api\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.vellaro.io/guides/admin-api#article\",\"headline\":\"Gestisci il negozio via API\",\"name\":\"Gestisci il negozio via API\",\"description\":\"Catalogo, ordini, clienti e configurazione con la Admin API, e le regole che contano per chi integra.\",\"url\":\"https://docs.vellaro.io/guides/admin-api\",\"mainEntityOfPage\":{\"@id\":\"https://docs.vellaro.io/guides/admin-api#webpage\"},\"dateModified\":\"2026-11-05T16:25:43.663Z\",\"publisher\":{\"@id\":\"https://docs.vellaro.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.vellaro.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Vellaro\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Vellaro\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/guides/admin-api.md","siteName":"Vellaro","nav":{"global":null,"languages":[{"language":"it","default":true,"tabs":[{"tab":"Documentazione","groups":[{"group":"Inizia","pages":[{"title":"Vellaro API","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Autenticazione","href":"/authentication"},{"title":"Concetti fondamentali","href":"/concepts"},{"title":"Novità","href":"/changelog"}]},{"group":"Guide","pages":[{"title":"Costruisci uno storefront","href":"/guides/build-storefront"},{"title":"Costruisci un'app mobile","description":"iOS, Android o Flutter sulla stessa Storefront API.","href":"/guides/build-mobile"},{"title":"Gestisci il negozio via API","href":"/guides/admin-api"},{"title":"Webhook","description":"Ricevi eventi del negozio in tempo reale sul tuo endpoint, firmati e ritentati.","href":"/webhooks"}]},{"group":"AI \u0026 MCP","pages":[{"title":"AI \u0026 MCP","href":"/ai-mcp"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/mcp"}]}]},{"language":"en","pages":[{"title":"en","href":"/en/guides/admin-api"}]}]},"basePath":"","title":"Gestisci il negozio via API - Vellaro","buildId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","deploymentId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","dynamics":[],"chunks":[]}