Skip to content

Examples use fictional data. Every company, person, address and count in them is invented, and their domains use the reserved .example TLD.

Getting started

Workspace & API keys

Mint and revoke machine credentials, rename the workspace, and see who else is in it.

GET/v1/api-keys

List API keys

Every key ever issued for the workspace, revoked ones included. Secrets are never returned here.

API key or sessionNo credit charge
curl "https://beamro.com/api/v1/api-keys" \
  -H "x-api-key: $SALVO_API_KEY"
200 response
{
  "rows": [
    {
      "id": "key_2m8v0qz4rt7y1c6h3s",
      "org_id": "org_4k1p8w2ne6ts0ybc7j",
      "name": "production",
      "prefix": "sk_live_9f4a2c",
      "last_used_at": "2026-08-31T09:41:12.000Z",
      "created_at": "2026-07-02T14:20:00.000Z",
      "revoked_at": null
    },
    {
      "id": "key_9j3c7x1lp0aw5du2fk",
      "org_id": "org_4k1p8w2ne6ts0ybc7j",
      "name": "staging",
      "prefix": "sk_live_31c8be",
      "last_used_at": null,
      "created_at": "2026-07-02T14:20:00.000Z",
      "revoked_at": "2026-08-04T08:00:00.000Z"
    }
  ]
}
POST/v1/api-keys

Create an API key

Returns the key record plus the one and only copy of the secret. Store it before you close the response.

Session token onlyNo credit charge

Body parameters

FieldTypeDescription
namereqstringHuman label — where this key runs, so you can revoke the right one later.
curl -X POST "https://beamro.com/api/v1/api-keys" \
  -H "authorization: Bearer $SALVO_ACCESS_TOKEN" \
  -H "content-type: application/json" \
  -d '{
    "name": "production"
  }'
200 response
{
  "key": {
    "id": "key_2m8v0qz4rt7y1c6h3s",
    "org_id": "org_4k1p8w2ne6ts0ybc7j",
    "name": "production",
    "prefix": "sk_live_9f4a2c",
    "last_used_at": null,
    "created_at": "2026-08-31T11:19:44.000Z",
    "revoked_at": null
  },
  "secret": "sk_live_9f4a2c7e10b6k3vqx8m2yd"
}
DELETE/v1/api-keys/{key_id}

Revoke an API key

Takes effect on the next request. In-flight requests are allowed to finish.

Session token onlyNo credit charge

Path parameters

FieldTypeDescription
key_idreqstringIdentifier of the key to revoke.
curl -X DELETE "https://beamro.com/api/v1/api-keys/key_9j3c7x1lp0aw5du2fk" \
  -H "authorization: Bearer $SALVO_ACCESS_TOKEN"
200 response
{
  "ok": true
}
PATCH/v1/org

Rename the workspace

Updates the display name and URL slug. Slugs are unique and lower-cased on the way in.

API key or sessionNo credit charge

Body parameters

FieldTypeDescription
namestringDisplay name shown in the dashboard and on invoices.
slugstringURL-safe identifier, unique across Salvo.
curl -X PATCH "https://beamro.com/api/v1/org" \
  -H "x-api-key: $SALVO_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "name": "Harlow Meadow Events",
    "slug": "harlow-meadow"
  }'
200 response
{
  "id": "org_4k1p8w2ne6ts0ybc7j",
  "name": "Harlow Meadow Events",
  "slug": "harlow-meadow",
  "plan": "growth",
  "credit_balance": 38420,
  "email_balance_cents": 3000,
  "trial_granted": true,
  "created_at": "2026-08-31T11:04:02.000Z"
}
GET/v1/org/members

List members

Users with access to the workspace and the role each one holds.

API key or sessionNo credit charge
curl "https://beamro.com/api/v1/org/members" \
  -H "x-api-key: $SALVO_API_KEY"
200 response
{
  "rows": [
    {
      "id": "usr_7d2m41ka9xq0zv3b8n",
      "email": "priya@harlowmeadow.example",
      "name": "Priya Whitcombe",
      "avatar_url": null,
      "email_verified": true,
      "created_at": "2026-08-31T11:04:02.000Z",
      "role": "owner"
    },
    {
      "id": "usr_1c9x4vb7mn2q8kd0er",
      "email": "theo@harlowmeadow.example",
      "name": "Theo Bannister",
      "avatar_url": null,
      "email_verified": true,
      "created_at": "2026-08-12T09:00:00.000Z",
      "role": "member"
    }
  ]
}
POST/v1/org/invites

Invite a teammate

Creates a join link (no email is sent — pass the link on yourself). A new person signs up through it, with the invited address, and joins this workspace instead of creating one; someone who already has an account signs in through it and accepts. Nobody is added without that step. The link expires in 7 days; inviting the same address again replaces it.

API key or sessionNo credit charge

Body parameters

FieldTypeDescription
emailreqstringAddress to invite.
rolereqstringOne of owner, admin, member, viewer.
curl -X POST "https://beamro.com/api/v1/org/invites" \
  -H "x-api-key: $SALVO_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "email": "theo@harlowmeadow.example",
    "role": "member"
  }'
200 response
{
  "ok": true,
  "joined": false,
  "invite_id": "inv_7q2m4x9c1v8b3n6k0z5r2t",
  "invite_url": "https://app.example.com/signup?invite=itk_4v1x0q9d2m7k3s8a5c6e1f&email=theo%40harlowmeadow.example"
}