Overview
Returns the organiser’s plan, available credits and what the plan allows, so an integration can explain a limit before an action fails. OAuth only. Requiresevents:read and an accepted organiser membership. Send a bearer token without X-API-Key.
| Plan | Events | Credits | Analytics and products |
|---|---|---|---|
| Trial | Private only (gallery link) | Starter credits; buying credits moves the account to Pay As You Go | Certify and Buzz to try; photo sales in test mode; no engagement analytics, Flow, Select, Motion or custom domain |
| Pay As You Go | Public or private | Buy as needed | Engagement analytics and event products need Pro |
| Pro | Public or private | Credit balance from purchases | Engagement analytics, custom domain, event products; photo sales need Business |
| Business | Public or private | Credit balance from purchases | Every product feature, including live photo sales and API keys |
| Enterprise | Public or private | Credit balance from purchases | Everything in Business, plus custom SSO, custom pricing, SLAs and tailored workflows |
Endpoint
GET /api/v1/ext/{org_id}/plan
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
org_id | integer | Yes | Organiser where the caller has an accepted membership. |
Example Request
curl -i -X GET \
-H "Authorization: Bearer <oauth_access_token>" \
"https://api.9pic.ai/api/v1/ext/903/plan"
import requests
response = requests.get(
"https://api.9pic.ai/api/v1/ext/903/plan",
headers={"Authorization": "Bearer <oauth_access_token>"},
)
print(response.status_code, response.json())
const response = await fetch("https://api.9pic.ai/api/v1/ext/903/plan", {
method: "GET",
headers: { "Authorization": "Bearer <oauth_access_token>" },
});
console.log(await response.json());
Example Response
{
"responseType": "success",
"message": "Plan",
"data": {
"org_id": 903,
"plan": "trial",
"plan_label": "Trial",
"available_credits": 20,
"credit_rule": "Processing uses 1 credit per photo when BIB or selfie search is on; processing without participant search uses no credits.",
"gallery_domain": "trial.9pic.ai",
"public_events": false,
"engagement_analytics": false,
"event_products": false,
"products": { "certify": true, "flow": false, "select": false, "buzz": true, "motion": false },
"photo_sales": true,
"custom_domain": false,
"notes": [
"Trial includes Photos, Certify, Buzz, photo sales in test mode with original photo storage, and developer API keys.",
"Trial events are private: only people with the gallery link can open them.",
"Photo sales run in test mode on Trial: buyers use test cards and are not charged.",
"Trial accounts use their starter credits; buying credits moves the account to Pay As You Go.",
"Not on this plan: Public event galleries (Pay As You Go); Flow, Select, Motion, Engagement analytics, Email sender name, Privacy, cookie and terms additions, Your branding for buyers, Custom domain, Additional organisations (Pro); Sales tax settings, Purchase webhook, Live payments, White-label emails (Business)."
],
"upgrade_to": "Pay As You Go, Pro or Business"
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
plan | string | null | trial, pay-as-you-go, pro, business, enterprise, or null when no plan is active. |
plan_label | string | Plan name to show the user. |
available_credits | integer | Credits available for processing. |
public_events | boolean | Events can be public. false on Trial. |
engagement_analytics | boolean | Event Analytics is available. |
event_products | boolean | Certify, Flow, Select, Buzz and Motion are all available. true on Pro, Business and Enterprise. |
products | object | Each event product by key (certify, flow, select, buzz, motion) with true when the plan includes it. On Trial only certify and buzz are true. |
photo_sales | boolean | Photo sales are available. On Trial they run in test mode: buyers use test cards and nobody is charged. |
custom_domain | boolean | Galleries can use the organiser’s own domain. |
notes | string[] | Plan limits to explain to the user. The last note lists the features the plan doesn’t include, each with the plan that adds it. |
upgrade_to | string | null | Next plan that removes these limits: Pay As You Go, Pro or Business on Trial, Pro or Business on Pay As You Go, Business on Pro, Enterprise (custom) on Business, and null on Enterprise or with no plan. |
Error Responses
| Status | Meaning |
|---|---|
401 | Invalid or expired access token. |
403 | Missing scope or membership; API keys are rejected. |

