oqimDocs
API referenceConsole

Start here

  • Introduction
  • Getting started

Guides

  • Telegram accounts
  • Recipients
  • Campaigns
  • Scheduling
  • Webhooks
  • AI writing assistant

AI Seller

  • AI Seller
  • Channels
  • Live inbox
  • Past conversations and privacy
  • Business insights

API

  • Authentication
  • API reference
  • SDK
  • Errors
  • Rate limits

Trust and operations

  • Security
  • Compliance
  • Administration
Docs / Business insights

Start here

  • Introduction
  • Getting started

Guides

  • Telegram accounts
  • Recipients
  • Campaigns
  • Scheduling
  • Webhooks
  • AI writing assistant

AI Seller

  • AI Seller
  • Channels
  • Live inbox
  • Past conversations and privacy
  • Business insights

API

  • Authentication
  • API reference
  • SDK
  • Errors
  • Rate limits

Trust and operations

  • Security
  • Compliance
  • Administration

Business insights

Every conversation is analysed for what happened, why, and how the customer felt. The results feed boards that answer the two questions an owner actually has: why isn't the business growing, and why aren't customers happy. The boards cover every conversation, not a sample, and every number can be opened to see the conversations behind it.

Case analysis#

A conversation is classified into the business's own cases, inside five fixed dimensions, and scored on a few axes. The cases are yours — Oqim writes a starting catalog for each business and you edit it.

DimensionThe question behind itApplies
PURCHASE_OUTCOMEHow did this conversation end for the sale?Always.
LOST_REASONWhy didn't the customer buy?When the outcome is not a purchase or a booking.
DISSATISFACTIONWhy is the customer unhappy?When satisfaction is low or a complaint was raised.
DEMANDWhat did the customer ask for?Always.
SERVICE_QUALITYHow well was the customer served, by the AI and by people?Always.
  • Every question offers the business's active cases for that dimension plus two escapes: NONE_APPLY (no case fits) and UNCLEAR (the evidence is thin). An answer below the confidence floor — 0.5 by default — is stored as UNCLEAR, and a dimension that does not apply is stored as NOT_APPLICABLE. Nothing is guessed silently.
  • Scores: satisfaction 1–5, sentiment 1–5, purchase intent 0–4, urgency 0–3 and trust 0–3.
  • Flags are stated as probabilities and read as true from 0.6 up: an unanswered question, a missed opportunity, a competitor mentioned, an unavailable item requested, a complaint.
  • A person's correction wins: correcting a case from the conversation report overrides later automatic analyses of the same phase.

How it is decided#

JEV decides, the LLM writes. JEV classifies — one batched request per conversation, five dimensions and the scores and flags together — because classifying is cheap and reliable when it is a judgement, not a calculation. The LLM is used for the parts that are language: the business's case catalog, the per-conversation explanation, and the board narratives. It never counts.

PhaseWhen it runsWhat it does
LIVEWhile the conversation is going: debounced three minutes after the customer's last message, at most once every fifteen minutes in the same conversation.JEV only, so a running conversation is always scored the same way.
FINALWhen the conversation ends — an opt-out, a lead won or lost, a resolved handoff — or after twelve quiet hours.JEV, with the LLM filling in any dimension still UNCLEAR.
  • A final analysis re-opens as live if the customer writes again, so the board never reports a closed outcome for a live conversation.
  • Without JEV — no opt-in or no key — the mode is LLM, live-phase analysis is skipped, and the final phase is classified by the model in batches under your AI budget. With conversation intelligence switched off at the platform or the organization, the mode is OFF and nothing is analysed.

The case catalog#

  • The model writes a starting catalog per business from its profile, offers and sales funnel. Each case carries names in Uzbek, Russian and English, and an English description that JEV is given as the option's criterion.
  • Regenerating fills gaps by default: it is shown the cases that exist and drops anything that repeats one, so running it again does not grow the catalog with near-duplicates. Asking for a rewrite replaces the generated cases instead.
  • You can add, edit, reorder and archive cases as you like. Archiving removes a case from new analyses without touching the history it already explains.
  • Each case shows how many conversations it holds in the last 30 days, so an unused case is easy to spot.

Past conversations#

The boards should explain the business from day one, so conversations from before the AI was switched on — and imported history — are analysed too. A backfill works through every in-scope conversation that has no current analysis, newest first, with the final phase for quiet ones and JEV alone unless you allow the model. It is cost-capped, resumable and rate-limited, and it starts by itself when an import finishes or a business gets its catalog; a periodic sweep picks up anything missed.

Boards show its progress, so “analysing past conversations: 340 of 1,200” is visible rather than a board that is quietly half-empty. What is in scope, and what stays out of it, is on Past conversations and privacy.

The boards#

BoardWhat it shows
BUSINESS_HEALTHAll five dimensions, every score and every flag in one place — the board to open first.
SALES_OUTCOMESHow conversations ended for the sale.
LOST_REASONSWhy customers who did not buy did not buy.
HAPPINESSWhy customers are unhappy, and the dissatisfaction they raised.
DEMANDWhat customers asked for.
SERVICE_QUALITYHow well customers were served, by the AI and by people.

