Salta al contenuto

Documentazione

L’API REST

Tutto ciò che fa nel pannello può farlo anche il suo codice. Una chiave, un URL di base ed esattamente le autorizzazioni che già possiede: qui non c’è nulla che permetta di aggirare il pannello.

URL di base e autenticazione

Ogni percorso di questa pagina sta dietro l’URL di base qui sotto, e ogni richiesta porta la sua chiave in un’intestazione Authorization. Non esiste un’altra via d’accesso: nessun cookie di sessione, nessuna basic auth, nessuna chiave nella query string.

shell
curl -s https://app.provibr.com/api/v1/me \
  -H "Authorization: Bearer pvk_..."
Non c’è CORS, ed è una scelta voluta, non una dimenticanza. Una chiave bearer nel JavaScript del browser è una chiave trapelata: ogni visitatore può leggerla. Chiami questa API dal suo backend, mai da una pagina nel browser di qualcun altro.
I comandi e l’output del terminale sono in inglese ovunque, nel pannello e in queste pagine. Un solo testo, una sola verità: quello che legge qui è letteralmente ciò che il suo host le restituirà.

Chiavi

Una chiave si crea nella sua pagina di profilo, sotto Chiavi API. Appartiene a lei e a un solo account: non è condivisa con i suoi colleghi e smette di funzionare nel momento in cui lascia quell’account.

Una chiave viene mostrata una sola volta, al momento della creazione. Ne conserviamo soltanto un hash, quindi una chiave persa non è recuperabile: ne crei una nuova e revochi quella vecchia.
  • Salvo diversa indicazione, una chiave scade dopo 90 giorni. Può scegliere un periodo più breve, oppure nessuna scadenza; una chiave senza data di fine è una chiave che nessuno revocherà al posto suo.
  • Ruotare una chiave significa crearne una nuova e revocare quella vecchia, con un intervallo in cui funzionano entrambe. Non esiste una sostituzione diretta della chiave esistente, perché la lascerebbe senza una chiave funzionante se qualcosa andasse storto a metà strada.
  • Può vincolare una chiave a un elenco di indirizzi. Una richiesta proveniente da qualsiasi altro punto viene rifiutata prima che venga letto alcunché, e quel rifiuto non rivela nulla sulla chiave a chi la effettua.
  • Un membro può avere al massimo 25 chiavi. Una chiave revocata mantiene la sua riga, così anche in seguito si può vedere che cosa le era consentito fare quando era in uso.
I proprietari e gli amministratori vedono tutte le chiavi dell’account in Impostazioni, con il membro a cui ciascuna appartiene. Quella pagina è la revisione degli accessi: è l’unico punto in cui si vede a colpo d’occhio chi può raggiungere questo account dall’esterno del pannello.

Che cosa può fare una chiave

Una chiave porta con sé degli ambiti: lettura o scrittura, per ogni parte del pannello. Ciò che può fare davvero è l’intersezione fra quegli ambiti e le autorizzazioni del membro a cui appartiene.

Un ambito non concede mai più di quanto il membro abbia già. Selezionare l’accesso in scrittura sulla chiave di qualcuno che non può creare server non concede nulla a quella chiave; un ambito può soltanto restringere ciò che la chiave è autorizzata a fare.

Le autorizzazioni vengono lette in tempo reale, a ogni richiesta. Se toglie qualcosa a un membro, tutte le chiavi di quel membro si restringono all’istante, senza che nessuno debba revocare alcunché. È anche per questo che una chiave sopravvive a un cambio di ruolo invece di essere invalidata da esso.

Tutto ciò che fa un agente richiede tempo

La sua infrastruttura è raggiungibile soltanto attraverso l’agente che si trova nella sua rete, e quell’agente si connette verso l’esterno. Perciò un endpoint che modifica una macchina non può rispondere con il risultato: risponde che l’ordine è stato accettato e le consegna qualcosa da seguire.

  1. Invia la richiesta e riceve una risposta di accettazione, con un’intestazione Location che rimanda al comando appena creato. Quell’intestazione è assoluta a partire dall’host: va risolta rispetto all’origine e non rispetto all’URL di base qui sopra, altrimenti si finisce per chiedere un percorso che non esiste.
  2. Quello stesso comando si trova anche nel corpo, ma avvolto in un campo command. La lettura qui sotto lo restituisce nudo, senza quell’involucro: basta scartarlo una volta e la prima lettura di solito è superflua.
  3. Legge il comando finché il suo stato non è definitivo: completato, non riuscito, scaduto o annullato. Solo in attesa non è definitivo, e uno stato sconosciuto vale anch’esso come definitivo, così un valore aggiunto in seguito non lascia mai la lettura aperta all’infinito.
  4. Un comando non riuscito porta con sé il codice di errore dell’agente stesso, con i suoi argomenti: gli stessi che il pannello mostra sul suo schermo.
