Kaniva API v1

A REST API for your store: calendar & booking, products, orders, customers, inventory, cart & checkout, and webhooks. All responses are JSON. Create an API key in your store admin under Settings → API.

Getting started

Every request is authenticated with an API key and scoped to a single store. The base URL is:

https://kaniva.io/api/v1

The store (tenant) is resolved from your API key — you don't pass a store slug in API URLs.

Authentication

Pass your secret key as a Bearer token in the Authorization header. Keys look like kn_live_… and are shown only once at creation.

curl https://kaniva.io/api/v1/admin/store/summary \
  -H "Authorization: Bearer kn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Accept: application/json"

Missing/invalid/expired/revoked keys return 401 Unauthorized. A key missing the required scope returns 403 Forbidden.

Rate limits

Limits are enforced per API key, defaulting to 60 requests/minute (configurable per key up to 600/min). Every response includes:

HeaderMeaning
X-RateLimit-LimitYour per-minute ceiling.
X-RateLimit-RemainingRequests left in the current window.
Retry-AfterSeconds until reset (sent on 429 responses).

Exceeding the limit returns 429 Too Many Requests.

Errors

Errors return a JSON body with an error label and a human-readable message:

{
  "error": "Forbidden",
  "message": "This API key does not have the required scope(s): calendar:write",
  "required_scopes": ["calendar:write"],
  "key_scopes": ["calendar:read"]
}
StatusMeaning
200 / 201Success.
401Missing or invalid API key.
403Key lacks the scope, or the module is disabled for the store.
404Resource not found.
422Validation error.
429Rate limit exceeded.

Scopes

Each key is granted a set of scopes. Endpoints below list the scope they require.

ScopeGrants
products:readView products and variants
products:writeCreate, update, and delete products
orders:readView orders and order details
orders:writeUpdate order status and details
orders:manageFulfill, refund, and cancel orders
customers:readView customer information
customers:writeCreate and update customers
categories:readView categories
categories:writeCreate, update, and delete categories
cart:readView cart contents (not available yet)
cart:writeAdd, update, and remove cart items (not available yet)
checkout:writeProcess checkout and create orders (not available yet)
inventory:readView inventory levels and items
inventory:writeAdjust inventory quantities
inventory:manageFull inventory control (reserve, commit, transfers)
manufacturing:readView BOMs and work orders
manufacturing:writeCreate and manage work orders
webhooks:readView webhook configurations
webhooks:writeCreate, update, and delete webhooks
blog:readView blog posts, categories and tags
blog:writeCreate, update and delete blog posts, upload their images
crm:readView CRM contacts and support tickets
crm:writeCreate and update support tickets
triage:readView AI triage results and metrics
triage:writeIngest messages for AI triage and send triaged replies
calendar:readView calendar events and availability
calendar:writeCreate, update, and delete calendar events and availability
bookings:readView bookings and available time slots
bookings:writeCreate, confirm, and cancel bookings
settings:readView shipping configuration and integration health (never secret values)

Calendar — Events

GET /admin/calendar/events scope: calendar:read

List calendar events.

ParameterDescription
startISO date — range start (with end)
endISO date — range end
typeFilter by type (appointment, meeting, reminder, shift, custom, …)
statusFilter by status (scheduled, confirmed, cancelled, completed)
per_pageItems per page (max 100)
curl https://kaniva.io/api/v1/admin/calendar/events \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/calendar/events/{id} scope: calendar:read

Get a single calendar event (includes its booking, if any).

curl https://kaniva.io/api/v1/admin/calendar/events/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/calendar/events scope: calendar:write

Create a calendar event.

ParameterDescription
titlerequired
start_atrequired, datetime
end_atdatetime
typerequired (appointment, meeting, …)
all_dayboolean
descriptionstring
locationstring
colorhex
reminder_minutesint
statusscheduled|confirmed|cancelled|completed
curl -X POST https://kaniva.io/api/v1/admin/calendar/events \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/calendar/events/{id} scope: calendar:write

Update a calendar event.

curl -X PUT https://kaniva.io/api/v1/admin/calendar/events/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
DELETE /admin/calendar/events/{id} scope: calendar:write

