SK

AI assistant statistics API

Everything the Ragnetiq AI assistant records about conversations, recommended products, carts and orders in your online store, as JSON over HTTPS.

Introduction

The API returns your store's AI assistant statistics: what you see in the dashboard at asistent.ragnetiq.com, plus every single conversation, every recommended product, and every order and cart attributed to the assistant. The data is yours: load it into your own reporting, data warehouse or BI tool.

The base URL is https://asistent.ragnetiq.com/api/stats/v1. All responses are JSON in UTF-8; record times are ISO 8601 in UTC. Requests are GET only; the API changes nothing.

The older address dashboard.ragnetiq.com redirects to asistent.ragnetiq.com. Use the new address for API calls: most HTTP clients drop the Authorization header on a redirect to another domain, and you get 401.

  • A key belongs to one store. If the store has several language versions (for example Slovak, Czech and Hungarian domains), the key covers all of them or only selected ones, as agreed with us. Narrow the data to one version with the market parameter.
  • You choose the period with from and to, at most 366 days at a time. Days are counted in the Europe/Bratislava time zone, the same as in the dashboard.
  • The reports (/summary, /products) are the same numbers as in the dashboard; /conversations, /orders and /carts contain the single records.
  • Orders and carts are available only if conversion tracking is enabled for your store (modules in /client).
  • We keep no personal data of your customers: the visitor identifier is random, and e-mail addresses and phone numbers in conversations are replaced with [e-mail] and [telefón].

Authentication

Ragnetiq issues your key. It is as_ followed by 64 hexadecimal characters. Send it in the Authorization header with every request:

Authorization: Bearer as_9f2c1a7e…

The key is as secret as a password. Use it from a server only (cron, backend, ETL), never in a browser or a mobile app. If it leaks, tell us: we revoke the old key and issue a new one; a revoked key stops working at once.

A missing, invalid or revoked key gets 401 unauthorized. A key without access to the requested language version gets 403 forbidden.

The rules shared by all Ragnetiq APIs (keys, paging, limits, errors, versions) are also on one page: API basics.

Common parameters and rules

Query parameters

ParameterValueMeaning
marketlanguage version domain, optionalLimits the data to one or more language versions: ?market=demo-shop.cz, ?market=a&market=b or ?market=a,b. Without it you get all of the key's versions together. Domains are listed by /client.
fromYYYY-MM-DD, optionalFirst day of the period (inclusive). Defaults to 29 days before to.
toYYYY-MM-DD, optionalLast day of the period (inclusive). Defaults to today. At most 366 days.
after, limitcursor, integerPaging of conversations, see below.

A day runs from midnight to midnight in Bratislava (Europe/Bratislava), as in the dashboard; every response states it in the timezone field. Revenue is in the currency given by the currency field.

Paging

/conversations returns at most 200 conversations at a time, oldest first. The response contains next: a cursor after the page's last conversation, or null when there is no further page. Ask for the next page with after=<next> and the same from, to and market. limit sets the page size (1 – 200, default 100).

The cursor is opaque text: do not build it yourself, just send it back. Conversations have a stable id, so duplicates are easy to drop in incremental downloads. /products, /orders and /carts return the whole period at once.

Limits

  • At most 120 requests per minute per key; above that you get 429 rate_limited.
  • At most 366 days per request; download longer history in parts.
  • Data is available within seconds, so today's numbers keep changing. For closed numbers, download yesterday and earlier.

Errors

An error response always has the same shape: an HTTP status code, error with a machine-readable code and message with an explanation.

HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8

{ "error": "forbidden", "message": "Kľúč nemá prístup k mutácii demo-shop.cz." }
HTTPerrorWhen
400invalid_periodfrom/to are not dates, to is before from, or the period exceeds 366 days.
400invalid_market, invalid_paramMalformed market, after or limit.
401unauthorizedMissing, invalid or revoked key.
403forbiddenThe key does not cover one of the versions in market, or module_disabled: order or cart tracking is not enabled for the store.
429rate_limitedMore than 120 requests per minute. Wait and retry.
502, 503upstream, unavailableA temporary outage on our side. Retry later.

