What you can build
Everything here runs on the same routes the Intersink console uses. Each part works on its own, so take only what your app needs.
- Channel apps and storefronts
- Sign-in with codes and passkeys
- Products and orders
- CRM and public forms
- Media
- Realtime and push
- App updates server
- Webhooks
- Search and feature flags
Channel apps and storefronts
Your app sends the channel’s publishable app key, and Kodkila answers with that channel’s data: its name and branding, public settings, home page sections, menus, pages and products. The server prices orders and checks stock, so your app only renders what the API returns.
A site on its own domain keeps the session in httpOnly cookies on that domain through a small same-origin route, and browser code holds only the app key. Browser calls are accepted from the channel’s own domains and listed origins.
| Route | What it does |
|---|---|
GET /channel/key-info | The channel an app key belongs to, with branding and installed apps |
GET /channel/app-config | Public settings an app needs at start |
GET /cms/surfaces/{surface} | A published home surface: banners, shortcuts and sections |
GET /profiles/me/data/{ns} | Per-user app data, such as a cart or settings |
Reference: Channel management, CMS public, Profile data
Sign-in with codes and passkeys
A user asks for a 6-digit code, which is valid for 15 minutes, and exchanges it for a session. Web sign-in sets httpOnly cookies; apps get tokens in the body and refresh them. Accounts with two-step sign-in finish with an authenticator code, an emailed code or a passkey.
Passkeys work per domain: a passkey made on your site works on that site. Users can also sign in with a passkey alone.
| Route | What it does |
|---|---|
POST /auth/request-otp | Send a sign-in code |
POST /auth/login-app | Exchange the code for tokens (apps and servers) |
POST /auth/passkey/login/options | Start a passkey sign-in |
POST /auth/refresh-app | Get new tokens with the refresh token |
Reference: Authentication and profile, Sign-in methods
Products and orders
List and search published products, check a coupon against a cart, and place an order with an idempotency key so a retry never charges twice. Sellers move orders through their states, and webhooks tell your server when an order is created or changes.
On the preview host, payments run in demo mode: a hosted demo page stands in for the card step and no money moves.
| Route | What it does |
|---|---|
GET /products | Published products of a channel, paged |
POST /coupons/channels/{channelId}/validate | What a code takes off a cart |
POST /orders | Place an order |
PATCH /orders/{id}/status | Move an order along (seller) |
Reference: Products, Orders, Coupons, Payments (demo)
CRM and public forms
The CRM keeps contacts, pipelines with ordered stages, deals and an activity timeline, with CSV import and export. A contact or enquiry form on your site can post straight from the browser with the app key: you define the form once on the channel, and each submission becomes a lead or a job application.
Public forms need a Cloudflare Turnstile check, with both keys stored in the channel’s settings.
| Route | What it does |
|---|---|
PUT /forms/channels/{channelId}/definitions/{formKey} | Define a form (channel managers) |
POST /public/forms/{formKey}/submit | Send a form from the browser with the app key |
POST /crm/public/{channelId}/leads | Add a lead from your own server or form |
GET /crm/deals/board | Deals by stage |
Reference: CRM, Browser forms, Public job applications
Media
Upload a source video and get adaptive HLS and DASH streams with a poster, thumbnails and subtitles. Large files go up in resumable uploads, and playback links are signed. Public videos play with the app key; private ones need the owner’s session or a server key with the media scopes.
Ordinary files, such as images and documents, go through Drive uploads.
| Route | What it does |
|---|---|
POST /media/v1/assets | Create a video |
POST /media/v1/uploads | Start a resumable upload |
GET /media/v1/assets/{id}/playback | Signed playback links |
POST /drive/files/upload | Upload a file |
Realtime and push
Open one Server-Sent Events stream per tab or app session and the API pushes changes as they happen, such as new notifications. Presence rooms share live state between people in the same place, like cursors or players, without storing it.
Register a device’s Expo push token and the user’s notifications also arrive as push messages.
| Route | What it does |
|---|---|
GET /realtime/stream | The event stream (signed in) |
GET /presence/stream | Join presence rooms |
POST /notifications/push-token | Register a push token |
GET /notifications | The user’s notifications, newest first |
Reference: Realtime, Presence, Notifications
App updates server
Kodkila serves Expo’s open Updates protocol (v1). Every manifest is signed with your channel’s key and the app refuses anything else. Roll an update out to a share of devices, pause it, or send apps back to their store build.
A small command-line tool exports your app, uploads only new files and publishes the update. Native changes still need a store build.
| Route | What it does |
|---|---|
GET /updates/{channelId}/manifest | The signed manifest an app asks for |
POST /updates/channels/{channelId} | Publish an update |
PATCH /updates/channels/{channelId}/{id} | Change the rollout |
GET /updates/cli.mjs | The publishing tool |
Reference: App updates
Webhooks
Add an HTTPS endpoint and choose events. Each delivery is signed with HMAC-SHA256, retried for up to about 15 hours, and listed in a delivery log you can replay from.
| Route | What it does |
|---|---|
POST /developer/channels/{channelId}/webhooks | Add an endpoint |
POST /developer/channels/{channelId}/webhooks/{id}/test | Send a test ping |
Reference: Developer
Search and feature flags
Search your channel’s published products with an app key, using a safe subset of the OpenSearch query language for filters, sorting and facets. Channels can also keep their own indexes.
Feature flags let you ship a feature as internal, beta, coming soon or generally available, with a kill switch. The API enforces them, so a hidden feature stays closed even to direct calls.
| Route | What it does |
|---|---|
POST /search/v1/indices/{name}/search | Search an index |
GET /features/resolve | The flags one person gets |