Skip to content

Documentation

The REST API

Everything you do in the panel, your own code can do too. One key, one base URL, and exactly the permissions you already have. Nothing here is a shortcut around the panel.

Base URL and authentication

Every path on this page sits behind the base URL below, and every request carries your key in an Authorization header. There is no other way in: no session cookie, no basic auth, no key in the query string.

shell
curl -s https://app.provibr.com/api/v1/me \
  -H "Authorization: Bearer pvk_..."
There is no CORS, and that is deliberate rather than missing. A bearer key in browser JavaScript is a leaked key: every visitor can read it. Call this API from your own backend, never from a page in someone else's browser.
Commands and terminal output are in English everywhere, in the panel and in these pages. One text, one truth: what you read here is literally what your host will print back.

Keys

You create a key on your own profile page, under API keys. It belongs to you and to one account: it is not shared with your colleagues, and it stops working the moment you leave that account.

A key is shown once, when you create it. We store only a hash of it, so a key you lose cannot be recovered. Create a new one and revoke the old.
  • A key expires after 90 days unless you choose otherwise. You can pick a shorter term, or none at all; a key without an end date is a key you have to remember to revoke yourself.
  • Rotating means creating a new key and revoking the old one, with a moment in between where both work. There is no rotation in place, because that leaves you without a working key if anything goes wrong halfway.
  • You can bind a key to a list of addresses. A request from anywhere else is refused before anything is read, and that refusal tells the caller nothing about the key.
  • One member holds at most 25 keys. A revoked key keeps its row, so you can still see afterwards what it was allowed to do while it lived.
Owners and administrators see every key of the account under Settings, with the member each one belongs to. That page is the access review: it is the only place where you see at a glance who can reach this account from outside the panel.

What a key may do

A key carries scopes: read or write, per part of the panel. What it may actually do is the intersection of those scopes and the permissions of the member it belongs to.

A scope never grants more than the member already has. Ticking write access on a key of someone who may not create servers grants that key nothing; it can only narrow what the key is allowed to do.

Permissions are read live, on every request. Withdraw something from a member and every key of that member becomes narrower straight away, without anyone having to revoke anything. That is also why a key survives a role change instead of being invalidated by it.

Anything an agent does takes time

Your infrastructure is reachable only through the agent inside your own network, and that agent connects outbound. So an endpoint that changes a machine cannot answer with the result. It answers that the order was accepted, and hands you something to follow.

  1. You send the request and get an accepted answer, with a Location header pointing at the command that was created. That header is absolute from the host: resolve it against the origin, not against the base URL above, or you end up asking for a path that does not exist.
  2. That same command is in the body as well, but wrapped in a command field. The read below returns it bare, without that wrapper: unwrap once and the first read is usually unnecessary.
  3. You read the command until its status is final: done, failed, timed out or cancelled. Only pending is not final, and a status you do not recognise counts as final too, so a value added later can never leave you polling forever.
  4. A command that failed carries the error code of the agent itself, with its arguments, the same ones the panel renders on your screen.
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_..."
Reading never works this way. An inventory, an address or an invoice answers immediately, because that answer comes from our database and not from your host.

What comes back

Every endpoint says what it answers with: 200 for a read, 201 for something that was created, 202 for work your agent still has to carry out. And every one of them describes the body it returns, with a name of its own per resource, so the code you generate holds one type per resource instead of one per endpoint.

Read what comes back leniently. Inside this version we only add, so a field you do not know may appear. Rejecting it would turn our promise of additive change into a breaking one on your side. What you send is judged strictly: a field name with a typo is refused rather than quietly ignored.

Paging

Lists answer with a page and a cursor; you pass that cursor back until it comes out empty. A page holds 50 rows by default and 100 at most.

Never stop on a short page. Some lists filter row by row after reading, on your permissions or on what a provider is capable of, and legitimately return fewer rows than you asked for while there is more to come. The cursor is the only end signal.

Errors

Every answer that is not a success has the same shape, whatever went wrong and wherever it went wrong.

json
{
  "error": {
    "code": "validation_failed",
    "message": "Name is too long (max 64).",
    "detail": "server.validation.apiKeys.nameTooLong",
    "params": { "max": 64 },
    "requestId": "3f9c1b2a-..."
  }
}
code
The word to branch on. It comes from a closed list, so a value you do not know means you are talking to a newer version than the one you built against.
message
One English sentence, for whoever reads a log. Never branch on it: the wording is free to change.
detail
A stable key, where there is one. It is the same key the panel uses for its own message, so you can put the sentence in your own language.
params
The arguments belonging to that key: a limit that was exceeded, a name that was taken, the host that refused.
requestId
The identifier of this request, also in a response header. Quote it when you ask us about something.
There is nowhere a status that says "exists but not yet built". A path this version does not offer is a plain not-found, because a roadmap is not something an error message should give away.
A not-found means one of two things, and the stable key tells you which. Either this part of the API is switched off here, or the resource is not in your account. That second one deliberately covers both an id that does not exist and one you may not see, because telling those apart would let anyone probe for rows they have no business knowing about.

How much you may ask

You may make 120 requests per minute per key, and 600 per account across all of its keys. That second limit exists so twenty keys cannot put twenty times the load on the same host.

Every answer tells you the limit, how much of it is left and when the window resets. A refusal adds how long you should wait; obey that number rather than a delay of your own choosing.

Repeating a request safely

Anything that creates something accepts a idempotency-key header of your own making. Repeat the same request with the same value and you get the first outcome back, instead of a second machine, a second key or a second command.

Reusing that value for a different request is refused on purpose. A key that means two things means nothing, and the alternative, quietly doing the second thing as well, is how you end up with a machine nobody ordered.

You may also send your own x-request-id. It comes back on the answer and appears in our logs, which is the cheapest way to lay a line from your side next to a line from ours.

Providers

There is not a single provider name in the routing of this API. Which systems you can connect, which fields their credentials take and what they are capable of is answered by the discovery endpoint, and the body you send to create an integration is built from that same register. A provider that goes live shows up in both without a single endpoint changing.

It works the other way around too. Ask something of a machine whose provider cannot do it (a console on a hosting account, a disk on a game server) and you get a refusal that names the missing capability, before anything is sent to your agent.

Every endpoint

Grouped the way the specification groups them. Each path comes after the base URL, and next to it stands the scope the endpoint requires; where nothing stands, a valid key is enough.

This list is a quotation and therefore stays in English in every language: the paths, the scopes and the summaries are literally what the specification says, and translating them would show you a word other than the answer you get.
A few parts sit behind a rollout switch, and the description covers them whether the switch is on or off, so one generated client works against every installation. Which switch an endpoint needs is written beside it; whether this installation has it on is in the machine-readable description below. With the switch off the path answers not-found, and there is no key and no role that turns one on.

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.

The machine-readable description

The same information as an OpenAPI 3.1 document, generated from the code that serves these endpoints rather than written alongside it. Hand it to a client generator, an editor or a test suite.

shell
curl -s https://app.provibr.com/api/v1/openapi.json
The document is public and needs no key: it describes what exists, not what your account holds.

Within this version, changes are additions: new endpoints, new optional fields, new values in a list. Read fields you do not know leniently, and do not treat an error code you do not know as fatal.