Preview. This site is still being built. Features, prices and terms may change, and nothing here is a binding offer. Read the preview notice

Preview. Still being built; nothing here is a binding offer. Details

Channel management

28 routes. Paths are relative to https://api.intersink.com/v1.

All groups

Fetch my channels

GET/channel

Needs a signed-in user (Bearer token or access_token cookie).

The channels of the active business. has_app=true keeps the channels with a mobile app (a live or test publishable app key that is not revoked or expired, an app-updates setup, or APNs/FCM push credentials); has_app=false keeps the others. With the filter, each channel also carries has_app, and archived channels are left out unless include_archived=true. Both take exactly true or false, once; anything else is a 400.

Parameters

NameTypeDescription
include_archivedstring, queryOne of: "true", "false".
has_appstring, queryOne of: "true", "false".

Response

200. The payload in data is not described in the spec yet. Channels list returned

Create My Channel

POST/channel

Needs a signed-in user (Bearer token or access_token cookie).

Request body application/json

FieldTypeDescription
titlerequiredstringExample: "My Online Store"
descriptionstringExample: "Official channel for our business"
trademark_idnumberId of a trademark registered to a business you manage Minimum 1. Example: 3
category_idstringExample: "uuid-of-category"
business_idstringExample: "uuid-of-business"
linkstringExample: "https://mywebsite.com"
keywordsstringExample: "keyword1, keyword2"

Response

201. The payload in data is not described in the spec yet. Channel created successfully

Settings › App config: names, visibility, public values (managers)

GET/channel/{channelId}/config/entries

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
channelIdrequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Add or replace an entry: { value, visibility: public|secret }

PUT/channel/{channelId}/config/entries/{name}

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
channelIdrequiredstring, path
namerequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Remove an entry

DELETE/channel/{channelId}/config/entries/{name}

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
channelIdrequiredstring, path
namerequiredstring, path

Response

200. The payload in data is not described in the spec yet.

A channel's numbers for a period: orders, revenue by currency, new customers, leads

GET/channel/{channelId}/stats

Needs a signed-in user (Bearer token or access_token cookie).

Channel managers (owner, admins, managers, business admins), or the channel's own server key with orders:read. Every figure is a database aggregate, so it is cheap at any size: use it for dashboards instead of paging /orders/seller. Revenue sums order totals per currency and leaves cancelled orders out. previous is the window of the same length just before.

Parameters

NameTypeDescription
channelIdrequiredstring, path
periodstring, querytoday: start of today in tz until now. 7d / 30d: today and the 6 / 29 days before. custom: from to to (dates, both days included, at most 366 days). One of: "today", "7d", "30d", "custom".
fromstring, queryperiod=custom: first day (YYYY-MM-DD in tz) or an ISO date-time At most 40 characters. Example: "2026-10-01"
tostring, queryperiod=custom: last day, included (YYYY-MM-DD in tz) or an ISO date-time (excluded) At most 40 characters. Example: "2026-10-31"
tzstring, queryIANA time zone the days are counted in At most 64 characters. Example: "Europe/London"

Response

200. data is object (ChannelStatsDto).

FieldTypeDescription
channel_idrequiredstring (uuid)
periodrequiredobject
period.keyrequiredstringOne of: "today", "7d", "30d", "custom". Example: "7d"
period.fromrequiredstring (date-time)Included Example: "2026-10-25T23:00:00.000Z"
period.torequiredstring (date-time)Excluded Example: "2026-11-01T10:30:00.000Z"
period.tzrequiredstringExample: "Europe/London"
currencyrequiredstringThe channel's currency (Settings › General; GBP when unset) Example: "GBP"
ordersrequiredobject
orders.countrequirednumberOrders placed in the period, cancelled ones included Example: 42
orders.cancelledrequirednumberOf those, cancelled now Example: 3
revenuerequiredobject[]Revenue grouped by currency, the channel's own first. Empty when nothing was sold.
revenue[].currencyrequiredstringExample: "GBP"
revenue[].amountrequirednumberSum of order totals in major units: paid (card payment succeeded) or delivered orders only. Cancelled and refunded orders are left out, never subtracted Example: 1234.5
revenue[].amount_minorrequirednumberThe same in minor units (pence, cents) Example: 123450
revenue[].ordersrequirednumberPaid or delivered orders counted in this currency Example: 39
buyersrequirednumberDistinct signed-in buyers who ordered in the period Example: 30
new_customersrequirednumberAccounts that signed up on this channel in the period Example: 12
leadsrequiredobject
leads.openrequirednumberCRM deals open now (not bound to the period) Example: 16
leads.newrequirednumberCRM contacts (leads) created in the period Example: 5
previousrequiredobjectThe window of the same length just before, for comparisons
previous.fromrequiredstring (date-time)
previous.torequiredstring (date-time)
previous.ordersrequiredobject
previous.orders.countrequirednumberOrders placed in the period, cancelled ones included Example: 42
previous.orders.cancelledrequirednumberOf those, cancelled now Example: 3
previous.revenuerequiredobject[]
previous.revenue[].currencyrequiredstringExample: "GBP"
previous.revenue[].amountrequirednumberSum of order totals in major units: paid (card payment succeeded) or delivered orders only. Cancelled and refunded orders are left out, never subtracted Example: 1234.5
previous.revenue[].amount_minorrequirednumberThe same in minor units (pence, cents) Example: 123450
previous.revenue[].ordersrequirednumberPaid or delivered orders counted in this currency Example: 39
previous.new_customersrequirednumberExample: 8
generated_atrequiredstring (date-time)

