Works with all AI agents

Connect your AI agent

Choose your AI agent and connect in seconds.

Add to Claude

Works on every Claude plan, including free. Full Claude guide

  1. 1

    Add to Claude

    One click from Claude’s connector directory.

  2. 2

    Sign up or sign in

    Takes seconds, then you’re sent straight back.

  3. 3

    Ask Claude

    “Plan and schedule my posts for next week.”

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. 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

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.