Skip to main content

Endpoints

Every endpoint below is a GET request scoped to your account. See Authentication for how to authenticate and find your Vendor ID.

All paths are relative to:

https://propcart.com/api/v1/vendors/{vendorId}

{vendorId} is always required and is part of the URL path, not a query parameter. Everything else listed below is passed as a query string parameter (for example, ?startMsec=...&endMsec=...).

info

This list only covers what's callable with a secret key today. It will grow as more of the API opens up to read-only access.

Response format​

Every endpoint returns JSON by default, shaped as { "data": [...] }. Send an Accept: text/csv header to get the same data as a CSV file instead — matching what you'd get from the corresponding export button in the Dashboard.

Errors​

Errors are returned as JSON, shaped as { "error": { "message": "..." } }, with a 4xx/5xx status code.

Rate Limits​

Each secret key is limited to 60 requests per minute, 1,000 requests per hour, and 5,000 requests per day. Every response includes headers showing your current status:

X-RateLimit-Limit-Minute: 60
X-RateLimit-Remaining-Minute: 59
X-RateLimit-Reset-Minute: 1690000000
X-RateLimit-Limit-Hour: 1000
X-RateLimit-Remaining-Hour: 999
X-RateLimit-Reset-Hour: 1690000000
X-RateLimit-Limit-Day: 5000
X-RateLimit-Remaining-Day: 4999
X-RateLimit-Reset-Day: 1690000000

X-RateLimit-Reset-* is a Unix timestamp (seconds) for when that window resets. Exceeding any limit returns a 429 (in the standard { "error": { "message": "..." } } shape) with a Retry-After header giving the number of seconds to wait before retrying.

Pagination​

Endpoints marked list below cap out at 10,000 records per response. If there's another page, the response includes a Link header (per RFC 8288):

Link: </v1/vendors/{vendorId}/items?cursor=...>; rel="next"