Each board is read for a period — the last 30 days by default, compared with the 30 days immediately before — and for a channel: Telegram, Instagram, Facebook, or all of them. The all-channels view adds a row per channel and compares them, so a problem that only exists on Instagram is visible instead of averaged away.

What is on a board

  • KPIs — conversations, customers replied to, purchases, conversion, average first reply time, handoffs, opt-outs and average satisfaction — each with its previous-period value and change.
  • Dimensions — for each case: how many conversations, its share of the dimension, the change since the previous period, the average confidence and a trend line.
  • Scores — the average, the previous average, the distribution and the trend.
  • Flags — how often each is raised, and how that compares with the previous period.
  • Coverage — how many of the period's conversations are analysed, so a low number explains a thin board instead of hiding it.

Why isn't the business growing#

Numbers alone do not answer that. Each board writes a narrative on request, in the reader's language: a headline, findings — each pointing at the dimension and case it came from — and the actions it suggests.

  • Written from the board's numbers only, never from messages, and grounded: every number in the text must appear in the data it was written from. If one does not, it is rewritten once and then withheld rather than published unverified.
  • It is generated lazily, for one board, business, channel, period and language, and cached. It is refreshed at most hourly, and only when the underlying data changed — a narrative is never left describing numbers that have moved on.
  • Statuses: READY, PENDING (being written), STALE (the data changed; the old text is still returned) and DISABLED (withheld, with an error code).

What “estimated” means#

Every number on a board says where it comes from, and the three labels are never mixed:

LabelMeaningExamples
observedCounted from stored rows. If it says 412 conversations, 412 rows exist.Conversations, purchases, handoffs, opt-outs, reply times, social followers and views.
estimatedA model's judgement, with the confidence stored beside it.Satisfaction and sentiment scores, flags, the case a conversation was classified into.
derivedComputed in code from observed numbers, so it is reproducible.Conversion, a share, a change against the previous period, engagement per view.

Estimates are labelled, not hidden

A judgement from a model is never presented as a measurement. Where a board reports an estimate it also reports how sure it is, and how much of the period it covers.

Drill-down#

  • Each case on a board opens the conversations behind it, with their channel, title, account, last message time, analysis phase, confidence, satisfaction and outcome case.
  • A conversation opens its report: the cases with their probabilities, the scores and flags, and an explanation in your language of what happened and why. The explanation is written on request for a closed conversation — live ones have none yet.
  • From there, the execution behind any AI message shows the decision, the knowledge and memory it used, and what it cost.

Social content#

Posts, videos and comments are analysed the same way — JEV judges, the model writes, code counts — and grouped into their own boards with a platform switcher for all, Instagram, Facebook and YouTube.

BoardWhat it shows
SOCIAL_OVERVIEWEverything in one: followers and growth, reach and views, engagement, comments and their intents.
CONTENTWhat you published: format mix, views and engagement per post, and how posts with a call to action compare with those without.
AUDIENCEWhat people say: comment intents (a price question, a complaint, praise, spam), sentiment, and how many questions were left unanswered for over a day.
GROWTHWhere the audience comes from and how it moves, week to week.
  • Engagement, growth, posting cadence and the unanswered-comment count are computed in code. JEV classifies each comment — its intent, sentiment and flags such as needing a reply or mentioning a competitor — and each post, for example whether its caption carries a clear call to action.
  • A business's own content and comment topics join the same catalog as two extra dimensions, so engagement can be read per topic. Conversations are never classified into topics; the conversation dimensions stay five.
  • Social narratives answer the same kind of question: why engagement is falling, what people ask in the comments, and what content works.
  • A YouTube channel's private numbers — watch time, average view duration, traffic sources, countries, viewer age — need the owner's own sign-in; a public channel reports what public data allows.

Events#

  • ai.analysis.updated — a conversation's analysis changed, with the dimensions whose classification moved. It carries no message text.
  • ai.insights.narrative_ready — a board's narrative was written or refreshed (ai.social.narrative_ready for social boards).
  • ai.cases.generated — a business's case catalog was written or extended.
  • ai.insights.backfill — progress of the analysis of past conversations, at most every five seconds while it runs and when it ends.
  • ai.social.synced — a content sync finished, with how many posts and comments it read, stored and judged.

Their payloads are on Webhooks. The console refetches the affected board or conversation when one arrives.

Endpoints#

All under /api/v1. Reading takes ai:read; refreshing an analysis, correcting a case, generating a narrative or starting a backfill takes ai:operate; editing the catalog takes ai:manage. See the API reference for bodies and responses.

