Custom Webstore (REST API)
Payload contract, headers, and how a store you operate receives canonical products.
What you must implement
Custom REST is for **your** HTTP API, not a way to reach undocumented marketplaces. Implement (or reuse Medusa Admin):
GET /health→ 200 when ready to receive productsPOST /admin/products→ create/update from the JSON belowAuthorization: Bearer <API_KEY>
Optional but useful: GET /admin/store so Destinations can show the store name after connect.
Payload spec
{
"title": "Nordic Jacket",
"description": "Insulated shell with taped seams.",
"handle": "rw0001-nordic-jacket",
"status": "published",
"images": [{ "url": "https://cdn.example/jacket.jpg" }],
"options": [{ "title": "Color", "values": ["Black", "Navy"] }],
"variants": [{
"title": "Black / M",
"sku": "RW0001-BLA-M",
"prices": [{ "amount": 7999, "currency_code": "usd" }],
"options": { "Color": "Black", "Size": "M" },
"inventory_quantity": 24
}]
}Amounts are minor units. Currency codes are lowercase ISO 4217 as in the canonical product.
Headers
Authorization: Bearer <API_KEY>
Content-Type: application/jsonReject requests without a Bearer in your API. eListSync will surface 401 in the sync log.
Health endpoints
Destinations will not save a Base URL that fails health. Return JSON or empty 200 — status code is what we check.
Point eListSync at it
Destinations → Custom Open-Source Webstore → Base API URL + API key. Publish a single SKU first. If your API returns 422, copy the body into the support ticket or fix the handler; the sync log stores the response summary.