Connect a channel to your own website, apps and tools. A key belongs to one channel and can only do what its scopes allow.
https://api.intersink.com/apiIn a channel, under Settings › API: click Enable API, then pick the key’s scopes. Test keys (wm_test_…) work at once and only read; live keys (wm_live_…) work once the business is verified. The key is shown once.
As X-Api-Key: wm_live_… or Authorization: Bearer wm_live_… on every call. Keys can be limited to your server’s IP addresses.
Add a webhook endpoint and check the Kodkila-Signature header on every delivery.
Every answer is JSON in the same envelope; what you asked for is in data.
{
"success": true,
"statusCode": 200,
"message": "Success",
"data": { … },
"timestamp": "2026-10-15T10:30:00.000Z"
}The message says what went wrong; errors lists invalid fields.
{
"success": false,
"statusCode": 403,
"message": "API key is missing required scope(s): products:write",
"errors": null,
"timestamp": "2026-10-15T10:30:00.000Z",
"path": "/api/products",
"requestId": "6f1c2a90-…"
}The channel itself and its domains. Any key of the channel can call these.
/channel/meThe channel the key belongs toany keycurl -X GET "https://api.intersink.com/api/channel/me" \
-H "X-Api-Key: wm_test_…"/channel/domain-challenge?host=www.example.comThe value your site serves at /.well-known/kodkila-challenge while that domain waits for proof (404 when nothing is pending)any keycurl -X GET "https://api.intersink.com/api/channel/domain-challenge?host=www.example.com" \
-H "X-Api-Key: wm_test_…"The channel’s catalogue: list, search, read, create, change and delete products.
/productsPublished products, paged (page, limit)products:readcurl -X GET "https://api.intersink.com/api/products" \
-H "X-Api-Key: wm_test_…"/products/search?q=linenSearch published products by nameproducts:readcurl -X GET "https://api.intersink.com/api/products/search?q=linen" \
-H "X-Api-Key: wm_test_…"/products/trendingThe newest published productsproducts:readcurl -X GET "https://api.intersink.com/api/products/trending" \
-H "X-Api-Key: wm_test_…"/products/manageEvery product, drafts includedproducts:readcurl -X GET "https://api.intersink.com/api/products/manage" \
-H "X-Api-Key: wm_test_…"/products/slug/{slug}One product by its slugproducts:readcurl -X GET "https://api.intersink.com/api/products/slug/oak-serving-board" \
-H "X-Api-Key: wm_test_…"/products/{id}One product by idproducts:readcurl -X GET "https://api.intersink.com/api/products/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11" \
-H "X-Api-Key: wm_test_…"/productsCreate a productproducts:writecurl -X POST "https://api.intersink.com/api/products" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/products/{id}Change a productproducts:writecurl -X PATCH "https://api.intersink.com/api/products/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/products/{id}Delete a productproducts:writecurl -X DELETE "https://api.intersink.com/api/products/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11" \
-H "X-Api-Key: wm_test_…"Orders customers placed on the channel, and the customers behind them.
/orders/sellerOrders received, newest first, pagedorders:readcurl -X GET "https://api.intersink.com/api/orders/seller" \
-H "X-Api-Key: wm_test_…"/orders/{id}One order with its itemsorders:readcurl -X GET "https://api.intersink.com/api/orders/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11" \
-H "X-Api-Key: wm_test_…"/orders/{id}/trackWhere an order isorders:readcurl -X GET "https://api.intersink.com/api/orders/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11/track" \
-H "X-Api-Key: wm_test_…"/orders/{id}/statusMove an order along: processing, shipped, delivered…orders:writecurl -X PATCH "https://api.intersink.com/api/orders/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11/status" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "status": "shipped" }'/orders/seller/customersCustomers, from their orderscustomers:readcurl -X GET "https://api.intersink.com/api/orders/seller/customers" \
-H "X-Api-Key: wm_test_…"Contacts, deals, pipelines and the timeline of each: what the CRM app keeps for the channel.
/crm/contactsContacts, paged (q, tag, source, sort)crm:readcurl -X GET "https://api.intersink.com/api/crm/contacts" \
-H "X-Api-Key: wm_test_…"/crm/contacts/{id}One contactcrm:readcurl -X GET "https://api.intersink.com/api/crm/contacts/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11" \
-H "X-Api-Key: wm_test_…"/crm/contactsCreate a contact (deduplicated by e-mail and phone)crm:writecurl -X POST "https://api.intersink.com/api/crm/contacts" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/crm/contacts/{id}Change a contactcrm:writecurl -X PATCH "https://api.intersink.com/api/crm/contacts/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/crm/contacts/{id}/timelineEverything that happened with a contactcrm:readcurl -X GET "https://api.intersink.com/api/crm/contacts/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11/timeline" \
-H "X-Api-Key: wm_test_…"/crm/dealsDeals, pagedcrm:readcurl -X GET "https://api.intersink.com/api/crm/deals" \
-H "X-Api-Key: wm_test_…"/crm/deals/boardDeals by pipeline stagecrm:readcurl -X GET "https://api.intersink.com/api/crm/deals/board" \
-H "X-Api-Key: wm_test_…"/crm/dealsCreate a deal (title, contact, pipeline, stage, value)crm:writecurl -X POST "https://api.intersink.com/api/crm/deals" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/crm/deals/{id}/moveMove a deal to another stagecrm:writecurl -X POST "https://api.intersink.com/api/crm/deals/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11/move" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/crm/deals/{id}/closeClose a deal as won or lostcrm:writecurl -X POST "https://api.intersink.com/api/crm/deals/3f6c2a90-7d44-4c1e-9b1a-2f0e8c5d4a11/close" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'/crm/pipelinesPipelines and their stagescrm:readcurl -X GET "https://api.intersink.com/api/crm/pipelines" \
-H "X-Api-Key: wm_test_…"/crm/activitiesNotes, calls, meetings and taskscrm:readcurl -X GET "https://api.intersink.com/api/crm/activities" \
-H "X-Api-Key: wm_test_…"/crm/activitiesLog a note, call, meeting or taskcrm:writecurl -X POST "https://api.intersink.com/api/crm/activities" \
-H "X-Api-Key: wm_test_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Oak Serving Board", "price": "39.00" }'More areas open to keys as they are ready. Everything else is used by the Intersink panel with your signed-in session, not with keys.
Each response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and an X-Request-Id to quote when something goes wrong.
Each delivery is a POST with a JSON body and the header Kodkila-Signature: t=<unix seconds>,v1=<hex> (also sent as Westmonk-Signature, its old name, with the same value), where v1 is HMAC-SHA256 of t + "." + body with your endpoint’s signing secret. Reject signatures older than 5 minutes. While a secret is being rotated the header carries one v1 per secret; accept if any matches. Failed deliveries are retried, and an endpoint is turned off after 15 failures in a row.