The plan catalog and the plan your account is on. No plan is gated on monthly order volume — there are no volume discounts on monthly order counts, and min_orders/max_orders are null for that reason. Our own plant's products priced by our price book carry quantity breaks (stickers 40% off from 10, 61% off from 25, 73% off from 50, 76% off from 100; magnets 15% off from 10, 30% off from 50, 40% off from 100; posters 8% off from 5, 15% off from 10, 18% off from 25, except the 18×24, which is $10.71 each from 5 and $9.89 each from 10 and $9.66 each from 25, and the 24×36, which is $19.31 each from 5; wall decals 8% off from 5, 15% off from 10), on the order's whole quantity of a SKU and after any plan discount; a negotiated price takes none. No plan carries a platform fee: platform_fee_pct is 0 on every plan since 2026-10-17, as is pricing_model.platform_fee_pct, the rate your account pays today. catalog_discount_pct is the percentage the plan takes off the products our own plant makes (stickers, labels, decals, magnets and posters); no plan sold on this portal takes one. current.entitled_catalog_discount_pct is what your account may take today. Tiers with offered: false are not sold on this portal; accounts already on them keep them. The response is account-specific and served Cache-Control: private.
- Credential
- An API key in
x-api-key - Scopes
pricing:read
Request
GET /api/v1/pricing/tiers
curl "https://portal.printedsimply.com/api/v1/pricing/tiers" \
-H "x-api-key: ps_test_YOUR_KEY"Response 200
Every plan, plus the one this key's account is on. Account-specific, so Cache-Control: private — a shared cache must not hold it. The example lists the plans sold here; an answer also lists, with offered: false, each plan an account may already be on.
data
notestringrequiredThe pricing rules in prose, generated from the same constants that enforce them — including the sentence about plan volume discounts on monthly order counts, which changes on the day a plan has one, and the quantity breaks on one order's units of a SKU.
pricing_modelobjectrequiredpricing_model.volume_discountsbooleanrequiredWhether ANY published plan prices on order volume. False today.
pricing_model.processing_fee_pctnumberrequireddeprecatedDeprecated 2026-09-26: the single fee it described is now two lines. Holds
platform_fee_pct; read that and the card fields instead.pricing_model.platform_fee_pctnumberThe platform fee this account's next order pays, as a percentage of items plus shipping. 0: there is no platform fee on any order, on any plan, since 2026-10-17.
pricing_model.card_fee_pctnumberCard processing's percentage, passed through at cost on everything else the order is charged.
pricing_model.card_fee_fixed_centsintegerCard processing's fixed part per charge, in cents.
pricing_model.catalog_discount_pctnumberrequiredThe discount that will actually apply to this account's next order.
tiersobject[]requiredEvery plan, offered ones first, then retired ones.
tiers[].tierintegerrequired1-based position in this list, offered plans first. An ordering, not a ranking.
tiers[].planstringrequiredThe plan id an upgrade would name (
starter, …).tiers[].namestringrequiredDisplay label (
Free, …).tiers[].offeredbooleanrequiredWhether this plan can be bought on this portal today. False means it is not sold here — accounts already on it keep it, nobody new can join it.
tiers[].monthly_price_centsintegerrequiredtiers[].catalog_discount_pctnumberrequired% off the products our own plant makes (stickers, labels, decals, magnets, posters) this plan GRANTS, never below a unit's cost floor. No plan sold on this portal grants one. What the account may take today is
current.entitled_catalog_discount_pct.tiers[].platform_fee_pctnumberThe platform fee this plan pays, as a percentage of items plus shipping. 0 on every plan: there is no platform fee on any order since 2026-10-17. Card processing is separate and passed through at cost.
tiers[].discount_percentnumberrequiredDeprecated alias of
catalog_discount_pct, kept because it is the field this endpoint has always published. It used to mean a volume discount and was hardcoded to 0; it now carries the plan discount, the only discount a plan grants. The quantity breaks on our own plant's goods are per order, not per plan, and the note states them.tiers[].requests_per_minuteintegerrequiredtiers[].requests_per_dayintegerrequiredtiers[].recommended_monthly_ordersstringrequiredThe order volume this plan is SUGGESTED for. Nothing is enforced on it — exceeding it costs nothing and changes nothing.
tiers[].min_ordersinteger | nullrequiredThe volume this plan's discount ladder starts at. Null on every plan today, because no plan carries a ladder — not zero, which would read as one starting at the first order.
tiers[].max_ordersinteger | nullrequiredThe top of the ladder. Null when there is none, and also when its top rung is open-ended (which it always is).
tiers[].bandsobject[]requiredThe plan's volume ladder, lowest rung first. Empty means one flat discount at every volume — which is every plan today.
tiers[].bands[].min_ordersintegerrequiredInclusive lower bound, in billed orders over the trailing window.
tiers[].bands[].max_ordersinteger | nullrequiredInclusive upper bound; null on the open-ended top rung.
tiers[].bands[].catalog_discount_pctnumberrequired% off the products our own plant makes at that volume.
tiers[].labelstringrequiredPrice and the single most distinguishing benefit, prebuilt for display.
tiers[].featuresstring[]requiredcurrentobjectrequiredThe plan this key's account is on.
current.tierintegerrequiredcurrent.planstringrequiredcurrent.namestringrequiredcurrent.offeredbooleanrequiredcurrent.catalog_discount_pctnumberrequiredWhat the plan grants.
current.discount_percentnumberrequiredDeprecated alias of
catalog_discount_pct.current.entitled_catalog_discount_pctnumberrequiredWhat the account may take TODAY, on our own plant's goods. Lower than
catalog_discount_pctwhile a subscription is past_due, canceled or unpaid — budget against this one, not the plan's headline.current.monthly_ordersanyrequiredAlways null. This endpoint does not count your orders, and nothing prices on volume. Zero would read as "you have shipped nothing" to a merchant who has shipped thousands.
next_tierobject | nullrequiredThe next plan up, or null when there is none to move to.
next_tier.tierintegerrequirednext_tier.planstringrequirednext_tier.namestringrequirednext_tier.monthly_price_centsintegerrequirednext_tier.catalog_discount_pctnumberrequirednext_tier.discount_percentnumberrequiredDeprecated alias of
catalog_discount_pct.next_tier.orders_neededanyrequiredAlways null. No plan is reached by placing orders, so there is no count that would get you there. Zero would read as "you already qualify".
meta
pageintegertotalintegerlimitintegerThe page size actually applied, which is not necessarily the one asked for — the operation's own ceiling wins.
pagesintegertotaloverlimit, rounded up.next_cursorstring | nullOn a cursor-paged operation: send this back as
cursorfor the next page. Null on the last page. Absent on operations that do not page by cursor.has_morebooleanOn a list operation whose
metaisListMeta: whether another page follows this one.
{
"status": "success",
"data": {
"note": "Order pricing is the published price for products our facilities make and their shipping, with no platform fee. No card-processing or seasonal peak fee is added. No plan is gated on monthly order volume — there are no volume discounts on monthly order counts, and min_orders/max_orders are null for that reason. Our own plant's products priced by our price book carry quantity breaks (stickers 40% off from 10, 61% off from 25, 73% off from 50, 76% off from 100; magnets 15% off from 10, 30% off from 50, 40% off from 100; posters 8% off from 5, 15% off from 10, 18% off from 25, except the 18×24, which is $10.71 each from 5 and $9.89 each from 10 and $9.66 each from 25, and the 24×36, which is $19.31 each from 5; wall decals 8% off from 5, 15% off from 10), on the order's whole quantity of a SKU and after any plan discount; a negotiated price takes none. Plans marked offered: false are not sold on PrintedSimply; accounts already on them keep them.",
"pricing_model": {
"volume_discounts": false,
"platform_fee_pct": 0,
"card_fee_pct": 2.9,
"card_fee_fixed_cents": 30,
"processing_fee_pct": 0,
"catalog_discount_pct": 0
},
"tiers": [
{
"tier": 1,
"plan": "starter",
"name": "Free",
"offered": true,
"monthly_price_cents": 0,
"catalog_discount_pct": 0,
"discount_percent": 0,
"platform_fee_pct": 0,
"requests_per_minute": 60,
"requests_per_day": 10000,
"recommended_monthly_orders": "0–99",
"min_orders": null,
"max_orders": null,
"bands": [],
"label": "Free · 60 requests/min",
"features": [
"No platform fee — the price shown is the price",
"No added card-processing or seasonal peak fees",
"60 API requests/min",
"REST API",
"$0 time-compressed sandbox",
"Test + live API keys, HMAC webhooks",
"Community support"
]
}
],
"current": {
"tier": 1,
"plan": "starter",
"name": "Free",
"offered": true,
"catalog_discount_pct": 0,
"discount_percent": 0,
"entitled_catalog_discount_pct": 0,
"monthly_orders": null
},
"next_tier": null
},
"request_id": "4e3753e1-48dd-4313-bfd8-48e4af4e116a"
}Errors
Missing, invalid or expired API key:
missing_api_key(none sent),invalid_api_key(unknown or revoked),key_expired(past the expiry set when it was created; create a new key).Rate limit exceeded. Two windows can produce this status and
error.codesays which:rate_limit_exceededfor the per-minute sliding window,daily_quota_exceededfor the plan's daily quota. Both carryRetry-After; the daily one also carriesX-Daily-LimitandX-Daily-Remaining. The per-minute limits are plan-based — see Rate Limits above, or call GET /v1/me for this credential's own figures.