shell
# 1. the order - answers 202 with a Location header
curl -s -D - -X POST https://app.provibr.com/api/v1/servers/<serverId>/actions/start \
  -H "Authorization: Bearer pvk_..."

# 2. the outcome - repeat until the status is final
curl -s https://app.provibr.com/api/v1/commands/<commandId> \
  -H "Authorization: Bearer pvk_..."
La lettura non funziona mai così. Un inventario, un indirizzo o una fattura rispondono subito, perché quella risposta arriva dal nostro database e non dal suo host.

Che cosa si riceve

Ogni endpoint dichiara con che cosa risponde: 200 per una lettura, 201 quando qualcosa è stato creato, 202 quando l’agente ha ancora del lavoro da svolgere. E tutti descrivono il corpo che restituiscono, con un nome proprio per risorsa, così il codice generato contiene un tipo per risorsa e non uno per endpoint.

Conviene leggere con indulgenza ciò che arriva. All’interno di questa versione si aggiunge soltanto, quindi può comparire un campo sconosciuto: rifiutarlo trasformerebbe la nostra promessa di modifiche additive in una rottura dalla parte del client. Ciò che si invia è giudicato con rigore: un nome di campo con un refuso viene rifiutato anziché ignorato in silenzio.

Paginazione

Gli elenchi rispondono con una pagina e un cursore; quel cursore va restituito finché non torna vuoto. Per impostazione predefinita una pagina contiene 50 righe e al massimo 100.

Non si fermi mai davanti a una pagina corta. Alcuni elenchi filtrano riga per riga dopo la lettura, in base alle sue autorizzazioni o a ciò di cui un provider è capace. Restituiscono quindi legittimamente meno righe di quante ne abbia chieste, anche se ce ne sono ancora. Il cursore è l’unico segnale di fine.

Errori

Ogni risposta che non è un successo ha la stessa forma, qualunque cosa sia andata storta e in qualunque punto sia successo.

json
{
  "error": {
    "code": "validation_failed",
    "message": "Name is too long (max 64).",
    "detail": "server.validation.apiKeys.nameTooLong",
    "params": { "max": 64 },
    "requestId": "3f9c1b2a-..."
  }
}
code
La parola su cui ramificare. Proviene da un elenco chiuso, quindi un valore che non conosce significa che sta parlando con una versione più recente di quella per cui ha sviluppato.
message
Una frase in inglese, per chi legge un log. Non ci ramifichi mai sopra: la formulazione può cambiare in qualsiasi momento.
detail
Una chiave stabile, quando esiste. È la stessa chiave che il pannello usa per il proprio messaggio, così può rendere la frase nella sua lingua.
params
Gli argomenti che appartengono a quella chiave: un limite superato, un nome già occupato, l’host che ha rifiutato.
requestId
L’identificativo di questa richiesta, presente anche in un’intestazione della risposta. Lo citi quando ci chiede qualcosa.
Non esiste da nessuna parte uno stato che dica «esiste ma non è ancora realizzato». Un percorso che questa versione non offre è semplicemente un not-found, perché una roadmap non è qualcosa che un messaggio di errore debba rivelare.
Un not-found significa una di due cose, e la chiave stabile dice quale. O questa parte dell’API è spenta qui, oppure la risorsa non è nell’account. Quest’ultimo caso comprende di proposito sia un identificativo che non esiste sia uno che non si può vedere, perché distinguerli permetterebbe a chiunque di sondare righe che non lo riguardano.

Quanto può chiedere

Può effettuare 120 richieste al minuto per chiave e 600 per account su tutte le sue chiavi. Il secondo limite esiste perché venti chiavi non possano mettere venti volte il carico sullo stesso host.

Ogni risposta indica il limite, quanto ne resta e quando la finestra si azzera. Un rifiuto aggiunge quanto tempo attendere; segua quel numero invece di un ritardo scelto da lei.

Ripetere una richiesta in sicurezza