Delete a calendar event.

curl -X DELETE https://kaniva.io/api/v1/admin/calendar/events/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"

Calendar — Availability

GET /admin/calendar/availability scope: calendar:read

Get recurring weekly availability rules and blocked dates.

curl https://kaniva.io/api/v1/admin/calendar/availability \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
PUT /admin/calendar/availability scope: calendar:write

Replace weekly rules; add/remove blocked dates.

ParameterDescription
days[]{ day_of_week 0-6, is_available, start_time H:i, end_time H:i }
add_blocked[]YYYY-MM-DD dates to block
remove_blocked[]availability ids to unblock
curl -X PUT https://kaniva.io/api/v1/admin/calendar/availability \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Bookings (admin)

GET /admin/calendar/bookings scope: bookings:read

List bookings, newest first.

ParameterDescription
statuspending|confirmed|cancelled
per_pageItems per page (max 100)
curl https://kaniva.io/api/v1/admin/calendar/bookings \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/calendar/bookings/{id} scope: bookings:read

Get a single booking with its event.

curl https://kaniva.io/api/v1/admin/calendar/bookings/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/calendar/bookings/{id}/confirm scope: bookings:write

Confirm a booking and email the guest.

curl -X POST https://kaniva.io/api/v1/admin/calendar/bookings/{id}/confirm \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/calendar/bookings/{id}/cancel scope: bookings:write

Cancel a booking.

curl -X POST https://kaniva.io/api/v1/admin/calendar/bookings/{id}/cancel \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Booking (storefront / scheduling widget)

GET /storefront/calendar/slots scope: bookings:read

Available 30-minute slots for a date.

ParameterDescription
daterequired, YYYY-MM-DD (today or later)
curl https://kaniva.io/api/v1/storefront/calendar/slots \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /storefront/calendar/bookings scope: bookings:write

Create a booking (sends guest + admin emails).

ParameterDescription
daterequired
timerequired H:i
guest_namerequired
guest_emailrequired
guest_phoneoptional
guest_companyoptional
notesoptional
curl -X POST https://kaniva.io/api/v1/storefront/calendar/bookings \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Products (admin)

GET /admin/products scope: products:read

List products.

ParameterDescription
searchname or SKU
category_idfilter
is_activeboolean
per_pagemax 100
curl https://kaniva.io/api/v1/admin/products \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/products/{id} scope: products:read

Get a product with variants and images.

curl https://kaniva.io/api/v1/admin/products/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/products scope: products:write

Create a product (name and price required).

ParameterDescription
namestring
pricenumber
skustored as the part number
product_typephysical|digital|build_to_order|bundle (new products default to physical; wins over is_digital)
track_inventoryboolean
stock_quantityint
is_activeboolean
visibilitypublic|private
category_idint
curl -X POST https://kaniva.io/api/v1/admin/products \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/products/{id} scope: products:write

Update a product; fields left out are unchanged.

ParameterDescription
namestring
pricenumber
skustored as the part number
product_typephysical|digital|build_to_order|bundle (new products default to physical; wins over is_digital)
track_inventoryboolean
stock_quantityint
is_activeboolean
visibilitypublic|private
category_idint
curl -X PUT https://kaniva.io/api/v1/admin/products/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/products/{id}/images scope: products:write

Upload photos (multipart). The first becomes the main photo if there is none or is_primary is true; the rest join the gallery.

ParameterDescription
imagefile (or images[] for several), max 10 MB
is_primaryboolean
alt_textstring
curl -X POST https://kaniva.io/api/v1/admin/products/{id}/images \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
DELETE /admin/products/{id} scope: products:write

Delete a product.

curl -X DELETE https://kaniva.io/api/v1/admin/products/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"

Orders (admin)

GET /admin/orders scope: orders:read

List orders.

curl https://kaniva.io/api/v1/admin/orders \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/orders/{id} scope: orders:read

Get an order with items, customer, shipment boxes (label + per-box tracking), and a refund_gate block (refundable_amount, is_shipped, has_label, can_cancel, can_refund).

