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 (vinyl decals up to 5×5 in 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; 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. Our die-cut and kiss-cut stickers are priced by their own sheet instead, the same on every plan: a pack total at 1, 5, 10, 25, 50, 100, 250, 500, 1,000 and 2,500 units (each row's quantity_breaks, with total_cents), the total running in a straight line between two of those (price_interpolation linear_total), the 2,500-unit rate held above 2,500, and never below the size's unit floor, which holds the largest sizes at volume (min_unit_cents). Our wall decals are priced by their own sheet too, the same on every plan: one price each, at any quantity (each row's one quantity_breaks entry, price_interpolation none); the wall decals' breaks above are for a size the sheet does not list. Our posters are priced by their own price list too, the same on every plan: one price each, at any quantity (each row's one quantity_breaks entry, price_interpolation none); the posters' breaks above are for a size the list does not hold. Our magnets are priced by their own price list, the same on every plan: a total at every quantity, published at 1, 5, 10, 25, 50, 100, 250, 500, 1,000, 2,500, 5,000 and 10,000 units (each row's quantity_breaks, with total_cents; price_interpolation formula, so between two of those the quote gives the figure). The total never falls as the quantity grows. The bulk discount continues at every quantity; rounding can move the unit price slightly; the magnets' breaks above are for a size the list does not include. 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 what our own plant makes other than die-cut and kiss-cut stickers and the wall decals, posters and magnets our catalog lists; 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://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 what our own plant makes other than die-cut and kiss-cut stickers and the wall decals, posters and magnets our catalog lists on this account's next order; die-cut and kiss-cut stickers and the wall decals, posters and magnets our catalog lists take none on any plan.
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 what our own plant makes other than die-cut and kiss-cut stickers and the wall decals, posters and magnets our catalog lists this plan GRANTS, never below a unit's cost floor (die-cut and kiss-cut stickers and the wall decals our catalog lists are the same price on every plan since 2026-10-23, and the posters and magnets our catalog lists since 2026-10-24). 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 what our own plant makes other than die-cut and kiss-cut stickers and the wall decals, posters and magnets our catalog lists 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 (vinyl decals up to 5×5 in 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; 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. Our die-cut and kiss-cut stickers are priced by their own sheet instead, the same on every plan: a pack total at 1, 5, 10, 25, 50, 100, 250, 500, 1,000 and 2,500 units (each row's quantity_breaks, with total_cents), the total running in a straight line between two of those (price_interpolation linear_total), the 2,500-unit rate held above 2,500, and never below the size's unit floor, which holds the largest sizes at volume (min_unit_cents). Our wall decals are priced by their own sheet too, the same on every plan: one price each, at any quantity (each row's one quantity_breaks entry, price_interpolation none); the wall decals' breaks above are for a size the sheet does not list. Our posters are priced by their own price list too, the same on every plan: one price each, at any quantity (each row's one quantity_breaks entry, price_interpolation none); the posters' breaks above are for a size the list does not hold. Our magnets are priced by their own price list, the same on every plan: a total at every quantity, published at 1, 5, 10, 25, 50, 100, 250, 500, 1,000, 2,500, 5,000 and 10,000 units (each row's quantity_breaks, with total_cents; price_interpolation formula, so between two of those the quote gives the figure). The total never falls as the quantity grows. The bulk discount continues at every quantity; rounding can move the unit price slightly; the magnets' breaks above are for a size the list does not include. 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.