Developer Guide · Getting started
API keys & permissions
Every /api/v1 request is authenticated with an API key sent in the X-API-Key header. Here is how to create keys, what they can access, how plans gate them, and how to keep them safe.
Inboxi API keys belong to your organization, not to a person. Each key has a public part that you send with every request and a secret that you use to verify webhooks. Keys are created and revoked by admins in the dashboard.
Create an API key
- 1Open the API Keys tabGo to Settings › Developer Hub › API Keys. You need the developer permission on your role (owners and admins have it).
- 2Click + New API KeyGive the key a name that says where it is used, for example Production backend or Staging, then click Create.
- 3Copy the key and the secretA green panel shows the full key (
inx_live_…) and its secret (sk_live_…). The secret is shown only once. Store both in your secrets manager before you dismiss the panel. - 4Use it from your serverSend the key in the
X-API-Keyheader. After creation the list only shows a masked version of the key, its status and when it was last used.
- 1API Keys tab of the Developer Hub.
- 2+ New API Key opens the name field and Create button.
- 3Webhooks sub-tab: where webhook endpoints are created and tested.
- 4Your keys appear here with a masked value, Active/Revoked status and last-used time.
Key format and the header
| Credential | Format | Used for |
|---|---|---|
| API key | inx_live_ + 48 hex chars | Authenticating API calls in the X-API-Key header |
| Secret | sk_live_ + 48 hex chars | Verifying webhook signatures (X-Inboxi-Signature). Never sent in requests. |
GET /api/v1/contacts?search=ahmed HTTP/1.1
Host: inboxi.app
X-API-Key: inx_live_your_api_key
Content-Type: application/json/api/v1 endpoints read the key only from the X-API-Key header (the alias X-Inboxi-API-Key is also accepted). An Authorization: Bearer header is ignored there and the request fails with 401. Bearer tokens are only used by the SDK session endpoints and the dashboard itself.Permissions
Each key carries a list of permissions. Every endpoint requires one of them; a key without it gets403 with "error": "Missing permission: <name>". Keys created in the dashboard get the default set read, write, webhooks, widget and external_data.
| Permission | Grants | Plan |
|---|---|---|
read | GET endpoints: conversations, messages, contacts, external data queries, registered actions, event list and event status | Growth |
write | Send messages, trigger events, register/update/delete remote actions, delete external data | Growth |
webhooks | Create, list, update, test and delete webhooks under /api/v1/webhooks | Growth |
external_data | Push records to /api/v1/external-data (single and bulk) | Growth |
widget | Embedded widget and mobile SDK session endpoints | Starter |
* | Everything. Use sparingly. | Growth |
Plan gating and FEATURE_LOCKED
Permissions say what a key may do; your plan says what your workspace may do. The developer API (api_access), webhooks and external data are part of the Growth plan and above. Starter workspaces can use the website widget and SDK only. When the plan does not include a feature, the request is rejected before it reaches the endpoint:
HTTP/1.1 403 Forbidden
{
"success": false,
"error": "This feature requires the Growth plan. Upgrade to unlock.",
"code": "FEATURE_LOCKED",
"feature": "api_access",
"currentTier": "starter",
"requiredPlan": "Growth",
"upgradeUrl": "/settings/plans"
}The canonical tier-to-feature map is public, so your own UI can gate features without hard-coding plan names. See Plans & features map.
curl https://inboxi.app/api/subscriptions/features-mapSecurity best practices
- Call the API only from your servers. A key in browser JavaScript, a mobile bundle or a public repository can be extracted and used to message your customers.
- Keep the key and secret in environment variables or a secrets manager, never in source control.
- Create one key per system and environment (production backend, staging, a partner integration) so you can revoke one without breaking the others.
- Watch the Last used time in the key list. A key that is used when you are not expecting it should be revoked.
- Verify every webhook with the secret and reject unsigned or stale payloads (see Webhooks).
- Never log full keys or secrets. Log the masked prefix if you need to tell keys apart.
Rotating and revoking keys
Rotate a key whenever someone who had access leaves, after a suspected leak, or on a fixed schedule.
- 1Create the new keyClick + New API Key and store the new key and secret alongside the old ones.
- 2Deploy itSwitch your services to the new key and confirm requests succeed (its Last used time starts updating).
- 3Revoke the old keyClick Revoke on the old key. It stops working immediately and is shown as Revoked. Delete removes it from the list entirely.
- 4Recreate webhooks if neededA webhook copies the signing secret of your newest active key at the moment it is created. Existing webhooks keep their old secret, so delete and recreate them to move them to the new secret.