Base URL, auth and response shape
| Production | https://api.idukki.io |
| Development | https://dev-api.idukki.io |
| Interactive docs | https://api.idukki.io/docs (Swagger UI) and https://api.idukki.io/docs/openapi.json (the spec) |
| Widget data host | https://widget-api.idukki.io (CloudFront in front of the widget routes; same handlers) |
Routes marked session sit behind the userAuth authorizer: send the JWT from POST /login as a bearer token. It carries the user and business, and every session route is scoped to that business. Per-business API keys are created and rotated through the GraphQL apiKeys mutations. Routes marked public need no token and are either called by a platform (webhooks, OAuth callbacks), by the widget, or are read-only feeds keyed by your public business GUID (bguid).
// 200
{ "status": true, "result": { … } }
// 4xx / 5xx
{ "status": false, "message": "anchorId is required" }Operational errors are typed: 400 bad request, 401 unauthorised, 403 forbidden, 404 not found, 409 conflict, 422 validation. Anything else is a 500 with a correlation id in the logs.
Three calls to start with
# Product-tagged posts for email (Klaviyo data feed)
curl "https://api.idukki.io/webfeed/YOUR_BGUID?limit=12"
# Aggregate rating for one product (null ratingValue when nothing is rated)
curl "https://api.idukki.io/webfeed/YOUR_BGUID/rating?productId=SHOPIFY_PRODUCT_ID"
# Agent-readable feed: products + rights-cleared UGC + reviews
curl "https://api.idukki.io/agent-feed/YOUR_BGUID?limit=50&ugc=6"TOKEN=$(curl -s -X POST https://api.idukki.io/login \
-H 'content-type: application/json' \
-d '{"email":"you@example.com","password":"…"}' | jq -r .result.token)
curl "https://api.idukki.io/gallery-layouts" -H "authorization: Bearer $TOKEN"Routes
Grouped by what you would use them for. Tags are the serverless function domains; the summary column is whatever the spec carries for the route, so a bare domain name means nobody has written a per-route summary yet.
Widget data
What the storefront runtime calls. GET /widget/api/{bguid}/{id} is the cached, public payload for one widget; it embeds a cache object and answers If-None-Match with 304. The Q&A routes power the on-widget chat.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /widget/{id} | public | Widget Gallery Api |
| GET | /widget/api/{bguid}/{id} | public | Widget Gallery Api |
| POST | /widget/aven/{businessId}/chat | public | Aven Chat |
| ANY | /widget/cache/{proxy+} | session | Widget Gallery Api |
| GET | /widget/invalidate | session | Widget Gallery Api |
| POST | /widget/qna/{anchorType}/{anchorId}/chat | public | Qna Api |
| GET | /widget/qna/{anchorType}/{anchorId}/suggestions | public | Qna Api |
| POST | /widget/qna/event | public | Qna Api |
Feeds for email, agents and structured data
Public, read-only, rights-aware. The webfeed is Klaviyo-compatible (only product-tagged posts; productId scopes it to one product). The agent feed exposes products, UGC and reviews as JSON, schema.org JSON-LD and an llms.txt, plus a read-only MCP server.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /agent-feed/{bguid} | public | Agentfeed Api |
| ANY | /agent-feed/{bguid}/{proxy+} | public | Agentfeed Api |
| POST | /mcp | public | Mcp Server Api |
| GET | /webfeed/{bguid} | public | Webfeed Api |
| GET | /webfeed/{bguid}/rating | public | Webfeed Api |
| GET | /webfeed/send-email | session | Webfeed Api |
The rating endpoint returns ratingValue: null when nothing is rated; omit AggregateRating rather than pad it.
Analytics ingest and reporting
The two public POST routes are the widget’s sinks. Everything else reads aggregated results for the dashboard and needs a session.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /analytics/cart/ | session | Analytics Api |
| POST | /analytics/chat | session | Chat Assistant Rest |
| POST | /analytics/clicks | public | Analytics Api |
| GET | /analytics/conversion/{entity} | session | Analytics Api |
| GET | /analytics/detailed/{type} | session | Analytics Api |
| GET | /analytics/detailed/{type}/{id} | session | Analytics Api |
| GET | /analytics/helpful-counts | public | Analytics Api |
| GET | /analytics/helpful/{id} | public | Analytics Api |
| GET | /analytics/interaction/{entity} | session | Analytics Api |
| GET | /analytics/logLogsToDB | public | Analytics Api |
| POST | /analytics/post-analytics | public | Analytics Api |
| GET | /analytics/post-analytics/{postId}/count | session | Analytics Api |
| GET | /analytics/posts | session | Analytics Api |
| GET | /analytics/products | session | Analytics Api |
| GET | /analytics/realtime | session | Analytics Api |
| POST | /analytics/result/post | session | Analytics Api |
| POST | /analytics/result/v2 | session | Analytics Api |
| GET | /analytics/tagged | session | Analytics Api |
Posts, collections and albums
Curation. Post actions, product tagging, thumbnails, blocking, media resync, album feeds, gallery layout CRUD and the AI tagging settings.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /aitag/posts | session | Aitag Api |
| GET | /aitag/settings | session | Aitag Api |
| PUT | /aitag/settings | session | Aitag Api |
| POST | /collection/album/remove/{id} | session | Gallery Layouts Api |
| GET | /collection/campaign/{bguid} | public | Collection Api |
| POST | /collection/submit | public | Collection Api |
| GET | /gallery-layout/{gallery_layout_id} | session | Gallery Layouts Api |
| GET | /gallery-layouts | session | Gallery Layouts Api |
| POST | /gallery-layouts | session | Gallery Layouts Api |
| POST | /gallery-layouts/{gallery_layout_id} | session | Gallery Layouts Api |
| DELETE | /gallery-layouts/{gallery_layout_id} | session | Gallery Layouts Api |
| GET | /gallery-layouts/alias | public | Gallery Layouts Api |
| GET | /gallery-layouts/alias/{id} | session | Gallery Layouts Api |
| GET | /gallery-layouts/manaulalbum | session | Gallery Layouts Api |
| ANY | /imported/{proxy+} | session | Import Api |
| ANY | /instant-ugc/{proxy+} | session | Instant Ugc Api |
| POST | /post/action/{type} | session | Post Api |
| GET | /post/ai-data | public | Post Api |
| GET | /post/block | session | Post Api |
| POST | /post/block | session | Post Api |
| DELETE | /post/block | session | Post Api |
| POST | /post/edit/{postId} | session | Post Api |
| GET | /post/existing-collection | session | Post Api |
| GET | /post/image/{guid}/{count} | public | Post Api |
| GET | /post/move-to-top | session | Post Api |
| POST | /post/preview-url | session | Post Api |
| POST | /post/resync/{postId} | session | Post Api |
| POST | /post/resync/bulk | session | Post Api |
| GET | /post/resync/status/{postId} | session | Post Api |
| POST | /post/tag/{type}/{postId} | session | Post Api |
| POST | /post/thumbnail | session | Post Api |
| POST | /post/update | public | Post Api |
| ANY | /post/vote | public | Post Api |
| ANY | /post/vote/{proxy+} | public | Post Api |
| GET | /report-media | session | Report Media Api |
| POST | /report-media | public | Report Media Api |
| DELETE | /ugc/account/delete/{app} | session | Ugc Api |
| GET | /ugc/account/get | session | Ugc Api |
| POST | /ugc/account/integrate/{app} | session | Ugc Api |
| GET | /ugc/account/redirectUrl/{app} | session | Ugc Api |
| PATCH | /ugc/account/update/{id} | session | Ugc Api |
| POST | /ugc/albums | session | Album Api |
| POST | /ugc/albums/feed | session | Album Api |
| DELETE | /ugc/albums/feed | session | Album Api |
| GET | /ugc/pages/{app} | session | Ugc Api |
| DELETE | /ugc/revoke/{app} | session | Ugc Api |
Rights
Generate a rights request, record a manual decision, read status per post. The /public/ugc-rights/{id} pair is the consent form a creator sees; the other /public/* routes are the guest gallery, proposals, widget preview and file upload.
| Method | Path | Auth | Summary |
|---|---|---|---|
| POST | /public/feedback | public | Feedback Api |
| POST | /public/gallery-layouts/guest | public | Gallery Layouts Api |
| GET | /public/proposal/{slug} | public | Proposal Api |
| POST | /public/proposal/{slug}/event | public | Proposal Api |
| GET | /public/ugc-rights/{id} | public | Rights Management Api |
| POST | /public/ugc-rights/{id} | public | Rights Management Api |
| POST | /public/uploadfiles/{businessId} | public | Files Api |
| POST | /public/widget-preview | public | Misc Routes Api |
| GET | /ugc-rights/{postId} | session | Rights Management Api |
| POST | /ugc-rights/generate-request/{app} | session | Rights Management Api |
| POST | /ugc-rights/internal/extend | public | Rights Management Api |
| GET | /ugc-rights/list | session | Rights Management Api |
| POST | /ugc-rights/manual/{action} | session | Rights Management Api |
Products and catalogue sync
Catalogue in, tagged UGC out. Shopify, Squarespace and Meta Commerce sync through the same product queue; the OAuth callbacks are public because the platform calls them.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /category | session | Products Api |
| POST | /get-products | public | Products Api |
| GET | /product/presigned | session | Products Api |
| GET | /product/remove | session | Products Api |
| GET | /product/s3-trigger | session | Products Api |
| GET | /product-integration/accessToken | public | Product Integration Api |
| POST | /product-integration/integrate-token | public | Product Integration Api |
| GET | /product-integration/meta/accessToken | public | Product Integration Api |
| POST | /product-integration/meta/product-sync | session | Product Integration Api |
| POST | /product-integration/product-sync | session | Product Integration Api |
| GET | /product-integration/squarespace/accessToken | public | Product Integration Api |
| POST | /product-integration/squarespace/product-sync | session | Product Integration Api |
| GET | /products | public | Products Api |
| POST | /products | session | Products Api |
| POST | /products/generate-model | session | Products Api |
| GET | /products/model-status | session | Products Api |
| GET | /products/pid | public | Products Api |
| POST | /products/sync | public | Products Api |
Shopify
Webhooks Shopify calls (orders, uninstall, GDPR topics) and the reads the Shopify app uses.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /shopify/detail/theme-page | session | Shopify Api |
| GET | /shopify/email-config | session | Shopify Api |
| POST | /shopify/order-detail | public | Shopify Api |
| POST | /shopify/order-stats | session | Shopify Api |
| GET | /shopify/order/detail/{id} | public | Shopify Api |
| POST | /shopify/save/email-config | session | Shopify Api |
| POST | /shopify/webhook/getcustomerdata | public | Shopify Api |
| POST | /shopify/webhook/order | public | Shopify Api |
| POST | /shopify/webhook/removecustomerdata | public | Shopify Api |
| POST | /shopify/webhook/shopdata | public | Shopify Api |
| POST | /shopify/webhook/uninstall | public | Shopify Api |
Business, users and billing
Account, team, media upload, profanity list, Stripe portal and checkout, plan catalogue, the per-business config store and smart links.
| Method | Path | Auth | Summary |
|---|---|---|---|
| POST | /{platform}/register | public | User Api |
| POST | /login | public | User Login |
| GET | /business | session | Business Api |
| PUT | /business | session | Business Api |
| GET | /business/active-subscription | public | Business Api |
| GET | /business/bguid-by-id | public | Business Api |
| GET | /business/campaignEntriesCount | public | Business Api |
| GET | /business/dormancy-confirm | public | Business Api |
| POST | /business/dormancy-confirm | public | Business Api |
| GET | /business/get-selected | session | Business Api |
| GET | /business/getfiles | session | Files Api |
| GET | /business/getMedia | session | Business Api |
| POST | /business/invite-user | session | Business Api |
| GET | /business/list-users | session | Business Api |
| POST | /business/profanity/add | session | Business Api |
| GET | /business/profanity/list | session | Business Api |
| DELETE | /business/profanity/remove/{id} | session | Business Api |
| GET | /business/recentApprovedMedia | public | Business Api |
| DELETE | /business/remove-user/{id} | session | Business Api |
| POST | /business/set-selected | session | Business Api |
| GET | /business/subscription | public | Business Api |
| POST | /business/update-media-status | session | Business Api |
| POST | /business/uploadfiles | session | Files Api |
| POST | /business/uploadMedia | public | Business Api |
| POST | /business/uploadMediaByBusiness | session | Business Api |
| POST | /business/uploadMediaFromChannel | public | Business Api |
| POST | /business/uploadStoreLogo | session | Business Api |
| POST | /business/widget-upload-success | public | Business Api |
| GET | /l/{code} | public | Smartlinks Api |
| GET | /payment/checkout | session | Payment Api |
| GET | /payment/invoices | session | Payment Api |
| GET | /payment/portal | session | Payment Api |
| POST | /payment/webhook | public | Payment Api |
| ANY | /smartlinks | session | Smartlinks Api |
| GET | /subscription/getAllPlans | public | Plans And Subscription Api |
| PUT | /user/{id} | session | User Api |
| POST | /user/forget-password | public | User Api |
| POST | /user/lead | public | User Api |
| GET | /user/me | session | User Api |
| POST | /user/reset-password | public | User Api |
| POST | /user/send-verification-email | public | User Api |
| POST | /user/update-password | session | User Api |
| POST | /user/verify-token | public | User Api |
| GET | /wildcard | public | Wildcard Api |
| POST | /wildcard | session | Wildcard Api |
Social account lookups
Validate a handle, search a hashtag or page, fetch one post by URL. Used by the dashboard when connecting a source.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /social/{platform}/search/{type} | public | Social Media Account Api |
| GET | /social/facebook/post-by-url | session | Social Media Account Api |
| GET | /social/facebook/resolve-group | session | Social Media Account Api |
| GET | /social/facebook/resolve-page | session | Social Media Account Api |
| GET | /social/facebook/search-page | session | Social Media Account Api |
| GET | /social/google/business-search | session | Social Media Account Api |
| GET | /social/instagram/search-hashtag | session | Social Media Account Api |
| GET | /social/instagram/search-user | session | Social Media Account Api |
| GET | /social/linkedin/validate | session | Social Media Account Api |
| GET | /social/threads/validate | session | Social Media Account Api |
| GET | /social/tiktok/challenge | session | Social Media Account Api |
| GET | /social/tiktok/user | session | Social Media Account Api |
| GET | /social/twitter/validate | session | Social Media Account Api |
| GET | /social/youtube/channel | session | Social Media Account Api |
| POST | /v2/social | public | Social Media Account Api |
| ANY | /v2/social/{proxy+} | public | Social Media Account Api |
| POST | /v2/social/details | public | Social Media Account Api |
Shopper interactions
Public write surfaces: wishlist saves, campaign entries, the AI Readiness scan behind /tools/ai-readiness and its lead capture.
| Method | Path | Auth | Summary |
|---|---|---|---|
| POST | /aeo-lead | public | Agentfeed Api |
| POST | /aeo-scan | public | Agentfeed Api |
| POST | /campaign | public | Campaign Api |
| POST | /website-lead | public | Crm Api |
| ANY | /wishlist | public | Wishlist Api |
GraphQL
One endpoint, POST /graphql, serves every internal dashboard operation. The per-domain /graphql/* entries are documentation sections in the spec, not separate URLs. GraphQL-only domains: API keys, orders, customers, labels, notifications, announcements, brand kit, communication templates, links, product-sync jobs, Amazon exports.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /graphql | session | Graph Ql |
| POST | /graphql | session | Graph Ql |
| POST | /graphql/announcements | session | Announcement Operations (GraphQL) |
| POST | /graphql/apikeys | session | API Keys Operations (GraphQL) |
| POST | /graphql/brandkit | session | BrandKit Operations (GraphQL) |
| POST | /graphql/customers | session | Customer Operations (GraphQL) |
| POST | /graphql/labels | session | Label Operations (GraphQL) |
| POST | /graphql/links | session | Link Operations (GraphQL) |
| POST | /graphql/notifications | session | In-App Notification Operations (GraphQL) |
| POST | /graphql/orders | session | Order Operations (GraphQL) |
Not yet grouped
Routes the spec added since this page’s groups were written.
| Method | Path | Auth | Summary |
|---|---|---|---|
| GET | /business/qna/product-questions | session | Product-wise Q&A questions |
| GET | /business/qna/usage | session | Q&A usage by business |
Not listed: 38 operations under internal tags (admin proxy, cron triggers, health probes, SSO, email service, Stripe and Resend receivers). They are in the spec but are not a surface to build on.