Follow that URL, with the same Authorization (and Accept, if you're requesting CSV) headers, to get the next page. Keep following Link headers until a response doesn't include one — that's the last page. Endpoints marked single page below always return everything in one response and never paginate.

In addition to the Link header, every response includes:

HeaderDescription
X-Total-CountTotal document count matching your filters, across all pages.
X-Total-PagesTotal number of pages at the current page size.
X-Result-CountNumber of documents in this specific response.

Items​

Several item endpoints share the same set of filter parameters — all optional:

ParameterDescription
consignorIdFilter to items from a specific consignor.
departmentFilter to a specific department.
categoryFilter to a specific category.
subcatFilter to a specific subcategory.
tagsFilter to items with this tag.
skuFilter to an exact SKU.
skuStartsWithFilter to SKUs starting with this value.
titleFilter to an exact title.
titleLowerStartsWithFilter to titles starting with this value (case-insensitive).
storageLocationFilter to an exact bin location.
storageLocationStartsWithFilter to bin locations starting with this value.
isReplicaFilter to replica items only.
startMsec / endMsecFilter to items created in this time range (epoch milliseconds).
orderBySort order. One of createdAt:desc, orderByTitle:asc, price_createdAt:asc, price_createdAt:desc, sku:asc, sku:desc, storageLocation:asc, or supplierLower:asc. Defaults to createdAt:desc.

GET /items — list​

Exports your inventory, honoring the Items filters above.

Responds with: JSON (default) or CSV.

GET /items/bundles — list​

Exports package/bundle items and their components, honoring the Items filters above.

Responds with: JSON (default) or CSV.

GET /items/tag-counts — single page​

Exports a count of how many items use each tag.

ParameterRequiredDescription
pruneNoBoolean. If true, removes unused tags from your account while generating the export.

Responds with: JSON (default) or CSV.

GET /items/category-counts — single page​

Exports a count of items per category.

Responds with: JSON (default) or CSV.

GET /items/category-schema-counts — single page​

Exports a count of items per category field/schema.

Responds with: JSON (default) or CSV.

GET /items/category-mismatches — single page​

Exports every item whose assigned department, category, or subcategory is not in your category schema, with the reason. Items with none of the three set are left out.

Responds with: JSON (default) or CSV.

Item Search & Activity​

GET /item-searches/counts — single page​

Exports a facet-usage report: counts for every search filter used on your webstore (colors, tags, size ranges, department/category/subcategory browsing, artist browsing, and free-text search terms), broken out by parameter and value.

Responds with: JSON (default) or CSV.

GET /item-searches/query-counts — single page​

Exports the most common search terms and filters (i.e. query parameters) your webstore visitors have used.

Responds with: JSON (default) or CSV.

GET /item-searches — list​

Exports raw item search log entries.

ParameterRequiredDescription
startMsec / endMsecNoTime range (epoch milliseconds).
queryNoFilter to an exact search term.
queryStartsWithNoFilter to search terms starting with this value.
isAdminNo'true' or 'false' — filter to searches made from the Dashboard vs. the webstore.
orderByNoSort order.

Responds with: JSON (default) or CSV.

GET /item-activity — list​

Exports the item activity log (who changed what, and when).

ParameterRequiredDescription
startMsec / endMsecNoTime range (epoch milliseconds).
userIdNoFilter to a specific admin user.
itemIdNoFilter to a specific item.
actionTypeNoFilter to a specific action type.
orderByNoSort order.

Responds with: JSON (default) or CSV.

Bin Locations​

GET /bin-locations — list​

Exports your bin location records.

ParameterRequiredDescription
timezoneYesIANA timezone name (e.g. America/Los_Angeles), used to format dates in the export.
id / idStartsWithNoFilter by location ID.
titleLower / titleLowerStartsWithNoFilter by location name.
startMsec / endMsecNoTime range (epoch milliseconds).
orderByNoSort order.

Responds with: JSON (default) or CSV.

Quote Requests​

GET /quote-requests — list​

Exports quote requests.

ParameterRequiredDescription
company / companyLowerStartsWithNoFilter by company name.
production / productionLowerStartsWithNoFilter by production name.
title / titleLowerStartsWithNoFilter by quote request title.
userIdNoFilter to a specific user.
userNameLowerStartsWithNoFilter by requesting user's name.
isResolvedNo'0' or '1'.
orderByNoSort order.

Responds with: JSON (default) or CSV.

GET /quote-requests/{quoteRequestId} — single page​

Exports the line items of a single quote request.

Responds with: JSON (default) or CSV.

Companies​

GET /companies — list​

Exports your company records.

ParameterRequiredDescription
companyNameLowerNoFilter to an exact company name match (case-insensitive).
companyNameLowerStartsWithNoFilter to company names starting with this value.
orderByNoSort order. One of companyNameLower, createdAt, customerCount, or totalRevenue, each :asc / :desc.

Responds with: JSON (default) or CSV.

Accounts​

GET /customers — list​

Exports your account records.

ParameterRequiredDescription
companyIdNoFilter to accounts belonging to a specific company.
customerNameLowerNoFilter to an exact account name match.
customerNameLowerStartsWithNoFilter to account names starting with this value.
rangeNo'Created', 'Starts', or 'Wraps' — which date field startMsec/endMsec filters on.
startMsec / endMsecNoTime range (epoch milliseconds), used with range.
statusNo'Active', 'Wrapped', or 'Unknown Wrap Date' — shorthand for a wrap-date filter. Overrides range, companyId, and the name filters.
orderByNoSort order. One of balance:asc, balance:desc, companyNameLower:asc, createdAt:asc, createdAt:desc, customerNameLower:asc, endDate:asc, endDate:desc, startDate:asc, or startDate:desc. Defaults to customerNameLower:asc (or your default account sort set in your Account Settings).
limitNoMaximum number of records to return per page (up to 10,000, the default).

Responds with: JSON (default) or CSV.

GET /customers/contacts — list​

Exports individual account contacts (as opposed to the account/company records themselves).

Responds with: JSON (default) or CSV.

Orders​

GET /orders — list​

Exports orders.

ParameterRequiredDescription
customerIdNoFilter to a specific customer.
customerNameLower / customerNameLowerStartsWithNoFilter by customer name.
idNumberNoFilter to a specific order number.
purchaseOrderNoFilter to a specific PO number.
titleLower / titleLowerStartsWithNoFilter by order title.
salesRepUserIdNoFilter to a specific sales rep.
statusNoOne or more order statuses.
invoiceStatusNoOne or more invoice statuses.
rangeNo'Pickup', 'Return', or 'Updated' — which date field startMsec/endMsec filters on. They must be used with their respective orderBy sort order or no orderBy (which will be selected automatically).
startMsec / endMsecNoTime range (epoch milliseconds).
orderByNoSort order. One of customerNameLower:asc, idNumber:asc, idNumber:desc, pickupDate:asc, purchaseOrder:asc, returnDate:asc, titleLower:asc, or updatedAt:desc. Defaults to idNumber:desc. Use updatedAt:desc with range='Updated', startMsec and endMsec to poll for recently changed orders; every other filter is ignored in that mode.

Responds with: JSON (default) or CSV.

GET /orders/{orderId}/line-items — single page​

Exports the line items for a single order.

Responds with: JSON (default) or CSV.

Line Items​

GET /line-items — list​

Exports line-items.

ParameterRequiredDescription
consignorIdNoFilter to a specific consignor.
customerIdNoFilter to a specific customer.
orderIdNumberNoFilter to a specific order number.
itemSkuNoFilter to an exact item SKU.
itemSkuStartsWithNoFilter to item SKUs starting with this value.
itemTitleNoFilter to an exact item title.
itemTitleLowerStartsWithNoFilter to item titles starting with this value (case-insensitive).
itemStorageLocationNoFilter to an exact bin location.
itemStorageLocationStartsWithNoFilter to bin locations starting with this value.
statusNoOne or more line item statuses, or a grouping shorthand: 'Pending', 'Booked', or 'Outstanding'.
rangeNo'Pickup', 'Return', 'Returned', or 'Updated' — which date field startMsec/endMsec filters on. They must be used with their respective orderBy sort order or no orderBy (which will be selected automatically).
startMsec / endMsecNoTime range (epoch milliseconds).
typeNoLine item type filter.
orderByNoSort order. One of createdAt:desc, item.orderByTitle:asc, item.sku:asc, item.storageLocation:asc, orderIdNumber:asc, orderIdNumber:desc, pickupDate:asc, returnDate:asc, returnedAt:desc or updatedAt:desc. Defaults to createdAt:desc. Use returnedAt:desc / updatedAt:desc with range='Returned' / range='Updated', startMsec and endMsec to poll for recently returned or changed line items; every other filter is ignored in that mode.

Responds with: JSON (default) or CSV.

Invoices​

GET /invoices — list​

Exports invoices.

ParameterRequiredDescription
customerNameNoFilter by customer name.
companyNameNoFilter by company name.
idNumberNoFilter to a specific invoice number.
statusNoOne or more invoice statuses.
startMsec / endMsecNoTime range (epoch milliseconds).
orderByNoSort order. One of companyNameLower:asc, customerNameLower:asc, idNumber:asc, idNumber:desc, or transactedAt:desc. Defaults to idNumber:desc.

Responds with: JSON (default) or CSV.

GET /conta-azul-report — list​

Exports invoices in Conta Azul import format.

ParameterRequiredDescription
startAt / endAtNoTime range.
invoiceStatusesNoOne or more invoice statuses.

Responds with: JSON (default) or CSV.

Deposits​

GET /deposits — list​

Exports security deposits.

ParameterRequiredDescription
startMsec / endMsecNoTime range (epoch milliseconds).
orderByNoSort order. Only paidAt:desc is supported (also the default).

Responds with: JSON (default) or CSV.

Users​

GET /users — list​

Exports your admin and webstore users.

ParameterRequiredDescription
emailNoFilter to an exact email address (lower-cased before matching).
emailLowerStartsWithNoFilter to email addresses starting with this value.
orderByNameNoFilter to an exact user name (lower-cased before matching).
nameLowerStartsWithNoFilter to names starting with this value.
roleNoadmin to return only users who have Dashboard access.
statusNoOne of Approved, Pending, or Denied. (Authorized is accepted as a legacy spelling of Approved.)
titleNoOne or more job titles, e.g. Set Decorator. Repeat the parameter to pass more than one (up to 30).
orderByNoSort order. One of createdAt, email, orderByName, stats.quoteRequestCount, stats.customerCount, stats.orderCount, or stats.salesAmount, each :asc / :desc. Defaults to createdAt:desc.

Only one name/email filter applies at a time. When more than one is supplied they are used in this order of precedence: orderByName, nameLowerStartsWith, email, emailLowerStartsWith.

email, orderByName, and role are exact-match filters, so results come back in an unspecified order and orderBy is ignored. nameLowerStartsWith and emailLowerStartsWith are range filters, so they pin the sort to orderByName and email respectively — orderBy only chooses the direction, and any other sort field is ignored.

Responds with: JSON (default) or CSV.

Newsletter Subscriptions​

GET /newsletter-subscriptions — list​

Exports your newsletter subscriber list.

Responds with: JSON (default) or CSV.

Consignment​

GET /consignors — list​

Exports your consignor records.

ParameterRequiredDescription
consignorNameLowerNoFilter to an exact match (lowercase).
consignorNameLowerStartsWithNoFilter to names starting with this value.
orderByNoSort order. One of consignorNameLower, createdAt, itemCount, contractCount, statementCount, totalAmount, or balance, each :asc / :desc. Defaults to createdAt:desc.

Responds with: JSON (default) or CSV.

GET /statements — list​

Exports consignor statements — the periodic revenue-share settlements you issue to a consignor, one row per statement, with its period, totals, and outstanding balance.

ParameterRequiredDescription
consignorIdNoFilter to a specific consignor. When used, orderBy must be createdAt:desc (the default).
orderByNoSort order. One of createdAt, idNumber, consignorNameLower, startAt, totalAmount, consignorPercent, consignorShare, vendorAmount, paidAmount, or balance, each :asc / :desc. Defaults to createdAt:desc.

Each statement's captured line items and its activity log are omitted from this export. Statement line items are a snapshot taken when the statement was last captured in the Dashboard; for current line-item detail, use GET /line-items, which reads live data.

Responds with: JSON (default) or CSV.

GET /statements/{statementId}/lines — single page​

Exports the line items captured onto a single statement.

caution

This returns the stored snapshot, not a live calculation. A statement's lines are written when someone captures it in the Dashboard, and they do not change again when the underlying orders, invoices, or line items do — so a statement edited since its last capture exports its older lines. This is the same data the statement PDF and the emailed statement render.

Use this endpoint to audit a statement: diff it against GET /line-items filtered to the same consignor and date range to see what has drifted since the capture. For current figures, use GET /line-items directly.

Every field of the snapshot is exported, including Line Item ID (the line item's id), Order ID, Item ID, and Invoice ID, so rows can be joined against a GET /line-items export.

A statement that has never been captured returns an empty list (or a header-only CSV) rather than an error.

Responds with: JSON (default) or CSV.

GET /artists — list​

Exports your artist/maker records.

ParameterRequiredDescription
fullnameNoFilter to an exact match.
fullnameLowerStartsWithNoFilter to names starting with this value.
titleNoFilter to an exact match.
titleLowerStartsWithNoFilter to titles starting with this value.
identifierNoFilter to an exact match.
identifierStartsWithNoFilter to identifiers starting with this value.
isFeaturedNo'true' or 'false'.
orderByNoSort order. One of fullnameLower, identifier, or titleLower, each :asc / :desc. Defaults to createdAt:desc.

Responds with: JSON (default) or CSV.