Skip to main content

Company intelligence brief

Give a website and one goal, get back a structured brief on the company that your own AI model or your team can act on straight away: what the company sells and to whom, the market and buyer language, real competitors, what buyers ask and object to in public discussions, and a ready playbook for the chosen goal. Every factual item links to the evidence it came from.

One brief serves one goal:

focusBuilt for
reddit_promotionpromoting the company on Reddit: communities that matter, search queries that surface relevant threads, buyer questions and objections, safe claims
seo_webpromoting the company in search: commercial queries by intent, who owns the results today, content gaps
competitor_intelstudying the company as a competitor: positioning, pricing, features, what its customers complain about

A second goal for the same company is a second request. Within 7 days it reuses the site reading and company profile from the first brief, so it starts faster and both briefs describe the company the same way; the job shows "core_reused": true.

The call works with your usual OmevAI API key; the brief is charged to the same balance. For large volumes or questions, contact support@omev.be.

Depth and price​

depthPrice per delivered briefWhat changes
standard (default)$0.60up to 6 competitors, up to 150 buyer comments read
extended$1.107–8 competitors, up to 300 buyer comments read, a wider search

You pay once per brief, when you first download a finished result. A brief that fails, a site we cannot read, a cancelled job and repeated downloads of the same brief are not charged.

Start a brief​

curl -sS https://llmapi.omev.be/v1/cig/jobs/create \
-H "Authorization: Bearer $OMEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://vessi.com",
"focus": "reddit_promotion",
"depth": "standard",
"client_ref": "acme-client-17",
"idempotency_key": "acme-17-vessi-reddit-2026-09"
}'
FieldRequiredMeaning
urlyesthe company website; a public http/https address
focusyesone of reddit_promotion, seo_web, competitor_intel
depthnostandard (default) or extended
marketnoa short hint such as US or Germany, German-speaking buyers
client_refnoyour own label for the end client (agencies: split spend per client)
idempotency_keyno8–200 characters; repeating it returns the same job instead of starting a new one
callback_urlnoa public https address we call when the brief is finished (see Notification)
callback_secretno16–200 characters; with it every notification is signed

Before a brief starts, we check that the balance of your key covers its price. If it does not, the answer is 402 INSUFFICIENT_BALANCE and nothing starts.

The answer is 202 with the job:

{
"job": {"id": "cig_…", "status": "queued", "stage": "", "focus": "reddit_promotion",
"depth": "standard", "client_ref": "acme-client-17", "charged_usd": 0},
"idempotent_replay": false,
"poll_after_seconds": 10
}

Many sites at once​

Send up to 50 briefs in one call. Each item takes the same fields as a single brief.

curl -sS https://llmapi.omev.be/v1/cig/jobs/batch \
-H "Authorization: Bearer $OMEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{"url": "https://vessi.com", "focus": "reddit_promotion", "client_ref": "acme-17"},
{"url": "https://vessi.com", "focus": "seo_web", "client_ref": "acme-17"},
{"url": "https://allbirds.com", "focus": "competitor_intel", "client_ref": "acme-17",
"callback_url": "https://hooks.example.com/omev", "callback_secret": "a-long-random-secret"}
]
}'

The answer is 202 with one entry per item, in the same order. An item with a mistake gets its own error and does not stop the others:

{
"items": [
{"index": 0, "job": {"id": "cig_…", "status": "queued", …}, "idempotent_replay": false},
{"index": 1, "job": {"id": "cig_…", "status": "queued", …}, "idempotent_replay": false},
{"index": 2, "error": {"code": "INVALID_URL", "message": "…"}}
],
"poll_after_seconds": 10
}

The balance must cover all valid items together; otherwise the call returns 402 INSUFFICIENT_BALANCE and no item starts. Two goals for the same site in one call share one site reading.

Follow the job​

A brief takes 10–25 minutes: the service reads the site, searches, checks competitors and reads buyer discussions. Poll every 15–30 seconds.

curl -sS https://llmapi.omev.be/v1/cig/jobs/get \
-H "Authorization: Bearer $OMEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_id": "cig_…"}'

status is queued, running, then one of completed, partial, failed, cancelled. While running, stage shows where the work is: site_read, business_mix, profile_extract, research_plan, market_frame, competitors, search, communities, audience, claim_verify, synthesis. A brief that reuses an earlier site reading shows site_core_reused instead of the first three.

partial is a delivered brief with some part not completed; the reason is listed in evidence_base.limitations. On failed, error.code says why, for example site_unreadable when the site blocks automated visits.

To stop a job, send the same body to /v1/cig/jobs/cancel.

Notification when a brief is ready​

With callback_url, you do not need to poll. When the job reaches completed, partial, failed or cancelled, we send a POST to that address:

{"event": "cig.job.finished", "job": {"id": "cig_…", "status": "completed", …}}
HeaderMeaning
X-Omev-Event-Idthe job id; use it to ignore repeated deliveries
X-Omev-Signaturesha256= and the hex HMAC-SHA256 of the raw body, keyed with your callback_secret (sent only when you gave a secret)

Answer with any 2xx status. If the call fails, we try twice more, after 10 seconds and after 60 seconds. The outcome is shown in job.callback_status. The notification carries only the job; download the brief with /v1/cig/jobs/result as usual.

Check the signature before you trust the body:

import hashlib, hmac

def is_from_omev(raw_body: bytes, header: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header or "")

Download the brief​

curl -sS https://llmapi.omev.be/v1/cig/jobs/result \
-H "Authorization: Bearer $OMEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_id": "cig_…"}'

The response holds job, profile (the full brief) and stage1 (a short summary of the same brief with ten fields). Before the job finishes the call returns 409 JOB_NOT_READY.

The brief has nine sections:

SectionContents
metagoal, depth, target URL, market, generation time
companyproduct, positioning, business mix, features, offer, trust signals
marketbuyer profile (ICP), market frame, keywords, buyer queries
problemsproblems the brand solves, frustrations in the category
brand_perceptioncomplaints, praise and mentions found in public sources
competitioncompetitors (direct, adjacent, status_quo) with the reason each one competes
audiencebuyer questions, objections, expectations, verbatim buyer quotes
playbookthe plan for the goal: communities, search queries, messaging, next actions, claim guardrails
evidence_baseevery source and quote the brief relies on, coverage numbers, limitations

Items carry evidence_ids pointing into evidence_base.evidence, where each entry has the source url and the exact quote. Claims are marked as stated (the company says so), observed (seen in independent sources) or inferred (our conclusion). When you pass the brief to an AI model, tell it to state only stated and observed items as facts and never to use anything listed in playbook.reply_guardrails.do_not_claim.

Errors​

CodeWhen
401missing or invalid API key
402 INSUFFICIENT_BALANCEthe balance of the key does not cover the brief (or all valid items of a bulk call)
404 JOB_NOT_FOUNDunknown job, or a job that belongs to another account
409 JOB_NOT_READYthe result was requested before the job finished
422 INVALID_URLthe address is not a public website
422 INVALID_FOCUS, 422 INVALID_DEPTHa value outside the lists above
422 INVALID_CALLBACK_URL, 422 INVALID_CALLBACK_SECRETthe notification address is not a public https address, or the secret is not 16–200 characters
422 INVALID_REQUEST, 422 BATCH_TOO_LARGEa bulk call without items, with an item that is not an object, or with more than 50 items
429too many requests; retry after a short pause

Every error has the same shape: {"error": {"code": "INVALID_FOCUS", "message": "…"}}. A 401 for a wrong key and a 429 work the same way for every Omev API; see Errors for their format.