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=...).
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:
| Header | Description |
|---|---|
X-Total-Count | Total document count matching your filters, across all pages. |
X-Total-Pages | Total number of pages at the current page size. |
X-Result-Count | Number of documents in this specific response. |
Items
Several item endpoints share the same set of filter parameters — all optional:
| Parameter | Description |
|---|---|
consignorId | Filter to items from a specific consignor. |
department | Filter to a specific department. |
category | Filter to a specific category. |
subcat | Filter to a specific subcategory. |
tags | Filter to items with this tag. |
sku | Filter to an exact SKU. |
skuStartsWith | Filter to SKUs starting with this value. |
title | Filter to an exact title. |
titleLowerStartsWith | Filter to titles starting with this value (case-insensitive). |
storageLocation | Filter to an exact bin location. |
storageLocationStartsWith | Filter to bin locations starting with this value. |
isReplica | Filter to replica items only. |
startMsec / endMsec | Filter to items created in this time range (epoch milliseconds). |
orderBy | Sort 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.
| Parameter | Required | Description |
|---|---|---|
prune | No | Boolean. 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.
| Parameter | Required | Description |
|---|---|---|
startMsec / endMsec | No | Time range (epoch milliseconds). |
query | No | Filter to an exact search term. |
queryStartsWith | No | Filter to search terms starting with this value. |
isAdmin | No | 'true' or 'false' — filter to searches made from the Dashboard vs. the webstore. |
orderBy | No | Sort order. |
Responds with: JSON (default) or CSV.
GET /item-activity — list
Exports the item activity log (who changed what, and when).
| Parameter | Required | Description |
|---|---|---|
startMsec / endMsec | No | Time range (epoch milliseconds). |
userId | No | Filter to a specific admin user. |
itemId | No | Filter to a specific item. |
actionType | No | Filter to a specific action type. |
orderBy | No | Sort order. |
Responds with: JSON (default) or CSV.
Bin Locations
GET /bin-locations — list
Exports your bin location records.
| Parameter | Required | Description |
|---|---|---|
timezone | Yes | IANA timezone name (e.g. America/Los_Angeles), used to format dates in the export. |
id / idStartsWith | No | Filter by location ID. |
titleLower / titleLowerStartsWith | No | Filter by location name. |
startMsec / endMsec | No | Time range (epoch milliseconds). |
orderBy | No | Sort order. |
Responds with: JSON (default) or CSV.
Quote Requests
GET /quote-requests — list
Exports quote requests.
| Parameter | Required | Description |
|---|---|---|
company / companyLowerStartsWith | No | Filter by company name. |
production / productionLowerStartsWith | No | Filter by production name. |
title / titleLowerStartsWith | No | Filter by quote request title. |
userId | No | Filter to a specific user. |
userNameLowerStartsWith | No | Filter by requesting user's name. |
isResolved | No | '0' or '1'. |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
companyNameLower | No | Filter to an exact company name match (case-insensitive). |
companyNameLowerStartsWith | No | Filter to company names starting with this value. |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
companyId | No | Filter to accounts belonging to a specific company. |
customerNameLower | No | Filter to an exact account name match. |
customerNameLowerStartsWith | No | Filter to account names starting with this value. |
range | No | 'Created', 'Starts', or 'Wraps' — which date field startMsec/endMsec filters on. |
startMsec / endMsec | No | Time range (epoch milliseconds), used with range. |
status | No | 'Active', 'Wrapped', or 'Unknown Wrap Date' — shorthand for a wrap-date filter. Overrides range, companyId, and the name filters. |
orderBy | No | Sort 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). |
limit | No | Maximum 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.
| Parameter | Required | Description |
|---|---|---|
customerId | No | Filter to a specific customer. |
customerNameLower / customerNameLowerStartsWith | No | Filter by customer name. |
idNumber | No | Filter to a specific order number. |
purchaseOrder | No | Filter to a specific PO number. |
titleLower / titleLowerStartsWith | No | Filter by order title. |
salesRepUserId | No | Filter to a specific sales rep. |
status | No | One or more order statuses. |
invoiceStatus | No | One or more invoice statuses. |
range | No | '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 / endMsec | No | Time range (epoch milliseconds). |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
consignorId | No | Filter to a specific consignor. |
customerId | No | Filter to a specific customer. |
orderIdNumber | No | Filter to a specific order number. |
itemSku | No | Filter to an exact item SKU. |
itemSkuStartsWith | No | Filter to item SKUs starting with this value. |
itemTitle | No | Filter to an exact item title. |
itemTitleLowerStartsWith | No | Filter to item titles starting with this value (case-insensitive). |
itemStorageLocation | No | Filter to an exact bin location. |
itemStorageLocationStartsWith | No | Filter to bin locations starting with this value. |
status | No | One or more line item statuses, or a grouping shorthand: 'Pending', 'Booked', or 'Outstanding'. |
range | No | '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 / endMsec | No | Time range (epoch milliseconds). |
type | No | Line item type filter. |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
customerName | No | Filter by customer name. |
companyName | No | Filter by company name. |
idNumber | No | Filter to a specific invoice number. |
status | No | One or more invoice statuses. |
startMsec / endMsec | No | Time range (epoch milliseconds). |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
startAt / endAt | No | Time range. |
invoiceStatuses | No | One or more invoice statuses. |
Responds with: JSON (default) or CSV.
Deposits
GET /deposits — list
Exports security deposits.
| Parameter | Required | Description |
|---|---|---|
startMsec / endMsec | No | Time range (epoch milliseconds). |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
email | No | Filter to an exact email address (lower-cased before matching). |
emailLowerStartsWith | No | Filter to email addresses starting with this value. |
orderByName | No | Filter to an exact user name (lower-cased before matching). |
nameLowerStartsWith | No | Filter to names starting with this value. |
role | No | admin to return only users who have Dashboard access. |
status | No | One of Approved, Pending, or Denied. (Authorized is accepted as a legacy spelling of Approved.) |
title | No | One or more job titles, e.g. Set Decorator. Repeat the parameter to pass more than one (up to 30). |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
consignorNameLower | No | Filter to an exact match (lowercase). |
consignorNameLowerStartsWith | No | Filter to names starting with this value. |
orderBy | No | Sort 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.
| Parameter | Required | Description |
|---|---|---|
consignorId | No | Filter to a specific consignor. When used, orderBy must be createdAt:desc (the default). |
orderBy | No | Sort 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.
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.
| Parameter | Required | Description |
|---|---|---|
fullname | No | Filter to an exact match. |
fullnameLowerStartsWith | No | Filter to names starting with this value. |
title | No | Filter to an exact match. |
titleLowerStartsWith | No | Filter to titles starting with this value. |
identifier | No | Filter to an exact match. |
identifierStartsWith | No | Filter to identifiers starting with this value. |
isFeatured | No | 'true' or 'false'. |
orderBy | No | Sort order. One of fullnameLower, identifier, or titleLower, each :asc / :desc. Defaults to createdAt:desc. |
Responds with: JSON (default) or CSV.