Consignify API v1

RESTful API for managing consignors, products and payouts in your Shopify store.

Authentication

All requests require a Bearer token generated in the Consignify app settings. Include it in the Authorization header:

Authorization: Bearer <api_key>
Base URL
https://consignify.shop/api/v1
Endpoints

Consignors

GET/consignors

List all consignors in the shop.

Response:
[ { "id": "w13v…", "givenName": "Ludwig", "surname": "van Beethoven", "key": "Beethoven" }, { "id": "vr0z…", "givenName": "Galileo", "surname": "Galilei", "key": "Galileo" } ]
POST/consignors

Create a consignor. Only <code>key</code> is required; all other fields are optional.

Request Body:
{ "key": "test-123", "email": "friend@example.com", "unsoldItemFate": "DONATE" }
Response:
{ "id": "c804crn7lgesjc1fshf3b0bb", "key": "test-123", "shopId": "efrus-test-store3.myshopify.com", "givenName": null, "surname": null, "share": null, "email": "friend@example.com", "phone": null, "notes": null, "unsoldItemFate": "DONATE", "createdAt": "2025-07-31T16:42:00.000Z", "updatedAt": "2025-07-31T16:42:00.000Z", "archived": false, "portalEnabled": "SHOP_DEFAULT" }
GET/consignor/{id}

Get a single consignor by id.

Response:
{ "id": "w13vmscy6j5uub1taivtmp5i", "key": "Beethoven", "shopId": "efrus-test-store3.myshopify.com", "givenName": "Docs", "surname": "Sample", "share": null, "email": "hello+beethoven@consignify.shop", "phone": null, "notes": null, "unsoldItemFate": "DONATE", "createdAt": "2025-07-31T15:53:56.499Z", "updatedAt": "2025-07-31T16:40:30.883Z", "archived": false, "portalEnabled": "SHOP_DEFAULT" }
PATCH/consignor/{id}

Update any consignor field.

Request Body:
{ "givenName": "Docs", "surname": "Sample" }
Response:
{ "id": "w13v…", "key": "Beethoven", "shopId": "efrus-test-store3.myshopify.com", "givenName": "Docs", "surname": "Sample", "share": null, "email": "hello+beethoven@consignify.shop", "phone": null, "notes": null, "unsoldItemFate": "DONATE", "createdAt": "2025-07-31T15:53:56.499Z", "updatedAt": "2025-07-31T16:40:30.883Z", "archived": false, "portalEnabled": "SHOP_DEFAULT" }
GET/consignor/{id}/products

All products associated with this consignor.

Response:
[ { "id": "14985358311805", "title": "The 3p Fulfilled Snowboard", "status": "ACTIVE", "totalInventory": 19, "consignerShare": null, "shopifyUpdatedAt": "2025-07-28T17:58:04.000Z" }, { "id": "14985358082429", "title": "The Videographer Snowboard", "status": "ACTIVE", "totalInventory": 46, "consignerShare": null, "shopifyUpdatedAt": "2025-07-28T17:58:05.000Z" } ]
POST/consignor/{id}/products

Bulk assign products to the consignor. Streaming 202 response returns progress lines.

Request Body:
[ 14985358082429, 14985358016893 ]
Response:
text/plain stream
GET/consignor/{id}/payouts

List payouts paid to this consignor.

Response:
[ { "id": "ovfjhrqu1e6on4eta4wqq6sw", "shopId": "efrus-test-store3.myshopify.com", "reference": "#R1001", "amount": 1067.94, "adjustment": 0, "currencyCode": "GBP", "paidAt": "2025-07-31T15:55:01.660Z", "signatureId": null, "createdAt": "2025-07-31T15:55:01.662Z", "note": "", "updatedAt": "2025-07-31T15:55:03.624Z", "consignerId": "w13vmscy6j5uub1taivtmp5i", "receiptSentAt": "2025-07-31T15:55:03.623Z", "receiptStatus": "SENT", "receiptStatusReason": null } ]

Products

GET/products?limit=100&cursor=<optional>

Paginated list of products.

Response:
{ "data": [ { "id": "14985357918589", "updatedAt": "2025-07-31T15:54:23.392Z", "shopId": "efrus-test-store3.myshopify.com", "consignerId": null, "shopifyUpdatedAt": "2025-07-28T17:58:05.000Z", "consignerShare": null, "status": "ACTIVE", "totalInventory": 8, "title": "The Compare at Price Snowboard" },...], "nextCursor": "14985…" }
GET/product/{id}

Single product details.

Response:
{ "id": "14985357918589", "updatedAt": "2025-07-31T15:54:23.392Z", "shopId": "efrus-test-store3.myshopify.com", "consignerId": null, "shopifyUpdatedAt": "2025-07-28T17:58:05.000Z", "consignerShare": null, "status": "ACTIVE", "totalInventory": 8, "title": "The Compare at Price Snowboard" }
GET/product/{id}/consignor

Consignor assigned to this product or null.

Response:
null | { id, key, givenName, … }
POST/product/{id}/consignor

Assign or clear consignor for product. Either pass { key } or { id }.

Request Body:
{ "key": "Beethoven" }
Response:
HTTP 201 (empty body)
GET/product/{id}/share

Current consignor share percentage.

Response:
{ "share": 50 }
POST/product/{id}/share

Set consignor share percentage (0-100).

Request Body:
{ "share": 45 }
Response:
HTTP 201 (empty body)
GET/product/{id}/items?limit=100&cursor=<optional>

Paginated order line-items for this product.

Response:
{ "data": [ { "id": "34838143369597", "orderId": "11725356106109", "productId": "14985357918589", "variantId": "55263182029181", "sku": null, "originalQuantity": 1, "currentQuantity": 1, "unitPrice": 785.95, "unitPriceDiscounted": 785.95, "currencyCode": "GBP", "isFulfilled": true, "fulfillmentCreatedAt": "2025-03-04T11:24:56.000Z", "fulfillmentLastUpdatedAt": "2025-03-04T11:24:56.000Z", "itemPayout": null }, ...], "nextCursor": null }
GET/product/{id}/payouts

Payout line-items for this product.

Response:
[] | [ { id, consignerSharePct, quantity, amount, payout: { id, reference } } ]

Payouts

GET/payouts?limit=100&cursor=<optional>

Paginated list of payouts for the shop.

Response:
{ "data": [ { "id": "ovfj…", "reference": "#R1001", … } ], "nextCursor": null }
POST/payouts

Create a payout (zero or more lineItems).

Request Body:
{ "consignerId": "w13v…", "amount": 0, "lineItems": [] }
Response:
{ "id": "lsl…", "reference": "#R1003", "amount": 0, … }
GET/payout/{id}

Get payout details including line items.

Response:
{ "id": "lsl…", "reference": "#R1003", "payoutLineItems": [] }
DELETE/payout/{id}

Delete payout.

Response:
HTTP 204 (no content)
Error Handling

The API uses standard HTTP status codes. Error responses are JSON bodies with a message or errors field.

400Bad Request – Invalid request data
401Unauthorized – Invalid or missing API key
404Not Found
405Method Not Allowed
500Internal Server Error