Error messages are in Slovak; rely on the error code.

Store and language versions

GET/api/stats/v1/client

The store the key belongs to, the language versions the key can read, and the enabled modules. Use a domain from market in the market parameter; it also appears on every conversation.

curl "https://asistent.ragnetiq.com/api/stats/v1/client" \
  -H "Authorization: Bearer as_YOUR_KEY"
Response
{
  "client": "Demo Shop",
  "access": "client",
  "markets": [
    { "market": "demo-shop.sk", "country": "Slovensko" },
    { "market": "demo-shop.cz", "country": "Česko" }
  ],
  "modules": { "orders": true, "carts": true }
}
FieldTypeMeaning
clienttextStore name.
accesstextclient = the key covers the whole store, including versions added later; markets = only the versions listed in markets.
marketsarrayLanguage versions the key can read: market (domain), country (country by domain, in Slovak). A store with one domain has one version.
modulesobjectorders, carts: whether order and cart tracking from the chat is enabled. Without the module, /orders and /carts return 403 module_disabled.

Summary

GET/api/stats/v1/summary

The dashboard's numbers: totals for the period, the same for the equally long previous period (for comparison), the funnel from conversation to order, orders and carts from the chat, values per day and a split by language version.

curl "https://asistent.ragnetiq.com/api/stats/v1/summary?from=2026-10-01&to=2026-10-15" \
  -H "Authorization: Bearer as_YOUR_KEY"
Response (shortened)
{
  "client": "Demo Shop",
  "markets": null,
  "from": "2026-10-01",
  "to": "2026-10-15",
  "timezone": "Europe/Bratislava",
  "totals": {
    "sessions": 1028,
    "users": 846,
    "returning_users": 131,
    "messages": 3410,
    "recommendation_sessions": 612,
    "click_sessions": 247,
    "click_rate": 0.2403,
    "emails": 58,
    "email_rate": 0.0564,
    "avg_duration_seconds": 214,
    "total_duration_seconds": 198732,
    "support_savings_eur": 6063
  },
  "previous": { "from": "2026-09-16", "to": "2026-09-30", "sessions": 964, "…": "…" },
  "funnel": { "sessions": 1028, "recommendation_sessions": 612, "click_sessions": 247, "carts": 91, "orders": 52 },
  "orders": { "count": 52, "revenue": 3184.6, "currency": "EUR", "previous": { "count": 47, "revenue": 2911.2, "currency": "EUR" } },
  "carts": { "count": 91, "revenue": 0, "currency": "EUR", "previous": { "count": 85, "revenue": 0, "currency": "EUR" } },
  "daily": [
    { "day": "2026-10-01", "sessions": 71, "click_sessions": 17, "emails": 4 },
    { "day": "2026-10-02", "sessions": 64, "click_sessions": 15, "emails": 3 }
  ],
  "markets": [
    { "market": "demo-shop.sk", "country": "Slovensko", "sessions": 804, "users": 661, "messages": 2671,
      "click_sessions": 196, "click_rate": 0.2438, "emails": 47 },
    { "market": "demo-shop.cz", "country": "Česko", "sessions": 224, "users": 185, "messages": 739,
      "click_sessions": 51, "click_rate": 0.2277, "emails": 11 }
  ]
}

totals and previous

FieldTypeMeaning
sessionsnumberConversations (sessions) with the assistant.
usersnumberDistinct visitors; returning_users of them had 2 or more conversations.
messagesnumberMessages written by customers.
recommendation_sessionsnumberConversations in which the assistant recommended a product.
click_sessions, click_ratenumber, number 0 – 1Conversations with a click on a recommended product, and their share of sessions.
emails, email_ratenumber, number 0 – 1Conversations in which the customer left an e-mail (for support, say), and their share.
avg_duration_seconds, total_duration_secondsnumberAverage conversation length, and the time spent in all conversations together.
support_savings_eurnumberEstimated support savings: a conversation without an e-mail = 15 minutes of support work at €25 an hour.

previous has the same fields plus from and to of the previous period.

funnel

Funnel: sessions → recommendation_sessions got a recommendation → click_sessions clicked a product → carts added to cart → orders ordered. carts and orders are null when the store does not have the module.