Fetch my single channel

GET/channel/{id}

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Response

200. The payload in data is not described in the spec yet. Channel details returned

Update my channel

PATCH/channel/{id}

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Request body application/json

FieldTypeDescription
titlestringExample: "My Online Store"
descriptionstringExample: "Official channel for our business"
trademark_idnumberId of a trademark registered to a business you manage Minimum 1. Example: 3
category_idstringExample: "uuid-of-category"
linkstringExample: "https://mywebsite.com"
keywordsstringExample: "keyword1, keyword2"

Response

200. The payload in data is not described in the spec yet. Channel updated successfully

Web origins this channel's browser apps may call the API from

GET/channel/{id}/allowed-origins

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Add an origin (https://host[:port], or http://localhost:* for development)

POST/channel/{id}/allowed-origins

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Request body application/json

FieldTypeDescription
originrequiredstringExample: "https://web.example.com"

Response

200. The payload in data is not described in the spec yet.

Remove an origin (?origin=, or body { origin })

DELETE/channel/{id}/allowed-origins

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path
originrequiredstring, query

Response

200. The payload in data is not described in the spec yet.

Turn credentialed CORS (cookies) on or off for this channel's origins

PUT/channel/{id}/allowed-origins/credentials

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Request body application/json

FieldTypeDescription
allow_credentialsrequiredbooleanAnswer Access-Control-Allow-Credentials for these origins (cookies). Off by default: apps that send a Bearer token don't need it.

Response

200. The payload in data is not described in the spec yet.

Archive a channel (owner only). Channels are never deleted.

POST/channel/{id}/archive

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Request body application/json

FieldTypeDescription
reasonstringAt most 500 characters. Example: "Brand retired"

Response

200. The payload in data is not described in the spec yet.

The channel's calendar booking types, for every member (no settings access needed)

GET/channel/{id}/booking-types

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Custom domains of a channel with their TXT challenge

GET/channel/{id}/domains

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Add a custom domain; returns the TXT record to create

POST/channel/{id}/domains

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Request body application/json

FieldTypeDescription
domainrequiredstringAt most 253 characters. Example: "shop.example.com"

Response

201. The payload in data is not described in the spec yet.

Remove a domain (archived, never deleted)

DELETE/channel/{id}/domains/{domainId}

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path
domainIdrequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Check the TXT record in DNS and mark the domain verified

POST/channel/{id}/domains/{domainId}/verify

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path
domainIdrequiredstring, path

Response

200. The payload in data is not described in the spec yet.

Channel settings (all sections, or ?section=)

GET/channel/{id}/settings

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path
sectionstring, queryOne of: "general", "channel", "notifications", "languages", "privacy", "protection", "auth", "usernames", "calendar", "branding", "web", "system".

Response

200. The payload in data is not described in the spec yet.

Change keys of one settings section (schema-validated)

PATCH/channel/{id}/settings

Needs a signed-in user (Bearer token or access_token cookie).

Parameters

NameTypeDescription
idrequiredstring, path

Request body application/json

FieldTypeDescription
sectionrequiredstringOne of: "general", "channel", "notifications", "languages", "privacy", "protection", "auth", "usernames", "calendar", "branding", "web", "system". Example: "general"
valuesrequiredobjectKeys of the section to change; each is validated against the section schema

Response

200. The payload in data is not described in the spec yet.

Public: everything an app needs at start from its app key

GET/channel/app-config

Public: no sign-in needed.

Send the channel's publishable app key as X-App-Key. The same answer as /channel/key-info: the channel's public fields (id, title, logo, domain, installed app ids), signup (open | restricted | closed), branding, currency (ISO 4217, GBP when unset), media, app_key.mode, and config: the entries marked public in Settings › App config (NAME → value; secrets never). Before 1 Nov 2026 this route answered only the config map.

Response

200. data is object (AppKeyChannelDto).

FieldTypeDescription
idrequiredstring (uuid)Example: "65a4a10a-a7d0-4037-abc2-04445fedf8bb"
titlerequiredstringExample: "Acme Store"
descriptionstringExample: "Official channel of Acme"
logostringExample: "https://cdn.example.com/logo.png"
iconstring
coverstring
domainstringExample: "shop.example.com"
linkstringExample: "https://shop.example.com"
keywordsstringExample: "fashion, retail"
categoryobject
category.namerequiredstringExample: "Retail"
businessobject
business.tradenamerequiredstringExample: "Acme Trading"
business.logostring
appsrequiredstring[]Ids of the apps installed on the channel
signuprequiredstringWho may create an account here: a sign-up page can say "by invitation" up front One of: "open", "restricted", "closed". Example: "open"
brandingrequiredobjectSettings › Branding: theme colours, fonts and tracking ids, each with its default when unset
currencyrequiredstringISO 4217 currency the channel prices and settles in (Settings › General; GBP when unset). Orders are stamped with it. Example: "GBP"
mediarequiredobjectHow to ask the CDN for a sized image (docs/storage.md › Sized images)
app_keyrequiredobject
app_key.moderequiredstringA test app key only reads One of: "live", "test". Example: "live"
configrequiredobjectEntries marked public in Settings › App config (NAME → value). Secrets never.

Server: every config entry of the key's channel, secrets included (NAME → value)

GET/channel/config

Needs a signed-in user (Bearer token or access_token cookie).

For the channel's own servers: a secret API key of the channel with scope channel:config:read. Cache it; never ship it to a browser or app.

Response

200. The payload in data is of type object.

Server: the value the channel's site serves at /.well-known/kodkila-challenge for a host

GET/channel/domain-challenge

Public: no sign-in needed.

HTTP proof of a custom domain: the channel's own site answers GET https://<host>/.well-known/kodkila-challenge (the pre-rename /.well-known/westmonk-challenge is still checked until go-live + 90 days) with this value, then Verify in the domain settings (or the site's Domains card) succeeds. Send a secret server key of the channel (Bearer, any scope) or its app key (X-App-Key). Only pending domains of that same channel; 404 otherwise.

