Changelog
Release notes and updates for the Presscart public API.
October 24, 2026
Orders API: agent spending
- An API token no longer pays for an order from Team Credits on its own. Before,
POST /orders/checkoutapplied available credits by default (apply_creditsdefaulted totrue); now a token pays from credits only after a team owner or admin gives it a spend grant. Without one, the order is created and waits at itscheckout_link, andapply_creditsis ignored. - A token with a spend grant pays from the credit balance only, up to a monthly cap (
$1,000by default).POST /orders/checkoutcan now answer202(status: "pending_approval", the order is held until its owner approves it by email),402(INSUFFICIENT_CREDIT_BALANCE, the balance does not cover it; no card payment is started) or503(APPROVAL_EMAIL_FAILEDorAPPROVAL_EMAIL_PENDING, the approval email is not out yet; retry shortly). - New:
GET /orders/approvals/{approval_id}reports what became of a held order.
October 23, 2026
POST /orders/checkout
- The endpoint now accepts an optional
Idempotency-Keyheader so a request can be retried safely after a timeout. The same key and body returns the original response withIdempotent-Replayed: trueinstead of creating a second order; the same key with a different body returns422, and the same key while the first request is still running returns409. Requests without the header behave as before. See Create order.
October 16, 2026
Authentication
- The API no longer accepts OAuth access tokens issued to MCP clients. A request that sends one gets
401on every endpoint. Before, most endpoints, includingGET /auth/token, answered403, andGET /tagsandGET /outlet-disclaimersaccepted the token. Those tokens still work with the Presscart MCP server; use an API token to call the API directly. - The
GET /auth/tokenreference no longer documents an OAuth response (source: "oauth",oauth_client_id,oauth_grant_id), which the endpoint had already stopped returning.
October 15, 2026
Orders API
Order responses no longer include payment processor identifiers, internal invoice and accounting data, or email addresses. Customers still pay through checkout_link.
GET /orders,GET /orders/{order_id},GET /profiles/{profile_id}/orders, andPOST /orders/checkoutno longer returnclient_secret,checkout_session_id,payment_intent_id,guest_stripe_customer_id,customer_invoice_id,customer_invoice_source,customer_invoice_date,customer_invoice_url,guest_email,account_owner_email,metadata,line_items[].stripe_price_id, orline_items[].stripe_product_id.GET /orders/{order_id}no longer returnsemail.GET /ordersandGET /profiles/{profile_id}/ordersno longer returnteam.contact_email;team.nameis still returned.GET /order-items,GET /order-items/{order_item_id}, andDELETE /order-items/{order_item_id}no longer returnvendor_invoice_id,vendor_cost,vendor_invoice_date,vendor_invoice_url,vendor_paid_date,commission_amount,commission_status, orcommission_date_paid;GET /order-itemsalso no longer returnsguest_email.- Unchanged:
checkout_link,payment_status,payment_expires_at,status,reference_number, and all amounts (total,subtotal,discount,processing_fee,credits_applied,coupon, and line itemprice).
October 13, 2026
GET /outlets
- A
filters[search]of 3 or more characters is now ranked by relevance, the same way the Presscart marketplace ranks searches. Shorter searches still match product and outlet names. - Each record now includes
match_probability(0to1, ornulloutside a ranked search). - The response now includes
search_mode(jev,name, ornull) and, when the search text states constraints such as "do-follow" or "under $500",search_constraints. - A
sort_bythat is not one of the listed sort fields is now ignored instead of failing the request.
October 1, 2026
Orders API
POST /orders/checkoutno longer accepts adiscount; discounts are applied with a coupon. A request that sends a non-zerodiscountis rejected with422, anddiscount: 0is still accepted.
May 28, 2026
Article comments API (new)
- Added endpoints for listing, creating, updating, and archiving article comments:
GET /articles/{article_id}/commentsPOST /articles/{article_id}/commentsPUT /articles/{article_id}/comments/{comment_reference}DELETE /articles/{article_id}/comments/{comment_reference}
- Comments use a comment reference as
id; use that value when updating, archiving, or replying. - Replies are one level deep via
parent_comment_id.
Articles API
- Clarified that
PUT /articles/{article_id}saves article fields such asbrief_google_doc_url; it does not submit, approve, or change workflow status. - Removed
POST /articles/{article_id}/submitfrom the public docs while article submission remains handled in the app workflow.
Webhooks guide
- Documented
article.status_changed,comment.created,comment.updated, andcomment.archivedtopics. - Added payload examples for article status changes and comment events.
- Comment webhook payloads use the same comment reference returned by the Comments API and include author display name only.
- Updated local development guidance for Hookdeck Console and tunnel-based testing.
April 21, 2026
GET /outlets
- Added
filters[most_popular]— return records sorted by most ordered. - Added
filters[new_last_30_days]— return records created within the last 30 days, sorted by newest first.
GET /outlets/{outlet_id}/products
- Added
filters[most_popular]andfilters[new_last_30_days]quick filters (same asGET /outlets).
April 16, 2026
POST /orders/checkout
- Response now includes
checkout_link— a shareable guest checkout URL so customers can pay online without needing an internal team member to send the link.
GET /orders/{order_id}
- Response now includes
checkout_linkwhen the order status is notPAID(otherwisenull).
GET /orders
- Each order record now includes
checkout_linkwhen the order status is notPAID(otherwisenull).
Articles endpoints (new)
GET /articles/{article_id}— Get article details including brief and draft Google Doc links.PUT /articles/{article_id}— Update an article's content brief viabrief_google_doc_url.PATCH /articles/{article_id}/approve-brief— Approve a content brief.PATCH /articles/{article_id}/approve-draft— Submit and approve a draft viadraft_google_doc_urlin a single step.
Files & Folders endpoints (new)
GET /files— List files in your team's media library (paginated, searchable, folder-filterable).GET /files/{file_id}— Get a file with a signed URL.POST /files/upload— Upload 1–5 files via multipart/form-data.GET /files/{file_id}/download— Download a file's binary content.POST /files/move— Move files between folders (or back to root).DELETE /files/{file_id}— Soft-delete a file.GET /folders— List folders.POST /folders— Create a folder.PATCH /folders/{folder_id}— Rename a folder.DELETE /folders/{folder_id}— Soft-delete a folder.
April 6, 2026
Documentation
- Fixed
filters[disclaimer_id]tofilters[disclaimer]inGET /outlets— the filter uses disclaimer name, not ID. - Fixed
GET /outlet-disclaimersdescription to referencenamevalues instead ofidvalues for filtering. - Fixed
GET /products/categoriesresponse example — category types now use correct casing (FULL_FEATURE,PRESS_RELEASE,NEWSLETTER,SOCIAL). - Fixed
POST /orders/checkout—linked_order_line_item_idanddiscountare now correctly marked as optional. Initial order status corrected fromPENDINGtoCREATED. - Fixed
GET /campaignslist response — correctedarticles[].order_itemshape to include nestedoutletandaddonsfields. Addedsearchfilter. - Fixed
GET /campaigns/{campaign_id}/articlesresponse — removed incorrect pagination fields (total_pages,current_page,next_page,previous_page). Onlyrecordsandtotal_recordsare returned. - Fixed
GET /teams/{team_id}/profilesresponse — removed fields not returned by the API (nylas_user_id,pitchbox_project_id,media_assets_visited,v1_profile_id,hubspot_id).
March 30, 2026
GET /tags (new)
- New endpoint to list tag names for use in outlet and product listing filters.
- Supports filtering by
search,category, andfetch_all.
GET /outlet-disclaimers (new)
- New endpoint to list disclaimers with
id,name, anddescription. - Use disclaimer IDs when filtering outlets and product listings.
GET /outlets
- Changed
filters[disclaimer](name) tofilters[disclaimer_id](ID). Use the disclaimer ID fromGET /outlet-disclaimers.
March 24, 2026
GET /outlets
- Added
outlet_idfield to each record. Use this when callingGET /outlets/{outlet_id}. - The existing
idfield remains the product ID. - Added filter support:
channel_type,placement_type,is_do_follow,is_indexed,disclaimer,tags,country,state,city,pricing,domain_authority,domain_ranking,turnaround_time. - Documented default values for
limit,page,sort_by, andorder_by.
GET /outlets/{outlet_id}
- Added
stateandis_indexedfields to the response. - Added
disclaimer_nameanddisclaimer_descriptiontooutlet_channels.
GET /outlets/{outlet_id}/products (new)
- New endpoint to retrieve paginated products for a specific outlet.
- Supports the same filters and sorting as
GET /outlets.
Location endpoints (new)
GET /outlets/locations/countries— list all distinct countries.GET /outlets/locations/states?country=— list states for a country.GET /outlets/locations/cities?country=&state=— list cities, optionally filtered by state.- Country values use full names (e.g.
United States, notUS).
Documentation
- Added full response examples with all fields across all API reference pages (orders, campaigns, profiles, products).
- Added Axios code examples for all endpoints.
March 2026
- Initial public API release
- Endpoints: auth, outlets, products, orders, profiles, campaigns
- Token types:
full_access,custom,read_only