Tutto ciò che crea qualcosa accetta un’intestazione idempotency-key scelta da lei. Ripeta la stessa richiesta con lo stesso valore e riceverà indietro il primo esito, invece di una seconda macchina, di una seconda chiave o di un secondo comando.

Riutilizzare quel valore per una richiesta diversa viene rifiutato di proposito. Una chiave che significa due cose non significa nulla, e l’alternativa, eseguire in silenzio anche la seconda operazione, è il modo in cui ci si ritrova con una macchina che nessuno ha ordinato.

Può anche inviare un suo x-request-id. Torna sulla risposta e compare nei nostri log: è il modo più economico per affiancare una riga dalla sua parte a una riga dalla nostra.

Provider

Nel routing di questa API non compare il nome di un solo provider. Quali sistemi si possono collegare, di quali campi si compongono le loro credenziali e di che cosa sono capaci è ciò a cui risponde l’endpoint di discovery, e il corpo che invia per creare un’integrazione è costruito a partire dallo stesso registro. Un provider che entra in funzione compare in entrambi senza che cambi un solo endpoint.

Vale anche il contrario. Se chiede a una macchina qualcosa che il suo provider non sa fare (una console su un account di hosting, un disco su un server di gioco), riceve un rifiuto che indica per nome la funzionalità mancante. Il rifiuto arriva prima che qualsiasi cosa venga inviata al suo agente.

Tutti gli endpoint

Raggruppati come li raggruppa la specifica. Ogni percorso va dopo l’URL di base e accanto a esso è indicato l’ambito richiesto dall’endpoint; dove non c’è nulla, basta una chiave valida.

Questo elenco è una citazione e resta quindi in inglese in ogni lingua: i percorsi, gli ambiti e le descrizioni sono letteralmente ciò che dice la specifica, e tradurli le mostrerebbe una parola diversa dalla risposta che riceve.
Alcune parti stanno dietro un interruttore di rilascio, e la descrizione le comprende sia che sia acceso sia che non lo sia, così un solo client generato funziona con qualsiasi installazione. Quale interruttore serve a un endpoint è indicato accanto a esso; se questa installazione lo ha acceso si legge nella descrizione leggibile dalla macchina qui sotto. Spento, il percorso risponde con un not-found: non esiste chiave né ruolo che lo accenda.

Self

The key itself: what it may do, and managing the keys of this member.

  • GET /api-keysapi-keys:manageList the API keys of the member behind this key, including revoked ones.
  • POST /api-keys201api-keys:manageCreate an API key. The secret is returned once and never again.
  • DELETE /api-keys/{keyId}api-keys:manageRevoke an API key belonging to the member behind this key.
  • GET /dashboardThe dashboard tiles as numbers: servers, agents, capacity, credit, incidents, notifications.
  • GET /meDescribe the organization, member and permissions behind this API key or app session.
  • GET /organizationsList every account this member can work in, oldest membership first.
  • POST /organizations/{organizationId}/activateSwitch the active account of this session. Returns the account you are now in.
  • POST /ws-ticketMint a single-use ticket for the realtime WebSocket.

Discovery

What this platform can integrate with. Read this first if you build forms: a provider that goes live shows up here without any change to the endpoints below.

  • GET /integration-typesagents:readList the integration types this platform can manage, with their capabilities.

Servers

