API REST di automazione
Crea token con scope e gestisci la dashboard OrbitPage end-to-end da script, n8n, backend o CI.
Scegli l'API corretta
Questa pagina documenta il confine REST versionato. Un token OrbitPage non è una chiave provider OpenAI e non autentica mai gli endpoint privati della dashboard.
| Ambito | Credenziale | Scopo e supporto |
|---|---|---|
| API REST di automazione | op_pat_... | API esterna supportata per script, n8n, backend server e CI. Gestisce il workspace vincolato al token tramite /api/v1. |
| OrbitPage AI | op_pat_... + ai:read/ai:write | Il flusso pubblico plan/commit prepara e applica proposte AI validate. Qualsiasi credenziale provider OpenAI resta separata e lato server e non è mai un bearer token OrbitPage. |
| API della dashboard | Sessione Firebase sul SaaS; sessione admin sull'OSS | Route private tra browser e app. Non sono un contratto stabile per integrazioni esterne e non devono ricevere token API personali. |
Panoramica API REST
Ogni richiesta è vincolata al workspace selezionato quando il token è stato creato. Un token non può scegliere un altro tenant nell'URL o nel body e i permessi correnti del workspace vengono verificati a ogni chiamata.
Il contratto usa operazioni HTTPS JSON standard—GET, POST, PUT, PATCH e DELETE—ed è compatibile con curl, il nodo HTTP Request di n8n e i client generati da OpenAPI.
GET/api/v1/linksLeggi tutti i blocchi della pagina
Restituisce la collezione ordinata, l'identità del workspace e la revisione corrente.
Scope:links:readPATCH/api/v1/links/{linkId}Modifica un blocco esistente
Unisce i campi modificabili, valida l'intera pagina e pubblica la nuova revisione.
Scope:links:writePUT/api/v1/linksSostituisci l'intera collezione
Usalo per aggiungere, rimuovere o riordinare i blocchi dopo aver letto e conservato la collezione corrente.
Scope:links:write| Area dashboard | Percorsi API | Scope |
|---|---|---|
| Workspace e bozza completa | /workspace · /draft | workspace:read |
| Profilo, tema e sottopagine | /profile · /theme · /pages | profile:* · theme:* · pages:* |
| Impostazioni generali, privacy e menu | /settings/* | settings:* |
| Pubblicazione, versioni e backup | /publication · /versions · /backup | publication:* · backup:* |
| Media e domini personalizzati | /media/* · /domains/* | media:* · domains:* |
| Analytics e modifiche AI revisionate | /analytics · /ai/* | analytics:read · ai:* |
| Shop e newsletter | /shop/* · /newsletter/* | shop:* · newsletter:* |
| Team e fatturazione | /team/* · /billing/* | team:* · billing:* |
Reference completa degli endpoint
I percorsi seguenti sono relativi a https://orbitpage.com/api/v1. Metodo, percorso e scope costituiscono il contratto stabile di integrazione; schemi delle richieste, formati, valori enum e modelli di risposta sono nella specifica OpenAPI 3.1 collegata. Le route sconosciute restituiscono 404 e i metodi non supportati non vengono mai convertiti in modo implicito.
01Workspace, contenuti e aspettoControlla il workspace vincolato al token e gestisci bozza completa, profilo, blocchi, tema e sottopagine.11 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/workspace | Leggi workspace, piano, accesso, utilizzo e revisione | workspace:read | — |
GET/draft | Leggi la bozza completa e modificabile della pagina | workspace:read | — |
GET/links | Elenca i blocchi della pagina e la revisione corrente | links:read | — |
PUT/links | Sostituisci l'intera collezione ordinata dei blocchi | links:write | LinksReplaceRequest · If-Match |
PATCH/links/{linkId} | Modifica i campi modificabili di un blocco | links:write | LinkPatch · If-Match |
GET/profile | Leggi identità e metadati del profilo | profile:read | — |
PATCH/profile | Aggiorna i campi del profilo | profile:write | JSON · If-Match · ?publish=1 |
GET/theme | Leggi il tema attivo della bozza | theme:read | — |
PUT/theme | Sostituisci il tema della bozza | theme:write | JSON · If-Match · ?publish=1 |
GET/pages | Elenca le sottopagine configurate | pages:read | — |
PUT/pages | Sostituisci le sottopagine configurate | pages:write | array | { pages } · If-Match · ?publish=1 |
02Impostazioni e pubblicazioneControlla menu, privacy, file pubblici gestiti, generazione della sitemap e il ciclo esplicito dalla bozza alla pubblicazione.9 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/settings | Leggi impostazioni di menu, privacy, file di testo e sitemap | settings:read | — |
PUT/settings/menu | Aggiorna le impostazioni del menu | settings:write | JSON · If-Match · ?publish=1 |
PUT/settings/privacy | Aggiorna le impostazioni di consenso e privacy | settings:write | JSON · If-Match · ?publish=1 |
POST/settings/text-files | Crea un file di testo pubblico gestito | settings:write | TextFileCreateRequest · If-Match |
PUT/settings/text-files/{key} | Aggiorna un file di testo pubblico gestito | settings:write | TextFileUpdateRequest · If-Match |
DELETE/settings/text-files/{key} | Elimina un file di testo pubblico gestito | settings:write | If-Match |
POST/settings/sitemap | Rigenera la sitemap gestita | settings:write | If-Match |
GET/publication | Leggi lo stato di bozza e pubblicazione | publication:read | — |
POST/publication | Pubblica l'ultima bozza validata | publication:write | — |
03Versioni, backup e mediaRipristina contenuti versionati, esporta o importa i dati del workspace e usa il ciclo media prenota-carica-finalizza.9 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/versions | Elenca le versioni pubblicate ripristinabili della pagina | backup:read | — |
POST/versions/{revision}/restore | Ripristina e pubblica subito una versione storica | backup:write | If-Match |
GET/backup | Esporta un backup gestito del workspace | backup:read | ?sections=profile,links,… |
POST/backup/restore | Valida, ripristina e pubblica subito un backup gestito | backup:write | BackupRestoreRequest · If-Match |
GET/media | Elenca metadati e utilizzo dei media del workspace | media:read | — |
POST/media/cleanup | Visualizza in anteprima o elimina i media non referenziati | media:write | MediaCleanupRequest |
POST/media/uploads/reserve | Prenota un caricamento diretto di media | media:write | MediaUploadReserveRequest |
POST/media/uploads/finalize | Finalizza e registra un oggetto caricato | media:write | UploadTokenRequest |
DELETE/media/uploads | Annulla un caricamento media prenotato | media:write | UploadTokenRequest |
04Domini, analytics e AIGestisci l'attivazione DNS, leggi report di performance limitati dal piano e applica modifiche AI solo dopo un'anteprima validata.8 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/domains | Leggi stato del dominio e requisiti DNS | domains:read | — |
POST/domains | Collega un dominio personalizzato | domains:write | DomainConnectRequest |
POST/domains/refresh | Aggiorna verifica e attivazione | domains:write | — |
DELETE/domains | Scollega il dominio personalizzato | domains:write | — |
GET/analytics | Leggi il report analytics della dashboard | analytics:read | ?days=7|30|90 |
GET/ai/allowance | Leggi disponibilità AI e utilizzo corrente | ai:read | — |
POST/ai/plan | Genera un'anteprima validata delle modifiche AI | ai:write | AiPlanRequest |
POST/ai/commit | Applica un'anteprima AI validata in precedenza | ai:write | AiCommitRequest |
05ShopCollega il commercio, gestisci prodotti e aspetto, carica file protetti, quindi pubblica o ritira il blocco Shop sincronizzato.10 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/shop | Leggi prodotti, ordini, clienti e stato di Shop; l'operazione può inizializzare dati privati di Shop e aggiornare lo stato Stripe | shop:read | ?refresh=0|1 |
POST/shop/connect | Crea o continua l'onboarding Stripe Connect | shop:write | — |
POST/shop/products | Crea o aggiorna un prodotto Shop | shop:write | ShopProductRequest |
DELETE/shop/products/{productId} | Elimina un prodotto Shop | shop:write | — |
PUT/shop/appearance | Sostituisci l'intero aspetto di Shop | shop:write | ShopAppearanceRequest |
POST/shop/publish | Pubblica Shop e il relativo blocco pagina sincronizzato | shop:write | — |
POST/shop/unpublish | Ritira Shop dalla pubblicazione | shop:write | — |
POST/shop/uploads/reserve | Prenota il caricamento di un file prodotto | shop:write | ShopFileUploadReserveRequest |
POST/shop/uploads/finalize | Finalizza il caricamento di un file prodotto | shop:write | ShopUploadTokenRequest |
DELETE/shop/uploads | Annulla un caricamento di file prodotto prenotato | shop:write | ShopUploadTokenRequest |
06NewsletterConfigura l'invio SMTP cifrato, gestisci gli iscritti con consenso e controlla l'intero ciclo delle campagne.9 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/newsletter | Leggi iscritti, campagne e stato SMTP | newsletter:read | — |
PUT/newsletter/settings | Aggiorna le impostazioni SMTP cifrate | newsletter:write | NewsletterSmtpRequest |
POST/newsletter/settings/test | Invia un test di configurazione | newsletter:write | EmailRecipientRequest |
POST/newsletter/subscribers | Aggiungi o aggiorna un iscritto con consenso | newsletter:write | NewsletterSubscriberRequest |
DELETE/newsletter/subscribers/{subscriberId} | Rimuovi un iscritto | newsletter:write | — |
POST/newsletter/campaigns | Crea o aggiorna una campagna | newsletter:write | NewsletterCampaignRequest |
DELETE/newsletter/campaigns/{campaignId} | Elimina una campagna | newsletter:write | — |
POST/newsletter/campaigns/{campaignId}/send | Accoda o programma una campagna | newsletter:write | NewsletterSendRequest |
DELETE/newsletter/campaigns/{campaignId}/send | Annulla una campagna in coda | newsletter:write | — |
07Team e fatturazioneGestisci collaboratori e inviti, controlla gli abbonamenti e apri sessioni autenticate di checkout o portale Stripe.9 operazioni
| Metodo e percorso | Operazione | Scope richiesto | Input e controlli |
|---|---|---|---|
GET/team | Elenca membri e inviti in attesa | team:read | — |
POST/team/invitations | Crea un link di invito al workspace senza inviare email | team:write | TeamInvitationRequest |
PATCH/team/members/{memberUid} | Aggiorna il ruolo di un membro | team:write | TeamRoleRequest |
DELETE/team/members/{memberUid} | Rimuovi un membro del workspace | team:write | — |
DELETE/team/invitations/{invitationId} | Revoca un invito in attesa | team:write | — |
GET/billing | Leggi lo stato di piano e abbonamento | billing:read | — |
POST/billing/checkout | Crea un checkout Stripe per un piano | billing:write | BillingCheckoutRequest |
POST/billing/portal | Crea una sessione del portale di fatturazione Stripe | billing:write | BillingPortalRequest |
POST/billing/promotion-code | Riscatta un codice promozionale e riconcilia i diritti del piano | billing:write | PromotionCodeRedeemRequest |
Crea e usa un token
Apri Dashboard > Team > Token API personali. Assegna un nome che identifichi proprietario e scopo, scegli accesso completo al workspace, workspace in sola lettura, solo link oppure singoli scope di risorsa, quindi imposta una scadenza di 30, 90 o 365 giorni—oppure nessuna scadenza se esiste già un processo di rotazione documentato.
Conferma la tua identità
La creazione del token è un'azione sensibile e richiede un'autenticazione Google o password recente.
Scegli lo scope minimo
Gli scope di lettura e scrittura sono separati per ogni risorsa—per esempio theme:read, theme:write, shop:read e shop:write. Uno scope di scrittura include automaticamente il relativo scope di lettura.
Copia il segreto una sola volta
OrbitPage conserva un hash SHA-256, non il segreto recuperabile. Se lo perdi, revocalo e crea un nuovo token.
Conservalo fuori dal codice
Usa una variabile d'ambiente o il secret store della CI. Non inserire mai il token in URL, repository, screenshot, bundle del browser o log di build.
export ORBITPAGE_TOKEN='op_pat_...'
curl --silent --show-error --include \
--header "Authorization: Bearer $ORBITPAGE_TOKEN" \
https://orbitpage.com/api/v1/links$env:ORBITPAGE_TOKEN = 'op_pat_...'
$headers = @{ Authorization = "Bearer $env:ORBITPAGE_TOKEN" }
Invoke-RestMethod -Uri 'https://orbitpage.com/api/v1/links' -Headers $headersLeggi la collezione
Il body della risposta contiene i blocchi ordinati in data e la revisione numerica corrente. La stessa revisione compare in X-OrbitPage-Revision e come ETag debole. Conserva uno dei due valori per If-Match; non indovinarlo e non riutilizzarlo tra esecuzioni non correlate.
HTTP/2 200
etag: W/"42"
x-orbitpage-revision: 42
content-type: application/json; charset=utf-8
{
"object": "list",
"data": [
{
"id": "portfolio-main",
"type": "link",
"title": "Selected work",
"description": "Recent projects and case studies",
"url": "https://example.com/work",
"isActive": true,
"status": "live",
"availability": "available",
"clickCount": 18,
"position": 0
}
],
"revision": 42,
"workspace": {
"tenantId": "tenant_...",
"pageId": "page_...",
"username": "your-page"
}
}dataLa collezione completa e ordinata dei blocchi. L'ordine dell'array è l'ordine visivo della pagina.revisionLa versione per la concorrenza ottimistica usata da ogni scrittura.workspaceIl tenant, la pagina e lo username vincolati in modo permanente al token.ETagIl valore più sicuro da passare direttamente nell'header If-Match successivo.Modifica un blocco
Codifica nell'URL l'ID restituito da GET e invia solo i campi da cambiare. OrbitPage unisce la patch al blocco esistente, protegge identità e campi analytics, valida l'intera pagina rispetto a schema e piano, quindi pubblica immediatamente.
curl --request PATCH \
--url https://orbitpage.com/api/v1/links/portfolio-main \
--header "Authorization: Bearer $ORBITPAGE_TOKEN" \
--header 'Content-Type: application/json' \
--header 'If-Match: W/"42"' \
--data '{
"title": "Book a consultation",
"url": "https://example.com/book",
"isActive": true
}'| Gruppo di campi | Esempi | Comportamento |
|---|---|---|
| Contenuto | title, description, url, content, textItems | Modificabili se validi per il tipo di blocco esistente. |
| Visibilità e tempi | isActive, status, availability, startDate, endDate, timezone | Validati insieme alle regole di programmazione e del piano. |
| Aspetto e media | icon, coverImage, backgroundColor, alignment, size | Accettati solo quando i valori rispettano lo schema della pagina. |
| Protetti | id, type, clickCount, ctaClicks, systemKey | Ignorati o rifiutati. I blocchi gestiti dal sistema non possono essere modificati con PATCH. |
Sostituisci la collezione
PUT sostituisce l'intera collezione ordinata. È l'operazione da usare per aggiungere un blocco, rimuoverlo o cambiare l'ordine della pagina. Non è una scorciatoia per modificare un solo titolo: omettere un blocco lo rimuove dalla pagina.
const token = process.env.ORBITPAGE_TOKEN;
if (!token) throw new Error("ORBITPAGE_TOKEN is missing");
const endpoint = "https://orbitpage.com/api/v1/links";
const authorization = { Authorization: `Bearer ${token}` };
const read = await fetch(endpoint, { headers: authorization });
if (!read.ok) throw new Error(`GET failed: ${read.status} ${await read.text()}`);
const current = await read.json();
const revision = read.headers.get("etag") ?? String(current.revision);
// Preserve the full collection and change only the intended block.
const links = current.data.map((block) =>
block.id === "portfolio-main"
? { ...block, title: "Work and case studies" }
: block
);
const write = await fetch(endpoint, {
method: "PUT",
headers: {
...authorization,
"Content-Type": "application/json",
"If-Match": revision
},
body: JSON.stringify({ links })
});
if (!write.ok) throw new Error(`PUT failed: ${write.status} ${await write.text()}`);
console.log(await write.json());n8n e flussi end-to-end
OrbitPage non richiede un SDK: è compatibile qualsiasi client HTTPS in grado di inviare JSON, autenticazione Bearer e richieste standard GET, POST, PUT, PATCH e DELETE. I modelli seguenti coprono le parti con stato che un'integrazione deve gestire esplicitamente.
Community node n8n verificato
Installa n8n-nodes-orbitpage e crea una credenziale OrbitPage API con token personale e URL base. Il test di connessione esegue una lettura sicura del workspace; le azioni guidate gestiscono poi percorsi, scope, collegamento degli elementi e scritture consapevoli della revisione senza inserire il segreto nel JSON del workflow.
Bozza e pubblicazione
Le scritture di profilo, tema, pagine e impostazioni supportate richiedono If-Match e aggiornano la bozza per impostazione predefinita. Aggiungi ?publish=1 per una pubblicazione immediata idonea, oppure controlla più modifiche differite e chiama POST /publication una sola volta. PATCH e PUT dei link pubblicano immediatamente.
Caricamento diretto dei media
Prima prenota, poi carica i byte nell'URL di storage restituito e infine finalizza. Invia il bearer token OrbitPage solo a orbitpage.com; per la richiesta allo storage usa esclusivamente metodo e header temporanei restituiti.
Applicazione AI revisionata
Plan restituisce un'anteprima validata senza modificare la pagina. Conserva e controlla il relativo previewToken, quindi applica esattamente quella proposta. Imposta publish nel body del commit solo se l'automazione è autorizzata a rendere pubblico il risultato.
OrbitPage è approvato da n8n come Verified Community Node; resta gestito dalla community e non è preinstallato. Quando compare nel catalogo verificato, il proprietario o un amministratore dell'istanza può cercare OrbitPage dal pannello + dei nodi, selezionare More from the community e scegliere Install, anche su n8n Cloud. Se non è ancora elencato, su Cloud occorre attendere la pubblicazione nel catalogo; su n8n self-hosted si può installare n8n-nodes-orbitpage da Settings → Community Nodes.
Installazione, download e workflow di esempio
Install community node: n8n-nodes-orbitpage
Credential: OrbitPage API
OrbitPage API Token: op_pat_...
OrbitPage Base URL: https://orbitpage.com
Connection test: GET /api/v1/workspace
First safe workflow step:
Node: OrbitPage
Resource: Workspace & Draft
Operation: Get Workspace Overview
First revision-controlled write:
Resource: Theme
Operation: Replace Entire Theme Draft
Revision Check: Use Latest Automatically (Recommended)# 1. Reserve an upload and receive uploadUrl, slot and uploadToken
POST /api/v1/media/uploads/reserve
{ "filename": "cover.jpg", "contentType": "image/jpeg", "sizeBytes": 245760 }
# 2. Upload the bytes directly using the returned URL, method and headers
# Do not forward the OrbitPage Authorization header to the storage URL.
# 3. Register the uploaded object in the workspace
POST /api/v1/media/uploads/finalize
{ "slot": "<slot>", "uploadToken": "<uploadToken>" }# 1. Generate a validated preview without changing the page
POST /api/v1/ai/plan
{ "message": "Make the primary CTA clearer" }
# 2. Review the returned operations and previewToken
# 3. Apply the exact reviewed preview; publishing remains explicit
POST /api/v1/ai/commit
{ "previewToken": "<previewToken>", "publish": false }Usa come URL base https://orbitpage.com, senza /api/v1. Un salvataggio riuscito legge /api/v1/workspace e conferma token, associazione al workspace e scope workspace:read senza modificare dati.
Un 401 richiede un token sostitutivo valido, un 403 richiede lo scope mancante e redirect ripetuti richiedono di controllare l'URL base o il reverse proxy. Condividi con il supporto stato e codice JSON, mai il segreto.
CI, rotazione e revoca
Un workspace supporta fino a dieci token personali attivi per utente. L'elenco dei token in Team mostra prefisso, scope, date di creazione e scadenza e utilizzo recente. Il timestamp dell'ultimo uso viene aggiornato intenzionalmente al massimo una volta ogni cinque minuti.
name: Update OrbitPage
on: workflow_dispatch
jobs:
update:
runs-on: ubuntu-latest
env:
ORBITPAGE_TOKEN: ${{ secrets.ORBITPAGE_TOKEN }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: node scripts/update-orbitpage.mjs- Nomina i token per sistema e ambiente—per esempio “GitHub Actions · produzione”.
- Ruota creando il sostituto, aggiornando il secret store, provando una lettura e poi revocando il vecchio token.
- Revoca immediatamente dopo una possibile esposizione, un cambio di responsabilità o la dismissione del workflow. La revoca ha effetto dalla richiesta successiva.
- Non creare un unico token condiviso e permanente. Credenziali separate rendono comprensibili log, rotazione e risposta agli incidenti.
Errori e tentativi
Gli errori usano JSON con error e code. Non analizzare la frase destinata alle persone per controllare un workflow. La maggior parte delle risposte 4xx richiede di cambiare richiesta o credenziale; solo i conflitti di revisione e i limiti di frequenza appartengono a un percorso di retry automatico.
INVALID_JSON · LINKS_REQUIRED · LINK_PATCH_INVALIDCorreggi il body della richiesta o i campi rifiutati dallo schema della pagina.PERSONAL_TOKEN_*Sostituisci un token mancante, non valido, scaduto o revocato. Non riprovare con lo stesso segreto.PERSONAL_TOKEN_SCOPE_DENIED · SYSTEM_LINK_PROTECTEDUsa lo scope richiesto oppure interrompi: l'identità corrente non può eseguire questa operazione.LINK_NOT_FOUNDRileggi la collezione: l'ID del blocco potrebbe essere stato rimosso o sostituito.revision_conflictEsegui di nuovo GET, riapplica la modifica sul nuovo stato e riprova con la nuova revisione.REQUEST_TOO_LARGEMantieni il body JSON entro 768 KiB.UNSUPPORTED_CONTENT_ENCODINGInvia un body JSON non compresso.revision_requiredAggiungi If-Match usando la revisione o l'ETag restituito dall'ultima GET.RATE_LIMITEDAttendi Retry-After, poi riprova con backoff esponenziale e jitter.I limiti attuali consentono 120 richieste al minuto e 5.000 al giorno per token. Le protezioni antiabuso possono renderli più restrittivi; rispetta sempre Retry-After.
Valida il risultato
Controlla stato della risposta, revisione e dati restituiti. Per modifiche importanti, apri la pagina pubblica dopo la pubblicazione e segnala gli errori senza registrare il token nei log.
SaaS e open source
Il repository open source contiene un'API Express usata dalla dashboard inclusa, ma quell'API interna basata sulla sessione admin non è lo stesso contratto versionato per le automazioni. Non inviare un token op_pat a un server self-hosted e non inviare un JWT admin self-hosted a orbitpage.com/api/v1.
Leggi il confine API dell'open source