EndpointPermissionWhat it does
GET/ai/businesses/{id}/casesai:readA business's case catalog in display order (dimension, then position): every case not deleted.
POST/ai/businesses/{id}/casesai:manageAdd a case (source MANUAL), last in its dimension (a conversation dimension or a topic: CONTENT_TOPIC or COMMENT_TOPIC).
POST/ai/businesses/{id}/cases/generateai:manageWrite the business's catalog in the background: 6 to 12 cases per dimension (all, or the ones in dimensions), specific to its profile, offers and funnel, with names in Uzbek, Russian and English and English criteria.
GET/ai/businesses/{id}/cases/generationai:readThe business's latest catalog generation: IDLE, RUNNING, DONE or FAILED (with error).
PATCH/ai/cases/{id}ai:manageChange a case's name (the languages given), description, hint (null removes it), status (ACTIVE or ARCHIVED: archived cases leave new analyses) or position.
DELETE/ai/cases/{id}ai:manageRemove a case from the catalog and from new analyses.
GET/ai/conversations/{id}/analysisai:readA conversation's analysis: analysis_mode (JEV, LLM or OFF), phase (LIVE, or FINAL once a FINAL analysis read the customer's last message; LIVE again when they write after it; null before any), scores, flags, the classification per dimension (kind CASE, UNCLEAR or NOT_APPLICABLE; source JEV, LLM or HUMAN), up to 20 past analyses, and the explanation in locale (the ?locale, else Accept-Language, else en).
POST/ai/conversations/{id}/analysis/refreshai:operateQueue a LIVE analysis of the conversation now.
POST/ai/conversations/{id}/analysis/explainai:operateWrite the explanation of a closed conversation's current analysis in a locale (uz, ru or en): what happened and why, with key moments that point at the conversation's own messages.
PUT/ai/conversations/{id}/cases/{dimension}ai:operateCorrect the conversation's classification on a dimension: case_id (a case of its business in that dimension), or case_id null with kind UNCLEAR or NOT_APPLICABLE.
GET/ai/insights/boards/{board}ai:readAn insight board: BUSINESS_HEALTH (every dimension, score and flag), SALES_OUTCOMES, LOST_REASONS, HAPPINESS, DEMAND or SERVICE_QUALITY (their dimensions with the scores and flags that explain them).
POST/ai/insights/boards/{board}/narrativeai:operateWrite the board's narrative in a locale, for a business and a channel (or all) and a period, from the board's numbers (never from messages): a headline, findings with the cases they're about, actions.
GET/ai/insights/boards/{board}/cases/{case_id}/conversationsai:readThe conversations behind a case's number on the board: the period's conversations classified into it, newest first, with their channel, current phase, the classification's confidence, satisfaction and how they ended for the sale (outcome_case).
GET/ai/insights/backfillai:readThe latest analysis of past conversations for a business (or, without business_id, the organization-wide one): status IDLE, RUNNING, DONE, FAILED or CANCELLED, the conversations it found (total) and has done, failed or skipped, the mode (JEV, or LLM when the language model was allowed without JEV), what it's expected to cost and has cost.
POST/ai/insights/backfillai:operateAnalyse past conversations: every conversation in scope (never personal ones) without an analysis that read its newest message, newest first, for a business and a channel (or all) and active since a date.
POST/ai/insights/backfill/cancelai:operateStop the running analysis of past conversations for a business (business_id in the body), or the organization-wide one.
POST/channels/youtube/accountsaccounts:manageAdd a public YouTube channel by its link (youtube.com/@name, /channel/UC…, /user/…, /c/…, or a video link), its @handle or its channel id.
POST/channels/youtube/connectaccounts:manageThe Google consent URL to send the person to, so a YouTube channel's owner lets Oqim read that channel's private Analytics: watch time, average view duration, subscribers gained and lost, where viewers come from, and their age, gender and country.
GET/channels/youtube/callbackPublicWhere Google returns the browser (public; the state is verified and used once, and the browser must carry the console session of the person who started the flow, so nobody can be tricked into connecting their channel to another organization).
GET/ai/social/accounts/{id}/syncai:readAn account's content sync: status IDLE, RUNNING, DONE, FAILED or QUOTA_EXHAUSTED (the platform's YouTube quota for today is used up; it continues after the reset), with what the latest (or running) sync did: posts read, new comments stored, posts and comments analysed.
POST/ai/social/accounts/{id}/syncai:operateSync an account now.
GET/ai/social/boards/{board}ai:readA board: SOCIAL_OVERVIEW (every section), CONTENT (formats, top posts, caption signals, posting, trends), AUDIENCE (comment intents, flags, sentiment, trends) or GROWTH (trends and the accounts' daily metrics as account_metrics).
POST/ai/social/boards/{board}/narrativeai:operateWrite (or refresh) a board's narrative in a locale: why engagement is rising or falling, what people ask in the comments, what content works.
GET/ai/social/postsai:readPosts and videos, newest first, or by engagement or views.
GET/ai/social/posts/{id}ai:readOne post: its full caption (or title and description), its analysis with probabilities, its metrics at each day's sync, and its comments by intent, flag and sentiment, with how many wait for an answer and how many replies the business wrote.
GET/ai/social/commentsai:readThe audience's comments, newest first (the business's own count as its replies instead).
PreviousPast conversations and privacyNext Authentication