curl https://kaniva.io/api/v1/admin/orders/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
PUT /admin/orders/{id}/status scope: orders:write

Update order status.

ParameterDescription
statusrequired — pending|processing|shipped|delivered|cancelled
curl -X PUT https://kaniva.io/api/v1/admin/orders/{id}/status \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/orders/{id}/fulfillment scope: orders:manage

Mark shipped/delivered and record tracking. Stamps shipped_at / delivered_at, registers the number with Shippo and PayPal when carrier + number are given.

ParameterDescription
fulfillment_statusrequired — pending|processing|partially_shipped|labeled|shipped|delivered
tracking_carriere.g. usps, ups, fedex
tracking_numberstring
tracking_urlurl
tracking_modeadd (default, appends) | replace
notify_customerboolean, default false
curl -X PUT https://kaniva.io/api/v1/admin/orders/{id}/fulfillment \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/orders/{id}/refund scope: orders:manage

Refund at the payment provider (Stripe/PayPal), full or partial. Only completed, processing, or partially refunded orders; never more than refund_gate.refundable_amount. 502 and no change if the provider call fails.

ParameterDescription
amountdecimal — omit for the full refundable balance
reasonstring, max 500
notify_customerboolean, default true
forceboolean — record the refund even if the provider call fails
curl -X POST https://kaniva.io/api/v1/admin/orders/{id}/refund \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/orders/{id}/step scope: orders:manage

Move an order to one of the store's order steps (Settings → Order steps). Moving to the Shipped step marks it shipped; Delivered completes it. Order responses include step and next_step.

ParameterDescription
steprequired — a step key, e.g. packed, shipped, delivered, or the store's own
notify_customerboolean, default false — send the step email if the step has one
curl -X POST https://kaniva.io/api/v1/admin/orders/{id}/step \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/orders/{id}/cancel scope: orders:manage

Cancel a pending or processing order (revokes downloads; does not move money — use refund).

ParameterDescription
reasonstring, max 500
notify_customerboolean, default true
curl -X POST https://kaniva.io/api/v1/admin/orders/{id}/cancel \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Settings & integration health (admin)

GET /admin/settings/shipping scope: settings:read

Shipping configuration: ship-from address, rate source (Shippo or fallback formula), allowed countries, local pickup/delivery radii, label printing and address validation flags. Secrets are reported as configured booleans only.

curl https://kaniva.io/api/v1/admin/settings/shipping \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/integrations/health scope: settings:read

checkout_ready plus configured flags for payments (Stripe Connect / keys / PayPal), shipping, Shippo, PrintNode, Google Maps, Stripe webhook secret, and the go-live checklist.

curl https://kaniva.io/api/v1/admin/integrations/health \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"

Customers (admin)

GET /admin/customers scope: customers:read

List customers.

curl https://kaniva.io/api/v1/admin/customers \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/customers/{id} scope: customers:read

Get a customer.

curl https://kaniva.io/api/v1/admin/customers/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/customers scope: customers:write

Create a customer.

curl -X POST https://kaniva.io/api/v1/admin/customers \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/customers/{id} scope: customers:write

Update a customer.

curl -X PUT https://kaniva.io/api/v1/admin/customers/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Categories (admin)

GET /admin/categories scope: categories:read

List categories.

curl https://kaniva.io/api/v1/admin/categories \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/categories/{id} scope: categories:read

Get a category.

curl https://kaniva.io/api/v1/admin/categories/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/categories scope: categories:write

Create a category.

curl -X POST https://kaniva.io/api/v1/admin/categories \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/categories/{id} scope: categories:write

Update a category.

curl -X PUT https://kaniva.io/api/v1/admin/categories/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
DELETE /admin/categories/{id} scope: categories:write

Delete a category.

curl -X DELETE https://kaniva.io/api/v1/admin/categories/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"

Inventory (admin)

GET /admin/inventory/items scope: inventory:read

List inventory items.

curl https://kaniva.io/api/v1/admin/inventory/items \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/inventory/items/{id} scope: inventory:read

Get an inventory item.

curl https://kaniva.io/api/v1/admin/inventory/items/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/inventory/adjust scope: inventory:write

