Revoke Token
OAuth
Revoke Token
Invalidate an access token (and its paired refresh token)
POST
Revoke Token
Documentation Index
Fetch the complete documentation index at: https://docs.launchmystore.io/llms.txt
Use this file to discover all available pages before exploring further.
Revoke Token
Revokes an OAuth access token. The endpoint follows RFC 7009 semantics: revocation is idempotent and silent — unknown or already-revoked tokens still return200 success. On a successful revoke the server:
- Locates the
AppInstallationthat owns thisaccessToken. - Blacklists both the access token and its paired refresh token (SHA-256 hashed in Redis with a 31-day TTL).
- Clears
accessToken,refreshToken,tokenExpiresAt, andrefreshTokenExpiresAtcolumns on the installation row.
status remains
active. The merchant must call POST /apps/store/uninstall/:appId for
a full uninstall.
This endpoint is rate-limited to 5 requests per minute per IP.
Request
Body Parameters
The access token to revoke. Refresh tokens cannot be revoked
directly — passing one returns
200 (silent no-op) because no
installation row matches a refresh token in the accessToken lookup.
To kill a refresh token, revoke its paired access token (which
blacklists both) or wait 30 days for natural expiry.Response
Always 200.
Always
success.Token revoked successfully. Returned for both genuine revocations and
unknown tokens (RFC 7009 §2.2 idempotency).Example Response
What gets revoked
When the server finds an installation matching the supplied access token, both tokens on that row are blacklisted and cleared in a single update:Field on AppInstallation | Before | After |
|---|---|---|
accessToken | lms_token_... | NULL |
refreshToken | lms_refresh_... | NULL |
tokenExpiresAt | <24h from now> | NULL |
refreshTokenExpiresAt | <30d from now> | NULL |
Redis token_blacklist:<sha256(accessToken)> | – | set, TTL 31d |
Redis token_blacklist:<sha256(refreshToken)> | – | set, TTL 31d |
When to revoke
- User-initiated sign-out of your app’s embedded UI.
- Compromised token suspicion — pair with rotating
client_secretviaPOST /apps/developer/:appId/regenerate-secret. - Switching environments between dev/staging/prod for the same app installation.
POST /apps/store/uninstall/:appId.
Ending a session (alternatives)
| Operation | Endpoint | Effect |
|---|---|---|
| Revoke current token only | POST /apps/oauth/revoke | Both tokens blacklisted; installation kept. |
| Rotate refresh token | POST /apps/oauth/token with grant_type=refresh_token | Old refresh token auto-blacklisted; new pair issued. |
| Uninstall app | POST /apps/store/uninstall/:appId | Installation row deleted (or status → pending-uninstall); extension files removed from disk; uninstall webhooks dispatched. |
| Re-authenticate | GET /apps/oauth/authorize → POST /apps/oauth/token | Reuses the same installation row; new tokens overwrite old ones. |
Error Codes
| HTTP | Error message | When |
|---|---|---|
200 | Token revoked successfully | Always returned — including for unknown tokens (RFC 7009 idempotency). |
429 | (throttler) | More than 5 requests/minute from this IP. |
500 | (generic) | Redis or DB write failed. The token may or may not be revoked — retry. |
Security Notes
- Token blacklist entries live in Redis for 31 days — one day longer than the longest possible refresh-token lifetime — so a revoked token can never come back via a stale cache.
- The blacklist key is
token_blacklist:<sha256(token)>. The raw token is never persisted to Redis, only its hash. - This endpoint has no auth requirement beyond rate limiting — anyone
holding a valid access token can revoke it. This is intentional: a
leaked token should be invalidatable from any environment without
needing the original
client_secret.