PostEverywhere Token Introspection Reference
Get the current API key context in a single call: organization, scopes, quota, plan, and usage stats.
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
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
{
"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.truewhensubscription_statusisactiveortrialing. Use this as the single source of truth for "should I let this user post?"organization.subscription_source:stripe(default),revenuecatorapple(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:nullfor keys that don't expire.
Using introspection to check quota before posting
Check before generating
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
const me = await client.me.get();
if (!me.organization.entitled) {
// Subscription expired / canceled / past_due
redirect("/billing");
}
Auto-discover organization_id
// 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 · API key basics · rate limits and plan caps · changes to the /v1/me payload · PostEverywhere plans and limits · generate captions with AI
Full reference: GET /v1/me.