Virtual machines, hosting accounts and game servers. Everything that changes a machine is asynchronous: you get 202 with a command to poll.

  • GET /serversservers:readList the servers this key may see, oldest first.
  • POST /servers202servers:writeOrder a server: a VM on a hypervisor, a hosting account on a control panel, or a game server on a game panel. Returns 202 with the command to poll.
  • DELETE /servers/{serverId}202servers:writeDelete a server. Returns 202 with a command when the provider is asked to remove it, or 200 when only the platform record is removed.
  • GET /servers/{serverId}servers:readFetch one server, including its agent, integration, capabilities and actions.
  • POST /servers/{serverId}/actions/{verb}202servers:writeRun a power action on a server (start, stop, shutdown, suspend, resume, restart, kill). Returns 202 with the command to poll.
  • POST /servers/{serverId}/actions/network-install202servers:writeInstall a server over the network with a PXE profile. Returns 202 with the command to poll.
  • POST /servers/{serverId}/actions/refresh-firewall-log202servers:writeAsk the agent for the most recent firewall log lines. Returns 202; the lines are in the command result.
  • POST /servers/{serverId}/actions/refresh-firewall-rules202servers:writeAsk the agent to read the current firewall rules and digest. Returns 202; poll the command, then read GET /firewall-rules.
  • POST /servers/{serverId}/actions/refresh-hardware202servers:writeAsk the agent to read the current disk and NIC layout. Returns 202; poll the command, then read GET /hardware.
  • POST /servers/{serverId}/actions/reinstall202servers:writeReinstall a server from an OS template: same vmid, same IP, everything on disk is lost. Returns 202 with the command to poll.
  • POST /servers/{serverId}/actions/sync-ip-filter202servers:writePush the allocated IP addresses into the VM firewall ipset. Returns 202 with the command to poll.
  • GET /servers/{serverId}/addressesservers:readList the IP addresses currently allocated to this server.
  • POST /servers/{serverId}/addressesservers:writeAllocate an IP address to this server, from a pool or a specific address. Synchronous: returns 200 with the allocation and whether the VM firewall picked it up.
  • DELETE /servers/{serverId}/addresses/{allocationId}servers:writeRelease an IP allocation back to the pool. Synchronous: returns 200 and whether the VM firewall picked it up.
  • GET /servers/{serverId}/commandsservers:readList the commands issued against this server, newest first.
  • POST /servers/{serverId}/disks202servers:writeAttach an extra disk to a server. Returns 202 with the command to poll.
  • DELETE /servers/{serverId}/disks/{disk}202servers:writeDetach a disk, optionally destroying the volume. Returns 202 with the command to poll.
  • PATCH /servers/{serverId}/disks/{disk}202servers:writeGrow a disk. Use "boot" as the disk key to grow the boot disk. Returns 202 with the command to poll.
  • GET /servers/{serverId}/firewall-rulesservers:readReturn the last observed firewall rules and the platform's ipfilter intent.
  • PUT /servers/{serverId}/firewall-rules202servers:writeReplace the customer-owned firewall rules. The digest from the last GET is required and acts as an optimistic lock. Returns 202 with the command to poll.
  • GET /servers/{serverId}/hardwareservers:readReturn the most recent hardware observation (disks, NICs, firewall state).
  • GET /servers/{serverId}/metricsservers:readRead the cpu, memory, disk and network series of one server for a window.
  • POST /servers/{serverId}/nics202servers:writeAttach an extra network interface. Note that this turns the VM ipfilter off while the new NIC has no addresses. Returns 202 with the command to poll.
  • DELETE /servers/{serverId}/nics/{nic}202servers:writeDetach a network interface. net0 is protected. Returns 202 with the command to poll.

Commands

The poll side of every asynchronous endpoint. A 202 hands you a command id and a Location header; this is where you read how it ended.

  • GET /commandsservers:readagents:readList commands across the organization, newest first.
  • GET /commands/{commandId}servers:readagents:readPoll one command: its state, result and error code.

Agents

The agents that run inside your own network and do the actual work.

  • GET /agentsagents:readList the agents of this account, oldest first.
  • POST /agents201agents:writeCreate an agent. The activation code and the installation one-liner are returned once and never again.
  • DELETE /agents/{agentId}agents:writeRemove an agent from the panel. Only possible when it is pending or revoked and has no integrations or servers left.
  • GET /agents/{agentId}agents:readGet one agent, including whether it is connected right now.
  • PATCH /agents/{agentId}agents:writeChange the name and/or the description of an agent.
  • POST /agents/{agentId}/actions/reissue-install-linkagents:writeIssue a new activation code and installation one-liner for this agent. Any outstanding enrollment token is superseded; the secrets are returned once.
  • POST /agents/{agentId}/actions/revokeagents:writeRevoke an agent: it loses its certificate and wipes its identity and credential vault. Repeating this is a no-op.
  • POST /agents/{agentId}/actions/update202agents:writeTell an agent to update itself to the release on this environment. Returns 202 with the command to poll.

Integrations