orders and carts

Orders and carts attributed to the assistant: count, revenue, currency, and the same in previous. The whole field is null when the store does not have the module. /orders and /carts return the single records.

daily

One record for every day of the period (zeros included): day (YYYY-MM-DD), sessions, click_sessions, emails.

markets

The same per language version: market, country, sessions, users, messages, click_sessions, click_rate, emails.

Conversations

GET/api/stats/v1/conversations

Every conversation with the assistant, with its full course, oldest first, in pages. Everything /summary counts about conversations can be derived from here.

ParameterValueMeaning
aftertextThe next cursor of the previous page. Without it, the first page.
limit1 – 200Page size. Default 100.
curl "https://asistent.ragnetiq.com/api/stats/v1/conversations?market=demo-shop.cz&from=2026-10-01&to=2026-10-15&limit=200" \
  -H "Authorization: Bearer as_YOUR_KEY"
Response (shortened)
{
  "client": "Demo Shop",
  "markets": ["demo-shop.cz"],
  "from": "2026-10-01",
  "to": "2026-10-15",
  "timezone": "Europe/Bratislava",
  "items": [
    {
      "id": "3f0c5a92-6b1e-4c7d-9a10-2e8f4b6d1c55",
      "market": "demo-shop.cz",
      "started_at": "2026-10-14T08:21:36.412+00:00",
      "visitor_id": "k2v9x1m4p7q8r3s6",
      "user_messages": 3,
      "had_recommendation": true,
      "had_click": true,
      "email_submitted": false,
      "city": "Brno",
      "duration_seconds": 184,
      "feedback": "positive",
      "messages": [
        { "role": "user", "content": "Jaký čaj doporučujete na spaní?", "at": "2026-10-14T08:21:36.412Z" },
        { "role": "assistant", "content": "Na klidný spánek vyzkoušejte **Bylinný čaj 100 g** …", "at": "2026-10-14T08:21:39.907Z" }
      ]
    }
  ],
  "next": "MjAyNi0xMC0xNFQwODoyMTozNi40MTIrMDA6MDB8M2YwYzVhOTI…"
}

Conversation fields

FieldTypeMeaning
idtextStable conversation id (UUID).
markettextDomain of the language version where the conversation took place.
started_attimeStart of the conversation (UTC).
visitor_idtext | nullRandom browser identifier. Not a person.
user_messagesnumberNumber of the customer's messages.
had_recommendation, had_clickyes/noThe assistant recommended a product; the customer clicked a recommended product.
email_submittedyes/noThe customer left an e-mail in the chat (the API does not return the e-mail).
citytext | nullCity by IP address, if it could be determined.
duration_secondsnumberConversation length.
feedbacktext | nullThe customer's rating: positive, negative or null.
messagesarrayThe course: role (user customer, assistant the assistant), content, at. E-mail addresses and phone numbers are replaced with [e-mail] and [telefón].

Products

GET/api/stats/v1/products

Up to 100 products the assistant recommended in conversations, sorted by the number of recommendations.

curl "https://asistent.ragnetiq.com/api/stats/v1/products?from=2026-09-16&to=2026-10-15" \
  -H "Authorization: Bearer as_YOUR_KEY"
Response (shortened)
{
  "client": "Demo Shop",
  "markets": null,
  "from": "2026-09-16",
  "to": "2026-10-15",
  "timezone": "Europe/Bratislava",
  "items": [
    { "product_id": "1042", "name": "Bylinný čaj 100 g", "url": "https://demo-shop.sk/bylinny-caj-100-g",
      "recommendations": 214, "clicks": 61, "click_rate": 0.285, "avg_position": 1.4 }
  ]
}
FieldTypeMeaning
product_idtextThe product's identifier from your feed, so you can join it with your catalogue.
name, urltext, text | nullProduct name and its address in the store.
recommendationsnumberHow many times the assistant recommended the product.
clicks, click_ratenumber, number 0 – 1Customers' clicks on the product, and their share of recommendations.
avg_positionnumber | nullThe product's average position in recommendations (1 = first).

Orders

GET/api/stats/v1/orders

