Go to App
channels/custom-rest

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 products
  • POST /admin/products → create/update from the JSON below
  • Authorization: Bearer <API_KEY>

Optional but useful: GET /admin/store so Destinations can show the store name after connect.

Payload spec

json
{
  "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

code
Authorization: Bearer <API_KEY>
Content-Type: application/json

Reject 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.