Pulse IntelligenceAPI Docs

Authentication

How to create and use an organization API key

The public API authenticates your organization, not an individual user. Every request carries a single organization API key in the Authorization header, and everything that key touches — data, quotas, rate limits — is scoped to your org, not to whoever created the key.

Creating a key

Only an organization admin can create or revoke API keys, from the Pulse product UI under Settings → API Keys. Because a key is a standing credential, both creating and revoking one require a fresh sudo MFA re-verification — if your MFA session has lapsed, you'll be asked to re-verify before the action goes through.

When you create a key, the full plaintext value is shown to you exactly once, at creation time. Copy it immediately and store it somewhere safe (a secrets manager or environment variable) — Pulse never stores or displays the plaintext again. If you lose it, the only recovery is to revoke the key and create a new one.

Key format

A key looks like:

pulse_<8-hex-char prefix>_<secret>

For example, pulse_a1b2c3d4_<...>. The 8-character hex prefix isn't secret — it's shown next to the key's name in Settings → API Keys so you can identify which key is which without ever seeing the full secret again.

Using a key

Send the key as a bearer token on every request:

Authorization: Bearer pulse_a1b2c3d4_<secret>
curl https://api.pulseintelligence.com/v1/companies/search/ \
  -H "Authorization: Bearer pulse_a1b2c3d4_<secret>" \
  -H "Content-Type: application/json" \
  -d '{"filters": []}'

The trailing slash is required — the API doesn't redirect a slash-less path, it 404s. Always call /v1/companies/search/, never /v1/companies/search.

Keys only work on /v1/ endpoints — they're rejected everywhere else, and conversely, the JWT tokens used elsewhere in the Pulse product are rejected on /v1/. The two auth mechanisms don't overlap.

Authentication failures

A missing header, a malformed key, an unknown key, and a revoked key all produce the same generic 401:

{ "detail": "..." }

This is deliberate: the response never tells a caller why authentication failed, so a probing request can't distinguish "this key doesn't exist" from "this key was revoked" from "you got the format wrong." Note this is DRF's stock error body, not the {"error": {"code", "message"}} envelope used elsewhere on the API — see Rate limits and errors for that envelope and the other error shapes you'll encounter.

Revoking a key

Revocation takes effect immediately — a revoked key stops authenticating on its very next use. Revoking is also idempotent: revoking an already-revoked key is a no-op, not an error.

Rotating a key

There's no in-place "regenerate" — rotate by creating a new key, updating your integration to use it, and then revoking the old one once you've confirmed the new one works. Because both steps need sudo MFA, plan a rotation as a deliberate, hands-on-keyboard action rather than something you automate unattended.

Security guidance

  • Treat a key like any other server-side secret: never embed it in client-side code, a mobile app, or anything a user's browser can read.
  • Store it in an environment variable or secrets manager, not in source control.
  • Because a key authenticates the whole organization, anyone who has it can act as your org against every /v1/ endpoint — scope who has access to the value accordingly.
  • If a key is ever exposed, revoke it immediately and create a replacement.

On this page