Account Context
Read the plan, available features, publishing quotas, schedule horizon and allowed platforms of the account behind your API key. Call it before a batch of posts and again after a quota or feature error, so your integration knows how many platform posts it can still publish and how far ahead it can schedule.
The response is a read-only, advisory snapshot: it reserves nothing, and every write is still checked against the limits when it is made. The MCP tool account_context returns the same object.
Endpoint
GET https://api.publora.com/api/v1/account-contextHeaders
| Header | Required | Description |
|---|---|---|
x-publora-key |
Yes | Your API key |
x-publora-user-id |
No | Managed user ID (workspace keys only). Returns that user's context instead of the key owner's. |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
scheduledTime |
string | No | ISO 8601 date-time with Z or an explicit offset, e.g. 2026-11-03T09:00:00Z or 2026-11-03T10:00:00+01:00. Selects the monthly quota period of a planned batch. Omit it for the current period. |
scheduledTimeonly selects the quota period. A past time resolves to the current period, andeffectiveQuotaTimein the response shows the date that was used. It does not make a past schedule valid:create-postandupdate-poststill apply their own rules to the time you send.
Response
{
"success": true,
"context": {
"plane": "personal",
"actorUserId": "665f1c2ab3e4d5f6a7b8c9d0",
"snapshotAt": "2026-10-02T08:37:17.484Z",
"serverTime": "2026-10-02T08:37:17.484Z",
"effectiveQuotaTime": "2026-10-02T08:37:17.484Z",
"plan": { "key": "starter", "name": "Starter", "source": "starter" },
"features": {
"publishing": true,
"apiAccess": true,
"mcpAccess": true,
"analytics": false,
"mentionables": false
},
"quotas": {
"monthlyPosts": {
"metric": "posts.platform_monthly",
"scope": "account",
"usageScope": "legacy_workspace",
"unit": "platform_post",
"limit": 15,
"used": 4,
"remaining": 11,
"periodStart": "2026-10-01T00:00:00.000Z",
"periodEnd": "2026-11-01T00:00:00.000Z",
"resetAt": "2026-11-01T00:00:00.000Z",
"periodTimeZone": "UTC",
"connections": []
},
"scheduledPosts": {
"metric": "posts.scheduled_active",
"scope": "account",
"usageScope": "legacy_workspace",
"unit": "platform_post",
"limit": 3,
"used": 1,
"remaining": 2,
"resetAt": null
},
"scheduleHorizon": {
"metric": "posts.schedule_horizon_days",
"unit": "day",
"limit": 7,
"maxScheduledDate": "2026-10-09T23:59:59.999Z",
"resetAt": null
},
"connections": {
"metric": "connections.total",
"scope": "account",
"usageScope": "legacy_workspace",
"unit": "channel",
"limit": 3,
"used": 2,
"remaining": 1
}
},
"allowedPlatforms": ["threads", "bluesky", "mastodon", "tiktok", "instagram", "youtube", "linkedin", "facebook", "pinterest", "telegram"],
"advisory": true
}
}This Starter account has 11 of its 15 platform posts left this month (the count starts over at resetAt), room for 2 more scheduled platform posts, a schedule horizon that ends on 2026-10-09, and no X (twitter) in allowedPlatforms.
Response fields (inside context)
| Field | Type | Description |
|---|---|---|
plane / actorUserId |
string | Always personal, and the ID of the user the snapshot describes |
snapshotAt / serverTime |
string | When the snapshot was taken |
effectiveQuotaTime |
string | The date used to select the monthly quota period |
plan |
object | key, name and source of the plan in effect |
features |
object | true or false for publishing, apiAccess, mcpAccess, analytics (needed by Mastodon and Bluesky Statistics) and mentionables (needed by LinkedIn Mentionables) |
quotas.monthlyPosts |
object | Platform posts in the monthly period: limit, used, remaining, periodStart, periodEnd, resetAt (the end of the period), periodTimeZone, and connections[] for per-connection limits |
quotas.scheduledPosts |
object | Platform posts waiting to publish at a future time, against the plan's queue limit: limit, used, remaining. Posts sent with publishNow are not counted. resetAt is null. |
quotas.scheduleHorizon |
object | limit in days and maxScheduledDate, the latest time a post can be scheduled (null when there is no horizon). resetAt is null. |
quotas.connections |
object | Connected channels: limit, used, remaining |
metric, scope, usageScope, unit |
string | Identify each quota. unit is platform_post, day or channel; scope is account (one shared limit) or connection (a limit for each connection) |
allowedPlatforms |
string[]/null | Platform types the plan allows; null means all platforms |
advisory |
boolean | Always true: the snapshot reserves nothing |
Units are platform posts. A post to three platforms uses three from
monthlyPosts, and three fromscheduledPostswhile it waits to publish.limit: nullmeans unlimited.
Per-connection limits. When
quotas.monthlyPosts.scopeis"connection", the limit applies to each connection separately. Readquotas.monthlyPosts.connections[]: each entry hasplatformSelection(the connection ID you pass tocreate-post),used,limitandremaining. The aggregateremainingisnullin that case, which does not mean unlimited.
Examples
cURL
curl https://api.publora.com/api/v1/account-context \
-H "x-publora-key: YOUR_API_KEY"
# Quota period of a batch planned for November
curl "https://api.publora.com/api/v1/account-context?scheduledTime=2026-11-03T09:00:00Z" \
-H "x-publora-key: YOUR_API_KEY"JavaScript (fetch)
const res = await fetch('https://api.publora.com/api/v1/account-context', {
headers: { 'x-publora-key': 'YOUR_API_KEY' }
});
const { context } = await res.json();
const { remaining, limit } = context.quotas.monthlyPosts;
console.log(limit === null ? 'Unlimited posts' : `${remaining} of ${limit} platform posts left`);Python (requests)
import requests
res = requests.get(
'https://api.publora.com/api/v1/account-context',
headers={'x-publora-key': 'YOUR_API_KEY'},
params={'scheduledTime': '2026-11-03T09:00:00Z'},
)
context = res.json()['context']
print(context['plan']['name'], context['quotas']['scheduleHorizon']['maxScheduledDate'])Errors
| Status | Error | Cause |
|---|---|---|
| 400 | "scheduledTime must be a valid ISO date-time" |
code: "INVALID_SCHEDULED_TIME", retryable: false, nextAction: "CHANGE_SCHEDULE". The value has no Z or offset, or is an impossible date such as 2026-02-30. |
| 401 | "API key is required" / "Invalid API key" |
Missing or invalid x-publora-key |
| 403 | "API access is not enabled for this account" |
The plan has no API access |
| 500 | "Failed to read account context" |
Internal server error; retry later |
Notes
- A snapshot, not a reservation. Every write is checked again when it is made, so a write can still hit a limit if the quota was used in the meantime.
- Same numbers as enforcement. The quotas use the same counting as
create-postandupdate-post, including the Publish Now exemption from the scheduled-post queue.