Choose your order
If the key may have been exposed publicly, in a commit, a log, a screenshot, or a support thread, revoke first and accept the outage. Every minute the key stays active is a minute someone else can post to your ledger. A key carries the roles it was given rather than the permissions of whoever finds it, so the blast radius is whatever you scoped it to on the day you issued it. Otherwise, for a lost key or a scheduled rotation, cut over first and revoke last. There is no downtime, because two keys for the same integration can be live at once. Nothing in DualEntry limits how many keys an organization holds or ties them to a single consumer. If you are unsure which case you are in, treat it as exposure. Reissuing costs one deploy; an active key in a public repository costs whatever an attacker can do with its roles before someone notices.Cut over first (lost key or routine rotation)
1
Issue the replacement
Go to Settings → Organization → Developer access → API Keys and create a new key with the same roles as the old one. Names must be unique, so give it a name that distinguishes the two, then copy the key from the dialog. See How to Give an Integration Access to DualEntry for the full sequence.
2
Update the secret
Replace the value in your environment variables, secret manager, and CI configuration, then deploy or restart so the running process picks it up.
3
Confirm traffic has moved
Check the Last Used column on both rows. The new key should show today’s date. The column is date-only and updates lazily, so it will not tell you the old key went quiet an hour ago, only that it has not been used since some earlier day. If you need certainty on the same day, wait until the following day and confirm the old key’s date has stopped advancing before you revoke. Otherwise revoke knowing that a straggler will fail loudly rather than silently.
4
Revoke the old key
Select the ⋮ menu on the old key’s row and choose Revoke API Key. It takes effect at once, with no confirmation prompt.
Revoke first (suspected exposure)
1
Revoke immediately
On the exposed key’s row, select the ⋮ menu and choose Revoke API Key. There is no confirmation step. Calls using it start failing with
403 and API key authentication failed at once.2
Issue a replacement and cut over
Create a new key with the same roles, update the secret, and redeploy. The integration is down until this completes.
3
Clean up the exposure
Purge the key from wherever it leaked. Rewriting a commit is not enough on its own if the repository was pushed or forked, which is why the revocation comes first.
4
Check what was done with it
Review the audit trail and look for entries whose actor reads API Key. Those are the actions taken through the Public API while the key was live. The audit trail does not name which key acted, so if several keys were active you will need to reason from the records themselves, and from the create, update, and revoke entries recorded against the keys.
If something goes wrong
Calls fail after the cutover withAPI key authentication failed. Something is still holding the old value, or the new one was copied with surrounding whitespace. Check that the deploy actually restarted the process, then print the first characters of the variable your client reads and confirm it matches the new key’s prefix in the API Keys table.
Calls fail after the cutover with Access denied. The replacement authenticated but was created with different roles from the original. Compare the Roles column on the two rows and use Edit on the new key to match; you do not need to reissue.
You revoked the wrong key. Revocation is one-way and there is no undo. Create a replacement with the same roles and cut the affected integration over to it.
The old key’s Last Used date keeps advancing. Another consumer is still on the old value. Check other environments, scheduled jobs, CI configuration, and local developer machines before you revoke, since revoking will take all of them down at once.
Keep replacement cheap
Rotation hurts in proportion to how many systems share a key. If this replacement was painful, issue one key per integration next time so the next rotation touches one config file instead of several. The same goes for scope. A key that holds Admin because it was quicker than picking roles turns every future rotation into a security review, because nobody can tell from the key table what it was actually used for. A narrowly scoped key is one you can revoke without a meeting. Naming helps as much as scoping.billing-service-prod tells the next person which system breaks if they revoke it; api-key-2 tells them nothing, so the safe move becomes leaving it alone. Since names are unique per organization and revoked keys keep theirs, a convention that includes the consumer and the environment survives several rotations without collisions.
Finally, write down where the key is stored at the moment you hand it over. Most of the time spent on an urgent rotation goes into finding every config that holds the old value, not into clicking Revoke.
Next steps
- How to Give an Integration Access to DualEntry
- How to Authenticate Your Requests to the DualEntry API
- Authentication for statuses and error responses
