# PostEverywhere Token Introspection Reference > Get the current API key context in a single call: organization, scopes, quota, plan, and usage stats. **Source:** https://posteverywhere.ai/docs/introspection **Section:** Core concepts **API reference:** https://posteverywhere.ai/docs/api/reference --- Returns everything an SDK or MCP client needs to know about itself: which organization it belongs to, what scopes its API key has, what plan the org is on, and where it stands against the plan's limits. **Call this first** when initializing your integration. It eliminates the need to hardcode `organization_id` in config and lets your app surface "you've used 38 / 50 AI credits this month" without listing every generation. ## Inspect the key making the request: `GET /v1/me` ```bash curl https://app.posteverywhere.ai/api/v1/me \ -H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" ``` Requires `read` scope. Counts against the API rate limit. ## What introspection tells you about your key ```json { "api_key": { "id": "fb382fa0-...", "key_prefix": "pe_live_4f3c9a2b", "name": "Production server", "scopes": ["read", "write", "ai"], "last_used_at": "2026-06-11T05:30:00Z", "created_at": "2026-04-01T...", "expires_at": null }, "scopes": ["read", "write", "ai"], "user": { "id": 8476, "email": "info@example.com", "name": "Netanel" }, "organization": { "id": "56cb4496-...", "name": "Sweeppy Inc.", "subscription_plan": "GROWTH", "subscription_status": "active", "subscription_source": "stripe", "trial_end": null, "current_period_end": "2026-07-11T...", "cancel_at_period_end": false, "entitled": true }, "workspace": { "id": "ea0589e2-...", "name": "Marketing" }, "quota": { "accounts": { "used": 6, "limit": 25 }, "ai_credits": { "used": 138, "limit": 500, "bonus": 0 }, "storage_bytes": { "used": 4283392104, "limit": 53687091200 }, "team_seats": { "limit": 5 } }, "stats": { "posts_last_30d": 214, "total_posts": 832 } } ``` ## Fields worth reading closely - **`organization.subscription_plan`**: the internal plan key, which is **not** the display name: `LITE` = Lite, `SOLO` = Starter, `STARTER` = Growth, `GROWTH` = Scale. Match on the key, never on the marketing name. - **`organization.entitled`**: derived boolean. `true` when `subscription_status` is `active` or `trialing`. Use this as the single source of truth for "should I let this user post?" - **`organization.subscription_source`**: `stripe` (default), `revenuecat` or `apple` (iOS in-app purchase). - **`quota.ai_credits.bonus`**: credits purchased via the credit-pack flow, added on top of the monthly allotment. - **`api_key.expires_at`**: `null` for keys that don't expire. ## Using introspection to check quota before posting ### Check before generating ```ts const me = await client.me.get(); if (me.quota.ai_credits.limit - me.quota.ai_credits.used < 5) { showUpgradePrompt(); return; } await client.ai.generateImage({ prompt: "..." }); ``` ### Surface entitlement state ```ts const me = await client.me.get(); if (!me.organization.entitled) { // Subscription expired / canceled / past_due redirect("/billing"); } ``` ### Auto-discover organization_id ```ts // In your SDK init — no need to ask the user for org_id. const me = await client.me.get(); this.organizationId = me.organization.id; ``` **Related:** [what each scope allows](/docs/scopes) · [API key basics](/docs/authentication) · [rate limits and plan caps](/docs/rate-limits) · [changes to the /v1/me payload](/docs/changelog) · [PostEverywhere plans and limits](/pricing) · [generate captions with AI](/docs/generate-caption) Full reference: [GET /v1/me](/docs/api/get-me).