Adjust stock quantity.

curl -X POST https://kaniva.io/api/v1/admin/inventory/adjust \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Manufacturing — Work Orders (admin)

GET /admin/work-orders scope: manufacturing:read

List work orders (operator pick-list).

ParameterDescription
statusdraft|in_progress|completed|cancelled, or "active" (draft+in_progress)
prioritylow|normal|high|urgent
overdueboolean
work_centerMachine queue — matches the WO or an active operation
assigned_toUser id
order_item_idFilter to a build-to-order line
parent_onlyboolean — top-level WOs only
searchWO number or item name/SKU
due_beforeISO date
due_afterISO date
sortdue_date (default), priority, created_at
per_pageItems per page (max 100)
curl https://kaniva.io/api/v1/admin/work-orders \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/work-orders/{id} scope: manufacturing:read

Get a work order with operations, components, jobs, and a production reconciliation block.

ParameterDescription
bySet to "number" to look up a scanned work_order_number instead of id
curl https://kaniva.io/api/v1/admin/work-orders/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/work-orders/{id}/start scope: manufacturing:write

Start a work order (checks component stock; auto-creates operation jobs).

ParameterDescription
operator_nameOptional — recorded on the WO
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/start \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/complete scope: manufacturing:write

Complete a work order — consumes components, produces finished goods, advances any linked order build stage.

ParameterDescription
operator_nameOptional
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/complete \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/cancel scope: manufacturing:write

Cancel a work order.

ParameterDescription
reasonOptional — appended to notes
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/cancel \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/pause scope: manufacturing:write

Pause the work order (closes the open labour-time segment; the WO stays in progress).

curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/pause \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/resume scope: manufacturing:write

Resume the work order (opens a new labour-time segment).

ParameterDescription
operator_nameOptional
operation_idOptional — tag the segment to an operation
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/resume \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/production scope: manufacturing:write

Log produced/good/scrap quantities against the work order.

ParameterDescription
quantity_goodrequired, int ≥0
quantity_scrapint ≥0
scrap_reasonstring
operation_idOptional — target a specific operation
complete_operationboolean — also complete the targeted operation
operator_nameOptional
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/production \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/operations/{operationId}/start scope: manufacturing:write

Start an operation (enforces routing order).

curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/operations/{operationId}/start \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/operations/{operationId}/complete scope: manufacturing:write

Complete an operation and its job.

ParameterDescription
quantity_goodint
quantity_scrapint
notesstring
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/operations/{operationId}/complete \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/work-orders/{id}/operations/{operationId}/skip scope: manufacturing:write

Skip an operation.

ParameterDescription
notesstring
curl -X POST https://kaniva.io/api/v1/admin/work-orders/{id}/operations/{operationId}/skip \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Blog & how-to articles (admin)

GET /admin/blog/posts scope: blog:read

List posts (newest first).

ParameterDescription
statusdraft or published
categoryCategory id or slug
searchTitle or slug contains
per_page1–100, default 25
curl https://kaniva.io/api/v1/admin/blog/posts \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/blog/posts/{id} scope: blog:read

Get a post by id or slug, with its HTML content and SEO fields.

curl https://kaniva.io/api/v1/admin/blog/posts/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/blog/posts scope: blog:write

Create a post. Send content_markdown (converted to HTML) or content_html (sanitised). category and tags may be names; new ones are created. status draft (default) or published; published_at optional.

ParameterDescription
titleRequired
slugMade from the title when blank
excerptUp to 500 characters
content_markdownMarkdown body
content_htmlHTML body (used when no markdown)
categoryCategory id, slug or name
tagsArray of tag names or ids
featured_imageURL from POST /admin/blog/images
featured_image_altAlt text
meta_titleSEO title
meta_descriptionSEO description
meta_keywordsSEO keywords
statusdraft | published
published_atISO 8601, defaults to now when publishing
author_idA staff member id; defaults to the owner
curl -X POST https://kaniva.io/api/v1/admin/blog/posts \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/blog/posts/{id} scope: blog:write

Update any of the create fields; omitted fields are left alone.

