All API requests are authenticated using API keys passed in the X-API-Key
header.
Verifa supports two types of API keys:
Secret keys are used for server-side API calls. They have full access to your configured scopes and should never be exposed in client-side code.
A sandbox key can only access sandbox resources, and a live key can only access live resources.
Each API key is granted a set of scopes that control which endpoints it can
access. Scopes follow the resource:action pattern.
These scopes are granted to all new API keys at creation time:
These scopes must be explicitly added when creating or editing an API key. They’re not granted by default. The “Provision an API key” deep-link on the AI Integrations dashboard page can pre-fill the right set for a given MCP connection.
Several endpoints accept either the new specific scope or the older broad scope it was split from. Keys minted before the scope split keep working unchanged, and integrations can migrate at their own pace. A non-exhaustive list:
We recommend pinning new keys to the specific scope rather than the broad one, so future endpoint additions don’t quietly inherit access.
Dashboard sessions are cookie-based (vk_org_token, 8h). The dashboard
extends an active session by calling:
This endpoint is used internally by the dashboard SPA and isn’t required for
server-to-server API access (which uses X-API-Key).
SAML SP-initiated sign-in (the user starts at Verifa and is redirected to their IdP) is enabled by default for SSO-configured organizations.
SAML IdP-initiated sign-in (the user launches Verifa from an Okta or Azure AD tile) is opt-in per organization and disabled by default. Contact support to enable it for your org.
For additional security, you can restrict API key usage to specific IP addresses or CIDR ranges. Contact support to configure IP allowlisting for your organization.
If the API key is missing or invalid, the API returns 401 Unauthorized:
If the key lacks the required scope for an endpoint, the API returns
403 Forbidden. The detail names every scope that would have allowed
the call (multiple scopes are joined with ” or ”):