Installs & OAuth
The authorization code flow with PKCE, step by step.
Merchants install your app through OAuth 2.0 — authorization code with PKCE. No client secret is ever needed in a browser.
1. Send the merchant to consent
https://spuke.com/oauth/authorize
?client_id=app_live_123
&redirect_uri=https://yourapp.com/callback
&response_type=code
&scope=merchant:read%20payments:read
&state=<random>
&code_challenge=<base64url(sha256(verifier))>
&code_challenge_method=S256
The merchant sees your icon, name and a plain-language list of every scope with its risk level, then approves or declines.
2. Exchange the code
curl -X POST https://api.spuke.com/v1/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"code": "ac_…",
"redirect_uri": "https://yourapp.com/callback",
"client_id": "app_live_123",
"code_verifier": "…"
}'
{
"access_token": "spat_live_…",
"refresh_token": "sprt_live_…",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "merchant:read payments:read",
"installation_id": "inst_live_7c1f92a8",
"mode": "live"
}
Store the tokens per installation, never globally.
3. Refresh
{ "grant_type": "refresh_token", "refresh_token": "sprt_live_…", "client_id": "app_live_123" }
Refresh tokens rotate: the response contains a new refresh token and the old one dies. If a refresh returns invalid_grant, treat the installation as gone and stop calling.
Redirect URI rules
- HTTPS only, exact match, no wildcards.
http://localhostis allowed in test mode. - Up to five URIs per app.
- Changing a URI on a published app requires a new version.
Uninstall
When a merchant uninstalls, tokens are revoked immediately and you receive an installation.uninstalled webhook. Delete the merchant's data within 30 days unless law requires otherwise.
Suspension
If a merchant is suspended, API calls for that installation return 403 installation_suspended. Back off and retry later — do not delete data on a suspension.