.dev
Apps & OAuth

Apps & OAuth overview

Register OAuth clients and let Feeef users grant your integration scoped access.

Feeef implements OAuth 2.0 authorization code (RFC 6749) with PKCE (RFC 7636), plus token revocation (RFC 7009) and introspection (RFC 7662). Users grant your application access on the familiar consent screen; your app receives a token carrying exactly the scopes they approved.

The two hosts

HostRoleEndpoints
accounts.feeef.orgHuman-facing: sign-in + consent UIGET /oauth/authorize
api.feeef.org/v1Machine-facing: token operationsPOST /oauth/token, /oauth/revoke, /oauth/introspect

The address bar shows the accounts domain during authorization — like signing in with Google. (Opening authorize on the API host still works; it 302-redirects to accounts.)

Apps

An app is your registered OAuth client. Manage apps in the dashboard or via the API:

MethodPathNotes
POST/appsCreate — returns clientId and clientSecret once
GET/appsList your apps (paginated, supports filterator)
GET/apps/:idDetail
PUT/apps/:idUpdate name, redirectUris, scopes, active, logoUrl, tokenEndpointAuthMethod
DELETE/apps/:idDelete (revokes nothing retroactively — revoke tokens separately if needed)
POST/apps/:id/regenerate-secretNew secret, shown once; the old secret stops working immediately

App registration fields:

FieldRules
name2–100 chars, shown on the consent screen
redirectUris[]Exact-match allowlist, absolute URIs, no wildcards
scopes[]The maximum scopes the app may ever request — see Scopes
logoUrlOptional public HTTPS image, shown as the consent-screen avatar
tokenEndpointAuthMethodclient_secret_post (confidential, default) or none (public + PKCE)
activeInactive apps refuse new authorizations

Public vs confidential clients

Client typetokenEndpointAuthMethodToken requestPKCE
Confidential — server-side web app, backend jobclient_secret_postSends client_secretRecommended
Public — SPA, mobile app, CLInoneNo secretRequired (S256)

Never embed a client secret in code you ship to users (browser bundles, mobile apps, CLIs). If your code runs on the user's device, register a public client and use PKCE. The official @feeef.dev/cli is a public client.

Token properties

A successful exchange returns:

{
  "access_token": "oat_...",
  "token_type": "Bearer",
  "expires_in": 7776000,
  "scope": "auth store.read products.read"
}
  • Tokens are opaque, live 90 days, and carry the consented scopes as abilities.
  • The token row records the issuing app_id — this is what gates per-user app data and lets users see "connected apps".
  • There are no refresh tokens — on 401, run the flow again.

Lifecycle endpoints

PurposeCall
Revoke a token (sign-out)POST /oauth/tokenPOST /oauth/revoke with form body token=...{ "revoked": true }
Check a tokenPOST /oauth/introspect with token=...{ "active": true, "scope": "...", "exp": ... }
User-side: list authorized appsGET /users/auth/connected-apps (shown in the dashboard)

Next

On this page