The weekdays every estimated_delivery skips, for the twelve months from today: the federal holidays of 5 U.S.C. 6103 (each on the weekday it is observed: a Saturday holiday on the Friday before, a Sunday one on the Monday after) and the plant's own closure days, each with its date, kind, reason and source. Saturdays and Sundays are never counted either (weekly). One bounded document, not a page: from is today (UTC) and through the day before the same date next year, or the last day the table covers when that is sooner. These are the days POST /orders/quote and POST /shipping/estimate skip when they date an order, so estimated_delivery and deliver_by_check already account for them; read this to show a buyer why a date moved, or to plan around a closure. Buying for a date, read this first. order_by answers the last day to order: for each parcel method on offer and each of Christmas Eve, Christmas Day, New Year's Eve (each in the next year it falls on or after today) and the next federal holiday, the last UTC day an order of our own plant's goods is estimated to arrive by that day, computed by the same estimate POST /orders/quote dates an order with, so a quote that day answers meets: true. For any other day send deliver_by on POST /orders/quote and read deliver_by_check.latest_order_day. peak is the carrier's peak postage window as the cost book holds it: its dates, the most it adds to one parcel's rate in cents (bare), the methods it can apply to, the carrier's zones and weight, and the carrier's announcement; null once the window has ended. PrintedSimply absorbs this carrier cost; it is not added as a customer surcharge. advisories lists every carrier advisory not yet over: a delay a carrier posted, as the plant entered it from the carrier's notice, with the carrier, the states and ZIP prefixes it touches (neither means every US destination), its first and last day, the carrier's estimate of the business days it adds, one sentence and the notice itself. A quote or shipping estimate into a destination one touches reports it in delivery_risk, and its deliver_by_check answers at_risk rather than meets. Requires an API key and no scope: it describes the platform, the same for every caller. Read-only.
- Credential
- An API key in
x-api-key - Scopes
- None: every key may call it
Request
GET /api/v1/calendar
curl "https://portal.printedsimply.com/api/v1/calendar" \
-H "x-api-key: ps_test_YOUR_KEY"Response 200
The non-operating days from today for twelve months
data
fromstring (date)requiredToday, YYYY-MM-DD in UTC.
throughstring (date)requiredThe last day this answer covers: the day before the same date next year, or the table's last day when that is sooner.
timezonestringrequiredEvery date here, and in every estimate, is a UTC day.
Always
UTCweeklystring[]requiredThe days of every week no estimate counts.
daysobject[]requiredEvery other day from
fromthroughthroughthat no estimate counts, in date order.days[].datestring (date)requiredYYYY-MM-DD, UTC.
days[].kindstringrequiredfederal_holiday: a legal public holiday of 5 U.S.C. 6103, on the weekday it is observed.plant_closure: a day the plant is closed.One of
federal_holidayplant_closuredays[].reasonstringrequiredWhy the day is not counted, in its source's words, e.g. "Thanksgiving Day", or "Independence Day (observed)" for the weekday that stands in for a weekend holiday.
days[].sourcestringrequiredWhere the day comes from: the statute's URL for a federal holiday.
order_byobject[]requiredThe last day to order, by each parcel method on offer, for each day of a short table: Christmas Eve, Christmas Day, New Year's Eve (each in the next year it falls on or after today) and the next federal holiday after today, in date order. For our own plant's goods; another day, or another facility's goods, is answered by
deliver_by_check.latest_order_dayon POST /orders/quote. Estimates.order_by[].deliver_bystring (date)requiredThe day the order should arrive by, YYYY-MM-DD in UTC.
order_by[].occasionstringrequiredWhat the day is: "Christmas Eve", "Christmas Day", "New Year's Eve", or the next federal holiday's name as
dayslists it.order_by[].methodstringrequiredThe shipping tiers this platform prices. Per parcel, not per item:
standardby the parcel's weight class (POST /v1/shipping/estimate reports it), and for items made at the partner facility (apparel, mugs) at the larger of that and the partner's own estimate for the parcel;priorityandexpressat their price and never below standard for the same parcel. An unrecognised value is refused with 400 validation_error rather than priced asstandard.standardis always offered;priorityandexpressare offered when priced (each at or above the USPS cost of the service), and until then a request for either is refused 400shipping_method_unavailable, withdetails.offerednaming the methods that are, and nothing is charged.letteris untracked letter mail for stickers and small vinyl decals from our own plant, offered only where the platform prices it, for an order whose every item qualifies, within a unit and an order-value ceiling: otherwise a request for it is refused 400letter_mail_unavailablewithdetails.reason, and nothing is charged. On the API it is never chosen for you — no default, estimate or storefront mapping picks it — and it is placed through POST /v1/order only (bulk and bundle orders ship by parcel). A hosted store is the one exception, and only where its merchant turned on small orders by letter in the dashboard's store editor (off by default, launched stores included): a qualifying basket bought on its store page or a buy link ships as a letter, and the shopper is told before paying. A letter has no carrier tracking: its order events and tracking page state the expected window, and POST /v1/order/{id}/missing-letter reships it once if it does not arrive.One of
standardpriorityexpressletterorder_by[].latest_order_daystring (date) | nullrequiredThe last UTC day an order placed by
methodis estimated to arrive bydeliver_by(its estimated window's latest day on or before it); any time that day counts, and it may be a weekend or a holiday. Null when no order placed today or later is, which is the answer once the day has passed.order_by[].is_estimatebooleanrequiredAlways true.
Always
truepeakobject | anyrequiredThe carrier's peak postage window, or null once it has ended (a new one is published when the carrier announces it).
peak.fromstring (date)requiredThe first day of the window, YYYY-MM-DD in UTC, inclusive.
peak.throughstring (date)requiredThe last day of the window, YYYY-MM-DD in UTC, inclusive.
peak.in_windowbooleanrequiredWhether today (UTC) is inside the window.
peak.centsintegerrequiredThe surcharge per parcel, in cents, bare: the most the window adds to one parcel's rate before that rate is folded into an all-in figure. The amount on an order is the quote's
shipping.surcharges[].amount_cents, folded the way its shipping is; a priority or express price set above the parcel's rate can hold some or all of it.peak.methodsstring[]requiredThe parcel methods whose carrier expense can include it. PrintedSimply absorbs this expense; it is not a customer surcharge. Never
letter: a letter carries no peak postage.peak.carrier_zonesobjectrequiredThe USPS zones the carrier's surcharge applies in, both inclusive. Our own parcel rate is one figure for every zone, so inside the window it holds the surcharge whatever the zone.
peak.carrier_zones.fromintegerrequiredpeak.carrier_zones.throughintegerrequiredpeak.carrier_max_weight_lbintegerrequiredThe heaviest parcel, in pounds, the carrier's surcharge names. A heavier parcel carries the same amount here.
peak.sourcestringrequiredThe carrier's own announcement of the window.
advisoriesobject[]requiredEvery carrier advisory not withdrawn and not yet over, soonest first: in effect today (
active) or starting later. Empty when the carriers have posted none. A quote or shipping estimate into a destination one touches answersdeliver_by_check.statusat_risk.advisories[].idstringrequiredadv_….advisories[].carrierstringrequiredThe carrier that posted it, as it names itself, e.g. "USPS".
advisories[].statesstring[]requiredUSPS state codes it touches. With
zip_prefixesboth empty, it touches every US destination.advisories[].zip_prefixesstring[]requiredZIP prefixes (one to five digits) it touches, beside
states.advisories[].fromstring (date)requiredThe first day it applies, YYYY-MM-DD in UTC, inclusive.
advisories[].throughstring (date)requiredThe last day it applies, YYYY-MM-DD in UTC, inclusive.
advisories[].activebooleanrequiredWhether today (UTC) is inside
from–through.advisories[].extra_daysintegerrequiredThe carrier's estimate of the business days it adds, as posted. An estimate.
advisories[].messagestringrequiredOne sentence about it.
advisories[].sourcestringrequiredThe carrier's own notice, as a URL.
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": {
"from": "2026-10-15",
"through": "2027-10-14",
"timezone": "UTC",
"weekly": [
"saturday",
"sunday"
],
"days": [
{
"date": "2026-11-11",
"kind": "federal_holiday",
"reason": "Veterans Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2026-11-26",
"kind": "federal_holiday",
"reason": "Thanksgiving Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2026-12-25",
"kind": "federal_holiday",
"reason": "Christmas Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-01-01",
"kind": "federal_holiday",
"reason": "New Year's Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-01-18",
"kind": "federal_holiday",
"reason": "Birthday of Martin Luther King, Jr.",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-02-15",
"kind": "federal_holiday",
"reason": "Washington's Birthday",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-05-31",
"kind": "federal_holiday",
"reason": "Memorial Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-06-18",
"kind": "federal_holiday",
"reason": "Juneteenth National Independence Day (observed)",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-07-05",
"kind": "federal_holiday",
"reason": "Independence Day (observed)",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-09-06",
"kind": "federal_holiday",
"reason": "Labor Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
},
{
"date": "2027-10-11",
"kind": "federal_holiday",
"reason": "Columbus Day",
"source": "https://www.law.cornell.edu/uscode/text/5/6103"
}
],
"order_by": [
{
"deliver_by": "2026-11-11",
"occasion": "Veterans Day",
"method": "standard",
"latest_order_day": "2026-10-27",
"is_estimate": true
},
{
"deliver_by": "2026-12-24",
"occasion": "Christmas Eve",
"method": "standard",
"latest_order_day": "2026-12-10",
"is_estimate": true
},
{
"deliver_by": "2026-12-25",
"occasion": "Christmas Day",
"method": "standard",
"latest_order_day": "2026-12-10",
"is_estimate": true
},
{
"deliver_by": "2026-12-31",
"occasion": "New Year's Eve",
"method": "standard",
"latest_order_day": "2026-12-16",
"is_estimate": true
}
],
"peak": {
"from": "2026-10-04",
"through": "2027-01-16",
"in_window": true,
"cents": 55,
"methods": [
"standard"
],
"carrier_zones": {
"from": 5,
"through": 9
},
"carrier_max_weight_lb": 3,
"source": "https://about.usps.com/newsroom/national-releases/2026/0825-usps-announces-temporary-price-change-for-2026-holiday-shipping-season.pdf"
},
"advisories": []
},
"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.