curl -X PUT https://kaniva.io/api/v1/admin/blog/posts/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
DELETE /admin/blog/posts/{id} scope: blog:write

Delete a post.

curl -X DELETE https://kaniva.io/api/v1/admin/blog/posts/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/blog/images scope: blog:write

Upload an image (multipart field file, jpeg/png/gif/webp, up to 10 MB). Returns url to use as featured_image or in the content.

curl -X POST https://kaniva.io/api/v1/admin/blog/images \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
GET /admin/blog/categories scope: blog:read

List blog categories.

curl https://kaniva.io/api/v1/admin/blog/categories \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/blog/categories scope: blog:write

Create a category (or return the existing one with that name).

ParameterDescription
nameRequired
descriptionOptional
curl -X POST https://kaniva.io/api/v1/admin/blog/categories \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
GET /admin/blog/tags scope: blog:read

List blog tags.

curl https://kaniva.io/api/v1/admin/blog/tags \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"

CRM (admin)

GET /admin/crm/contacts scope: crm:read

List CRM contacts.

curl https://kaniva.io/api/v1/admin/crm/contacts \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/crm/contacts/{id} scope: crm:read

Get a CRM contact.

curl https://kaniva.io/api/v1/admin/crm/contacts/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/crm/tickets scope: crm:read

List support tickets.

curl https://kaniva.io/api/v1/admin/crm/tickets \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/crm/tickets/{id} scope: crm:read

Get a support ticket.

curl https://kaniva.io/api/v1/admin/crm/tickets/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/crm/tickets scope: crm:write

Create a support ticket.

curl -X POST https://kaniva.io/api/v1/admin/crm/tickets \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Store & Webhooks (admin)

GET /admin/store/summary any valid key

Store summary statistics (any valid key).

curl https://kaniva.io/api/v1/admin/store/summary \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/webhooks/events any valid key

List subscribable webhook event types.

curl https://kaniva.io/api/v1/admin/webhooks/events \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/webhooks scope: webhooks:read

List webhooks.

curl https://kaniva.io/api/v1/admin/webhooks \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/webhooks/{id} scope: webhooks:read

Get a webhook.

curl https://kaniva.io/api/v1/admin/webhooks/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /admin/webhooks/{id}/deliveries scope: webhooks:read

List delivery attempts for a webhook.

curl https://kaniva.io/api/v1/admin/webhooks/{id}/deliveries \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/webhooks scope: webhooks:write

Create a webhook.

curl -X POST https://kaniva.io/api/v1/admin/webhooks \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
PUT /admin/webhooks/{id} scope: webhooks:write

Update a webhook.

curl -X PUT https://kaniva.io/api/v1/admin/webhooks/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
DELETE /admin/webhooks/{id} scope: webhooks:write

Delete a webhook.

curl -X DELETE https://kaniva.io/api/v1/admin/webhooks/{id} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
POST /admin/webhooks/{id}/regenerate-secret scope: webhooks:write

Regenerate the signing secret.

curl -X POST https://kaniva.io/api/v1/admin/webhooks/{id}/regenerate-secret \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'
POST /admin/webhooks/{id}/test scope: webhooks:write

Send a test delivery.

curl -X POST https://kaniva.io/api/v1/admin/webhooks/{id}/test \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ }'

Products (storefront)

GET /storefront/products scope: products:read

Public product catalog.

curl https://kaniva.io/api/v1/storefront/products \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /storefront/products/search scope: products:read

Search products.

ParameterDescription
qsearch query
curl https://kaniva.io/api/v1/storefront/products/search \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /storefront/products/{slug} scope: products:read

Get a product by slug.

curl https://kaniva.io/api/v1/storefront/products/{slug} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"

Categories (storefront)

GET /storefront/categories scope: categories:read

Public category list.

curl https://kaniva.io/api/v1/storefront/categories \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"
GET /storefront/categories/{slug} scope: categories:read

Get a category by slug.

curl https://kaniva.io/api/v1/storefront/categories/{slug} \
  -H "Authorization: Bearer kn_live_…" \
  -H "Accept: application/json"