The connections from an agent to your infrastructure. Credentials are delivered to the agent once and are never readable back.

  • GET /integrationsagents:readList the integrations of this account, oldest first.
  • POST /integrations202agents:writeCreate an integration and deliver its credentials to the agent. Returns 202 with the credential push to poll.
  • DELETE /integrations/{integrationId}agents:writeDelete an integration. Refuses while servers are still attached.
  • GET /integrations/{integrationId}agents:readGet one integration, with what the provider behind it can do.
  • PATCH /integrations/{integrationId}agents:writeUpdate the name, provider settings, placement limits or enabled state. Credentials cannot be changed here.
  • POST /integrations/{integrationId}/actions/import-unmanagedagents:writeImport resources that exist on the remote system but not in Provibr, from an earlier unmanaged listing.
  • POST /integrations/{integrationId}/actions/list-remote202agents:writeAsk the agent to list something on the remote system (templates, plans, eggs, unmanaged resources). Which kinds exist is in the integration's remoteListings. Returns 202 with the command to poll.
  • POST /integrations/{integrationId}/actions/resend-credentials202agents:writeSend a complete new set of credentials to the agent. Returns 202 with the credential push to poll.
  • POST /integrations/{integrationId}/actions/test202agents:writeAsk the agent to test the connection to this system. Returns 202 with the command to poll.
  • GET /integrations/{integrationId}/install-methodagents:readGet the current install method, or — with ?method= — what switching to another one would do. Changes nothing.
  • PUT /integrations/{integrationId}/install-methodagents:writeSet the install method of this integration. Refuses when published, installable operating systems would lose their source.
  • GET /integrations/{integrationId}/os-linksagents:readList the operating systems linked to this integration, with the provider template and/or PXE profile behind each.
  • DELETE /integrations/{integrationId}/os-links/{osId}agents:writeClear one source for this operating system. The other source stays. Clearing a source that was not set is not an error.
  • PUT /integrations/{integrationId}/os-links/{osId}agents:writeSet one source (provider template or PXE profile) for this operating system on this integration. Leaves the other source untouched.

IPAM

Address space: groups, prefixes, allocations, reservations, child blocks and VLAN pools.

  • DELETE /ipam/allocations/{allocationId}ipam:writeRelease an address allocation or reservation. Sets released_at; the row stays as history.
  • GET /ipam/child-policiesipam:read⚑ ipamAutoAllocationList the child-prefix policies of this account, oldest first.
  • POST /ipam/child-policies201ipam:write⚑ ipamAutoAllocationCreate a child-prefix policy. Returns 201 with the policy.
  • DELETE /ipam/child-policies/{policyId}ipam:write⚑ ipamAutoAllocationDelete a child-prefix policy. Refuses while reservations from it are still live.
  • GET /ipam/child-policies/{policyId}ipam:read⚑ ipamAutoAllocationGet one child-prefix policy.
  • PATCH /ipam/child-policies/{policyId}ipam:write⚑ ipamAutoAllocationReplace a child-prefix policy. Send the whole policy, not just the changed fields.
  • POST /ipam/child-policies/{policyId}/actions/reserveipam:write⚑ ipamAutoAllocationLease a child prefix (and a VLAN id when the policy has a pool) according to this policy. Repeat with the same idempotencyKey to get the same reservation back.
  • GET /ipam/child-reservationsipam:read⚑ ipamAutoAllocationList the child-prefix reservations of this account, oldest first. Includes released rows.
  • POST /ipam/child-reservations/{reservationId}/actions/set-stateipam:write⚑ ipamAutoAllocationMove a reservation to another state. Releasing from quarantine takes two steps: release_pending, then released.
  • GET /ipam/groupsipam:readList the IPAM groups of this account, oldest first.
  • POST /ipam/groups201ipam:writeCreate an IPAM group. Returns 201 with the group.
  • DELETE /ipam/groups/{groupId}ipam:writeDelete an IPAM group. Refuses while prefixes, plans or plan placements still point at it.
  • GET /ipam/groups/{groupId}ipam:readGet one IPAM group.
  • PATCH /ipam/groups/{groupId}ipam:writeReplace an IPAM group. Send the whole group, not just the changed fields.
  • GET /ipam/prefixesipam:readList the IPAM prefixes of this account, oldest first. Includes child blocks.
  • POST /ipam/prefixes201ipam:writeCreate an IPAM prefix. Pass parentId to carve a child block out of an existing one. Returns 201.
  • DELETE /ipam/prefixes/{prefixId}ipam:writeDelete an IPAM prefix. Refuses while child blocks, active allocations, plans or plan placements point at it. Also removes the released-allocation history of this block.
  • GET /ipam/prefixes/{prefixId}ipam:readGet one IPAM prefix, with its address usage.
  • PATCH /ipam/prefixes/{prefixId}ipam:writeReplace an IPAM prefix. Send the whole prefix; parentId is ignored (a block cannot move).
  • GET /ipam/prefixes/{prefixId}/allocationsipam:readList the address allocations of one prefix, oldest first. Includes released rows unless status=active.
  • POST /ipam/reservationsipam:writeReserve one or more addresses without a server. Already-taken addresses are skipped and returned by name.
  • GET /ipam/vlan-poolsipam:read⚑ ipamAutoAllocation⚑ networkAutomationList the VLAN pools of this account, oldest first.
  • POST /ipam/vlan-pools201ipam:write⚑ ipamAutoAllocation⚑ networkAutomationCreate a VLAN pool on a network fabric. Returns 201 with the pool.
  • DELETE /ipam/vlan-pools/{poolId}ipam:write⚑ ipamAutoAllocation⚑ networkAutomationDelete a VLAN pool. Refuses while any reservation (including released ones) or policy points at it.
  • GET /ipam/vlan-pools/{poolId}ipam:read⚑ ipamAutoAllocation⚑ networkAutomationGet one VLAN pool.
  • PATCH /ipam/vlan-pools/{poolId}ipam:write⚑ ipamAutoAllocation⚑ networkAutomationReplace a VLAN pool. Send the whole pool. The fabric cannot change while reservations are live.
  • GET /ipam/vlan-reservationsipam:read⚑ ipamAutoAllocation⚑ networkAutomationList the VLAN reservations of this account, oldest first. Includes released rows.
  • POST /ipam/vlan-reservations/{reservationId}/actions/set-stateipam:write⚑ ipamAutoAllocation⚑ networkAutomationMove a reservation to another state. Releasing from quarantine takes two steps: release_pending, then released.

