SK Catalog · Developers

Same rails as the whole suite.

Bearer keys, prefixed ULIDs, cursor pagination, idempotency on every mutation, signed webhooks. Learn it once for SK Catalog; it holds across all of Softknack.

01

How it fits together

Catalog is API/webhook/MCP-first — a system of record, deliberately not a storefront. Read items, subscribe to price changes, and expose semantic search to your agents over MCP.

fig · the shape of itcatalogheadlessAPI · webhook · MCPservedyour agentsbuild on your catalog instead of being held by it
02

Your first item in three steps

Get a test key, make one authenticated call, and listen for the webhook. The same three moves work for every endpoint in the suite.

1

Get a test key

Test and live keys are separate environments. Build against sk_test_ without touching a real customer.

2

Create a item

One authenticated POST with an idempotency key. Same key + same body always returns the same result.

3

Receive the webhook

A signed item.created event hits your endpoint — verify the HMAC, act on it, return 200.

Terminal
curl -X POST https://api.softknack.com/catalog/v1/items \
  -H "Authorization: Bearer sk_live_..." \
  -H "Idempotency-Key: 9f2c-4d1a-...-e7b3" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "AC Service - 1.5T Split",
    "type": "service",
    "duration_min": 60,
    "price": { "inr": 1499 }
  }'
03

Webhooks you can trust

Signed with HMAC-SHA256, delivered at-least-once, retried on a fixed schedule, and replayable from a dead-letter queue. You will never miss an event because a deploy was mid-flight.

EventWhen it fires
item.createdA new product or service enters the record.
item.updatedField-level diff — prices, attributes, availability.
item.deactivatedDeactivate-only: history and references never break.
price.changedThe event your quotes and agents re-read on.
variant.addedA new size/colour/capacity.
item.restockedLinked inventory crossed back above zero.
retry schedule
1s4s16s1m5m30m2hdead-letter
04

Guarantees, not vibes

The platform conventions every SK product obeys — learn them once, rely on them everywhere.

Idempotency, 24h

Every mutation takes an Idempotency-Key. Same key + body returns the original result; a conflicting body gets 409.

Prefixed ULIDs

Sortable, debuggable IDs like itm_01J9X... — you can read the type and the time right off the wire.

Cursor pagination

Stable cursors that never skip or repeat a row when data changes mid-list. No page-offset drift.

Row-level tenancy

Isolation enforced in the database. 404-over-403, so the existence of another tenant's record never leaks.

Signed webhooks

HMAC-SHA256 on every delivery, with the full retry schedule and dead-letter replay above.

Spec drift-checked

The OpenAPI spec is generated from the code's validators and checked in CI — the docs can't lie.

05

Bring your own agent

This is the headless promise: read and write the catalog over REST, react to price.changed over webhooks, and expose semantic search to any agent over MCP with scoped permissions — the exact tools SUKI and SK Chat use to answer 'do you have it?'.

fig · MCP, scopedcatalogone recordCRMagentsbillinginventoryeverything points at one record — change a price once
06

Just want product search?

Hit the semantic search endpoint with a natural-language query and get matched items with live price and stock — build it into your own app, kiosk, or agent.

The docs go deeper.

Auth, errors, pagination, every endpoint and schema — written once for the platform, shared by every product.

docs.softknack.com/catalog  See pricing →