Parameters

NameTypeDescription
hostrequiredstring, queryExample: "example.com"

Response

200. The payload in data is not described in the spec yet.

Public: the channel an app key belongs to

GET/channel/key-info

Public: no sign-in needed.

Send the channel's publishable app key as X-App-Key. Answers the same public fields as /channel/resolve (title, logo, domain, installed app ids, sign-up mode, branding), so an app needs no separate channel id.

Response

200. data is object (AppKeyChannelDto).

FieldTypeDescription
idrequiredstring (uuid)Example: "65a4a10a-a7d0-4037-abc2-04445fedf8bb"
titlerequiredstringExample: "Acme Store"
descriptionstringExample: "Official channel of Acme"
logostringExample: "https://cdn.example.com/logo.png"
iconstring
coverstring
domainstringExample: "shop.example.com"
linkstringExample: "https://shop.example.com"
keywordsstringExample: "fashion, retail"
categoryobject
category.namerequiredstringExample: "Retail"
businessobject
business.tradenamerequiredstringExample: "Acme Trading"
business.logostring
appsrequiredstring[]Ids of the apps installed on the channel
signuprequiredstringWho may create an account here: a sign-up page can say "by invitation" up front One of: "open", "restricted", "closed". Example: "open"
brandingrequiredobjectSettings › Branding: theme colours, fonts and tracking ids, each with its default when unset
currencyrequiredstringISO 4217 currency the channel prices and settles in (Settings › General; GBP when unset). Orders are stamped with it. Example: "GBP"
mediarequiredobjectHow to ask the CDN for a sized image (docs/storage.md › Sized images)
app_keyrequiredobject
app_key.moderequiredstringA test app key only reads One of: "live", "test". Example: "live"
configrequiredobjectEntries marked public in Settings › App config (NAME → value). Secrets never.

Server: the channel a secret API key belongs to, with the key's mode and scopes

GET/channel/me

Needs a signed-in user (Bearer token or access_token cookie).

Any secret API key of the channel (no scope needed). Same public fields as /channel/key-info.

Response

200. The payload in data is not described in the spec yet.

Public: Fetch a published channel by exact domain or id (Query Param)

GET/channel/public

Public: no sign-in needed.

Parameters

NameTypeDescription
domainstring, queryExample: "svayam.in"
idstring, queryExample: "65a4a10a-a7d0-4037-abc2-04445fedf8bb"
searchrequiredstring, query

Response

200. The payload in data is not described in the spec yet. Channel details returned

Public: Fetch a published channel by exact domain or id (Route Param)

GET/channel/public/domain/{domain}

Public: no sign-in needed.

Parameters

NameTypeDescription
domainrequiredstring, path

Response

200. The payload in data is not described in the spec yet. Channel details returned

Public: resolve the channel serving a hostname

GET/channel/resolve

Public: no sign-in needed.

Entry point for storefronts/apps. Looks up the EXACT lowercase hostname in the domain collection (published/active/verified rows), then falls back to channel.domain. Only published/active channels are returned, and only public fields (no owner, contact, IP or banking data).

Parameters

NameTypeDescription
hostrequiredstring, queryExample: "shop.example.com"

Response

200. The payload in data is not described in the spec yet. The public channel for this host