Skip to main content
An API key carries a list of scopes. Scopes are the same permission names your dashboard roles use, so a key with campaigns.edit can do what a teammate with “Campaigns: Edit / run” can do.

How scopes combine

  • edit and delete include view. A key with agents.edit can also read agents.
  • Some special scopes include others:
  • A key never exceeds the member it acts for. Its effective permissions are its scopes intersected with that member’s current role. Narrowing the member’s role narrows the key from the next request.
  • Each endpoint page in the API reference shows the scope it requires.
When a key lacks a permission, the request fails with:

All scopes

Keys without scopes

Keys issued before scopes were introduced carry no scopes. They keep full access to the /v1 endpoints, with no scope checks, and every other endpoint refuses them with 403 api_key_not_scoped. To use the rest of the API, ask Pineyard for a key with scopes.

Scopes a key can never have

These stay with people signed in to the dashboard. A key is never issued with them, and a key that somehow holds one does not get it.

Actions keys can never take

Some endpoints act as a specific person or need a browser, so they refuse API keys with 403 api_key_not_allowed whatever the scopes:
  • signing in to third-party services (calendar, sheets, CRM and integration connections),
  • WhatsApp sender signup and QR connection, and reserving WhatsApp numbers,
  • buying phone numbers and identity verification,
  • wallet top-ups and payment details,
  • removing a number from the Do Not Call list,
  • chatbot test chats,
  • editing the shared home dashboard,
  • reading or attaching arbitrary spreadsheets,
  • personal profile, onboarding and notifications,
  • all email features, including creating, starting or resuming a campaign whose channel is EMAIL.

Stricter permissions for keys

A few endpoints sit behind a view permission in the dashboard but change data. API keys need the stronger permission shown here. The 403 names it in requiredPermission.

Choosing scopes