Plans

What your customers can order: VPS plans, hosting plans and game plans.

  • GET /plans/gamecatalog:readList the game plans of this account, oldest first.
  • POST /plans/game201catalog:writeCreate a game plan. Returns 201 with the plan.
  • GET /plans/game/{planId}catalog:readGet one game plan.
  • PATCH /plans/game/{planId}catalog:writeReplace a game plan. Send the whole plan, not just the changed fields.
  • POST /plans/game/{planId}/actions/{verb}catalog:writeActivate or deactivate a game plan. Verbs: activate, deactivate.
  • GET /plans/vpscatalog:readList the VPS plans of this account, oldest first.
  • POST /plans/vps201catalog:writeCreate a VPS plan. Returns 201 with the plan.
  • GET /plans/vps/{planId}catalog:readGet one VPS plan.
  • PATCH /plans/vps/{planId}catalog:writeReplace a VPS plan. Send the whole plan, not just the changed fields.
  • POST /plans/vps/{planId}/actions/{verb}catalog:writeActivate or deactivate a VPS plan. Verbs: activate, deactivate.
  • GET /plans/webcatalog:readList the hosting plans of this account, oldest first.
  • POST /plans/web201catalog:writeCreate a hosting plan. Returns 201 with the plan.
  • GET /plans/web/{planId}catalog:readGet one hosting plan.
  • PATCH /plans/web/{planId}catalog:writeReplace a hosting plan. Send the whole plan, not just the changed fields.
  • POST /plans/web/{planId}/actions/{verb}catalog:writeActivate or deactivate a hosting plan. Verbs: activate, deactivate.

Billing

Read-only: subscription, invoices, payments and credit.

  • GET /billing/creditbilling:readRead the prepaid credit balance of this account, in cents.
  • GET /billing/credit/ledgerbilling:readList the credit ledger entries of this account, newest first.
  • GET /billing/invoicesbilling:readList the billing documents of this account, newest first.
  • GET /billing/invoices/{invoiceId}billing:readRead one billing document, including its line items.
  • GET /billing/paymentsbilling:readList the payments of this account, newest first.
  • GET /billing/subscriptionbilling:readRead the subscription of this account: status, capacity and monthly price.

Events

The audit log of this account. Page until nextCursor is null - a short page does not mean the end.

  • GET /eventsactivity:readList audit events of this account, newest first. Page until nextCursor is null; a short page does not mean the end.

Notifications

