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/checkout applied available credits by default (apply_credits defaulted to true); 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 its checkout_link, and apply_credits is ignored.
  • A token with a spend grant pays from the credit balance only, up to a monthly cap ($1,000 by default). POST /orders/checkout can now answer 202 (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) or 503 (APPROVAL_EMAIL_FAILED or APPROVAL_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-Key header so a request can be retried safely after a timeout. The same key and body returns the original response with Idempotent-Replayed: true instead of creating a second order; the same key with a different body returns 422, and the same key while the first request is still running returns 409. 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 401 on every endpoint. Before, most endpoints, including GET /auth/token, answered 403, and GET /tags and GET /outlet-disclaimers accepted the token. Those tokens still work with the Presscart MCP server; use an API token to call the API directly.
  • The GET /auth/token reference 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, and POST /orders/checkout no longer return client_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, or line_items[].stripe_product_id.
  • GET /orders/{order_id} no longer returns email.
  • GET /orders and GET /profiles/{profile_id}/orders no longer return team.contact_email; team.name is still returned.
  • GET /order-items, GET /order-items/{order_item_id}, and DELETE /order-items/{order_item_id} no longer return vendor_invoice_id, vendor_cost, vendor_invoice_date, vendor_invoice_url, vendor_paid_date, commission_amount, commission_status, or commission_date_paid; GET /order-items also no longer returns guest_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 item price).

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 (0 to 1, or null outside a ranked search).
  • The response now includes search_mode (jev, name, or null) and, when the search text states constraints such as "do-follow" or "under $500", search_constraints.
  • A sort_by that is not one of the listed sort fields is now ignored instead of failing the request.

October 1, 2026

Orders API

  • POST /orders/checkout no longer accepts a discount; discounts are applied with a coupon. A request that sends a non-zero discount is rejected with 422, and discount: 0 is still accepted.

May 28, 2026

Article comments API (new)

  • Added endpoints for listing, creating, updating, and archiving article comments:
    • GET /articles/{article_id}/comments
    • POST /articles/{article_id}/comments
    • PUT /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 as brief_google_doc_url; it does not submit, approve, or change workflow status.
  • Removed POST /articles/{article_id}/submit from the public docs while article submission remains handled in the app workflow.

Webhooks guide

  • Documented article.status_changed, comment.created, comment.updated, and comment.archived topics.
  • 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] and filters[new_last_30_days] quick filters (same as GET /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_link when the order status is not PAID (otherwise null).

GET /orders

  • Each order record now includes checkout_link when the order status is not PAID (otherwise null).

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 via brief_google_doc_url.
  • PATCH /articles/{article_id}/approve-brief — Approve a content brief.
  • PATCH /articles/{article_id}/approve-draft — Submit and approve a draft via draft_google_doc_url in 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] to filters[disclaimer] in GET /outlets — the filter uses disclaimer name, not ID.
  • Fixed GET /outlet-disclaimers description to reference name values instead of id values for filtering.
  • Fixed GET /products/categories response example — category types now use correct casing (FULL_FEATURE, PRESS_RELEASE, NEWSLETTER, SOCIAL).
  • Fixed POST /orders/checkout — linked_order_line_item_id and discount are now correctly marked as optional. Initial order status corrected from PENDING to CREATED.
  • Fixed GET /campaigns list response — corrected articles[].order_item shape to include nested outlet and addons fields. Added search filter.
  • Fixed GET /campaigns/{campaign_id}/articles response — removed incorrect pagination fields (total_pages, current_page, next_page, previous_page). Only records and total_records are returned.
  • Fixed GET /teams/{team_id}/profiles response — 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, and fetch_all.

GET /outlet-disclaimers (new)

  • New endpoint to list disclaimers with id, name, and description.
  • Use disclaimer IDs when filtering outlets and product listings.

GET /outlets

  • Changed filters[disclaimer] (name) to filters[disclaimer_id] (ID). Use the disclaimer ID from GET /outlet-disclaimers.

March 24, 2026

GET /outlets

  • Added outlet_id field to each record. Use this when calling GET /outlets/{outlet_id}.
  • The existing id field 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, and order_by.

GET /outlets/{outlet_id}

  • Added state and is_indexed fields to the response.
  • Added disclaimer_name and disclaimer_description to outlet_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, not US).

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

On this page