Orders attributed to the assistant in the period, oldest first, with the conversation that led to the order. Only for stores with order tracking enabled.

curl "https://asistent.ragnetiq.com/api/stats/v1/orders?from=2026-10-01&to=2026-10-15" \
  -H "Authorization: Bearer as_YOUR_KEY"
Response (shortened)
{
  "client": "Demo Shop",
  "markets": null,
  "from": "2026-10-01",
  "to": "2026-10-15",
  "timezone": "Europe/Bratislava",
  "count": 52,
  "revenue": 3184.6,
  "currency": "EUR",
  "items": [
    {
      "id": "2026001234",
      "code": "2026001234",
      "created_at": "2026-10-14T09:02:11.055Z",
      "attribution": "direct",
      "confidence": 0.92,
      "revenue": 42.9,
      "currency": "EUR",
      "recommendation_query": "čaj na spanie",
      "recommended_product": "Bylinný čaj 100 g",
      "clicked_url": "https://demo-shop.sk/bylinny-caj-100-g",
      "minutes_from_click": 18,
      "conversation": [
        { "role": "user", "content": "Aký čaj odporúčate na spanie?", "at": "2026-10-14T08:41:02.118Z" }
      ]
    }
  ]
}
FieldTypeMeaning
count, revenue, currencynumber, number, textNumber of attributed orders and their revenue together.
items[].id, codetext, text | nullThe order number in your store, and its code if different.
created_attime | nullWhen the order was created (UTC).
attribution, confidencetext, number 0 – 1How strongly the order is attributed to the assistant (for example direct), and the attribution confidence.
revenue, currencynumber, textThe order's revenue attributed to the assistant.
recommendation_query, recommended_product, clicked_urltext | nullWhat the customer asked for, which product they got and where they clicked.
minutes_from_clicknumber | nullMinutes from the click to the order.
conversationarrayThe conversation before the order (role, content, at), without personal data.

Carts

GET/api/stats/v1/carts

Add-to-carts attributed to the assistant, in the same shape as /orders: after a conversation and a click, the customer added a product to the cart. Only for stores with cart tracking enabled.

curl "https://asistent.ragnetiq.com/api/stats/v1/carts?market=demo-shop.sk&from=2026-10-01&to=2026-10-15" \
  -H "Authorization: Bearer as_YOUR_KEY"

Examples

Suggested routine: once a day (in the morning, say) download /summary for yesterday for daily reports, and /conversations and /orders for yesterday into your own warehouse. Keep the key in an environment variable, not in code.

Node.js 18+ (fetch)
const BASE = "https://asistent.ragnetiq.com/api/stats/v1";
const headers = { Authorization: `Bearer ${process.env.ASSISTANT_API_KEY}` };

async function get(path, params = {}) {
  const url = new URL(BASE + path);
  for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, String(v));
  const res = await fetch(url, { headers });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  return res.json();
}

// summary for September
const summary = await get("/summary", { from: "2026-09-01", to: "2026-09-30" });
console.log(summary.totals.sessions, summary.orders?.count);

// all conversations, page by page
let after = null;
do {
  const page = await get("/conversations", { from: "2026-09-01", to: "2026-09-30", after, limit: 200 });
  for (const c of page.items) store(c); // your logic
  after = page.next;
} while (after);
Python (requests)
import os, requests

BASE = "https://asistent.ragnetiq.com/api/stats/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['ASSISTANT_API_KEY']}"}

def get(path, **params):
    r = requests.get(BASE + path, headers=HEADERS, params=params, timeout=60)
    r.raise_for_status()
    return r.json()

summary = get("/summary", **{"from": "2026-09-01", "to": "2026-09-30", "market": "demo-shop.cz"})
print(summary["totals"]["sessions"])

orders = get("/orders", **{"from": "2026-09-01", "to": "2026-09-30"})
for order in orders["items"]:
    ...  # your logic

Changes

DateVersionChange
25 Oct 2026v1First release: /client, /summary, /conversations, /products, /orders, /carts; keys for the whole store and for single language versions.

The version is in the URL (/v1). We may add new fields at any time; existing fields and their meaning do not change within a version. We will tell you in advance about any new version.