Morffeus Docs
morffeus.com

Developer documentation

Build on Morffeus.

Connect your ERP, warehouse, POS or storefront to the platform your business already runs on. One JSON API, one token for your whole app, and your own references on every record so nothing in your systems has to change.

Start here

Three steps from an empty terminal to your first stock update. Ten minutes if the token is ready.

Full walkthrough
1

Get an API token

In Admin, open User › Tokens and create a token. A token belongs to your user and works for the whole app you are integrating. Use a separate token for every system that talks to us, so you can revoke one without touching the others.

Authentication
2

Make your first request

Every call goes to https://api.morffeus.com/api/v2 with an Authorization: Bearer header. Start with GET /products to see your catalog the way the API sees it. Responses are JSON with the payload under data.

Your first request
3

Push your first update

Send a stock change with PUT /int/stocks. Rows match your variants by code, barcode or your own external_ref, and your warehouse by its code. The quantity you send is added to what the warehouse holds.

Stock reference
# list five products of the app the token belongs to
curl "https://api.morffeus.com/api/v2/products?limit=5" \
  -H "Authorization: Bearer $MORFFEUS_TOKEN" \
  -H "Accept: application/json"
const res = await fetch('https://api.morffeus.com/api/v2/products?limit=5', {
  headers: { Authorization: `Bearer ${process.env.MORFFEUS_TOKEN}` }
});
const { data } = await res.json();
console.log(data.products[0].code);
$ch = curl_init('https://api.morffeus.com/api/v2/products?limit=5');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'Authorization: Bearer ' . getenv('MORFFEUS_TOKEN'),
  'Accept: application/json',
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$products = json_decode(curl_exec($ch), true)['data']['products'];
{
  "data": {
    "products": [
      {
        "id": 48213,
        "code": "SKU-1001",
        "slug": "espresso-beans-1-kg",
        "variants": [
          { "id": 91120, "code": "SKU-1001", "barcode": "8600123456789", "external_ref": "ERP-778", … }
        ],
        "prices": [ { "price": 1890.0, … } ],
        …
      },
      …
    ],
    "product_attributes": [ … ],
    "product_data_values": [ … ]
  }
}

What changed

Every addition and every deprecation, dated.

Full changelog
GET /stocks/aggregate returns on-hand, reserved and available stock per variant and per store.Added
PUT /int/stocks changes stock per variant and warehouse, matched by your codes. min_qty sets the minimum of a new stock row.Added
POST /stock/reconcile sets a warehouse to the quantities you counted, in one stock movement.Added