The inbox of the signed-in member, grouped per subject, plus which categories reach that member over which channel. App sessions only: a notification is addressed to a person, and an API key is a machine secret - use Events for machine access to what happened.

  • GET /notification-preferencesThe notification matrix of the signed-in member: per category, per channel, on or off.
  • PUT /notification-preferencesSet part or all of the notification matrix in one call. Returns the matrix as it now stands.
  • GET /notificationsList the notifications of the signed-in member, grouped per subject, newest first. Page until nextCursor is null.
  • POST /notifications/{notificationId}/readMark one notification as read. Returns the new unread badge count.
  • POST /notifications/read-allMark every unread notification of this member as read. Returns the new unread badge count.
  • GET /notifications/unread-countThe unread badge count of this member: unread subjects, not rows.

Tickets

Support conversations with the Provibr desk. App sessions only: every message has an author, and an API key is a machine secret with no person behind it - use Events for machine access to what happened.

  • GET /ticketsList the support conversations of this account, most recent activity first. Page until nextCursor is null.
  • POST /tickets201Open a support conversation. Returns the ticket including its first message.
  • GET /tickets/{ticketId}One support conversation: the header and the whole thread, oldest message first.
  • POST /tickets/{ticketId}/closeClose a support conversation. Returns the conversation as it now stands.
  • POST /tickets/{ticketId}/messagesReply to a support conversation. Returns the conversation as it now stands.

Webhooks

Endpoints that receive lifecycle events, and the delivery history of each of them.

  • GET /webhook-deliveries/{deliveryId}webhooks:read⚑ lifecycleBindingsRead one webhook delivery, including every attempt that was made.
  • POST /webhook-deliveries/{deliveryId}/actions/cancelwebhooks:write⚑ lifecycleBindingsCancel a delivery. Returns the state reached: cancelled (nothing was sent) or cancel_requested (a request is in flight and its remote effect is unknown).
  • POST /webhook-deliveries/{deliveryId}/actions/resend202webhooks:write⚑ lifecycleBindingsSend an existing delivery again under a NEW delivery ID. The receiver will process the event a second time; this is not a retry.
  • POST /webhook-deliveries/{deliveryId}/actions/retry202webhooks:write⚑ lifecycleBindingsRetry a failed delivery under the same delivery ID. The body and its signature stay byte-identical.
  • GET /webhookswebhooks:read⚑ lifecycleBindingsList the webhook endpoints of this account, oldest first.
  • POST /webhooks201webhooks:write⚑ lifecycleBindingsCreate a webhook endpoint. Returns 201 with the endpoint and the signing secret — shown once and never again.
  • DELETE /webhooks/{webhookId}webhooks:write⚑ lifecycleBindingsDelete a webhook endpoint. Its lifecycle bindings AND its entire delivery history are deleted with it.
  • GET /webhooks/{webhookId}webhooks:read⚑ lifecycleBindingsRead one webhook endpoint, including its full revision history.
  • PATCH /webhooks/{webhookId}webhooks:write⚑ lifecycleBindingsPublish a new revision of a webhook endpoint. Omitted fields are carried over from the current revision.
  • POST /webhooks/{webhookId}/actions/rotate-secretwebhooks:write⚑ lifecycleBindingsRotate the HMAC signing secret. Publishes a new revision and returns the secret once; earlier deliveries stay verifiable with their own key ID.
  • POST /webhooks/{webhookId}/actions/test202webhooks:write⚑ lifecycleBindingsQueue a synthetic test delivery. Returns 202 with a deliveryId; nothing has been sent yet.
  • GET /webhooks/{webhookId}/deliverieswebhooks:read⚑ lifecycleBindingsList the deliveries of one webhook endpoint, newest first.

Devices

The phones and tablets the Provibr app runs on. App sessions only, and a push token is never returned - registering a device is the opt-in for push, forgetting one is the way back.

  • GET /devicesList the devices of the signed-in member, active ones first, including disabled ones.
  • POST /devicesRegister this device for push, or refresh the registration it already has.
  • DELETE /devices/{deviceId}Stop sending push to one of your devices. Returns the device as it now stands.

La descrizione leggibile da una macchina

Le stesse informazioni sotto forma di documento OpenAPI 3.1, generato dal codice che serve questi endpoint invece di essere scritto a parte. Lo passi a un generatore di client, a un editor o a una suite di test.

shell
curl -s https://app.provibr.com/api/v1/openapi.json
Il documento è pubblico e non richiede una chiave: descrive ciò che esiste, non ciò che contiene il suo account.

All’interno di questa versione i cambiamenti sono aggiunte: nuovi endpoint, nuovi campi facoltativi, nuovi valori in un elenco. Legga con tolleranza i campi che non conosce e non tratti come fatale un codice di errore che non conosce.