OpenKol
API

Scores as JSON,
gaps included

The same four answers the interface shows, plus an explicit list of anything we couldn't compute. Nothing is ever estimated to fill a field.

See pricing
Not shippedThese endpoints do not answer yet. This is the intended shape, published so anyone deciding whether to build on it can see the contract before committing — not so anyone starts writing against it today.
POST/v1/checks
Score a post

Takes a post URL. Returns the check if it already exists, otherwise queues one and returns a pending resource with a poll URL. Cached checks do not count against your allowance.

GET/v1/checks/{id}
Retrieve a check

The full result, including which components were withheld and why. Always carries the scoring version it was computed under.

GET/v1/accounts/{handle}
Account track record

Every scored call for an account, with the aggregate distribution. Paid plans only, since it is a corpus-derived view.

GET/v1/accounts/{handle}/profile
Audience profile

Engagement and volume per thousand followers, and the resulting quadrant, against current calibration.

POST/v1/campaigns
Create a campaign

A set of posts with costs attached. Returns per-post and per-account aggregates, including cost per dollar of volume.

GET/v1/calibration
Current percentiles

The distribution every comparison is measured against, so you can reproduce a percentile yourself.

Response

What a check looks like

Note `withheld`. When a component cannot be computed it is named there and omitted from scores, rather than filled with an estimate — a field you can't trust is worse than a field that isn't there.

{
  "id": "chk_8f21c0",
  "post": "https://x.com/handle/status/…",
  "scored_at": "2026-07-25T15:02:11Z",
  "scoring_version": "…",
  "intent": "soft_shill",
  "token": { "symbol": "…", "chain": "…", "address": "0x…" },
  "scores": {
    "impact":      { "value": 14.8, "max": 40 },
    "performance": { "value": 39.4, "max": 60 },
    "audience":    { "value": 36,   "max": 40 },
    "percentile":  { "value": 91,   "max": 100 }
  },
  "profile": "quiet_audience_real_money",
  "metrics": {
    "volume_first_hour_usd": 86900,
    "volume_per_1k_followers_usd": 3018,
    "engagement_per_1k_followers": 0.5
  },
  "withheld": [],
  "replies": { "real": 0.74, "filler": 0.21, "farmed": 0.05 }
}
Contract

What you can rely on

Written down in advance, because an API's value is entirely in what it promises not to do.

Authentication
A bearer token per account, created and revoked from your settings. Tokens are scoped to your plan and never grant access to another workspace.
Versioning
The URL carries the major version. Breaking changes get a new one; existing versions keep answering. Every response also carries the scoring version, which moves independently of the API version.
Cached reads are free
Retrieving a check that already exists does not count against your allowance, on any plan. Only work we have not already done is metered.
Throughput is quoted
Per account, in writing, before you build — so capacity is something you can plan around rather than discover.
Errors say what happened
A structured code and a human sentence. A check that could not complete returns a partial result naming the gap, not a 500.
No forecasts, ever
There is no endpoint that predicts, ranks accounts by expected return, or scores anyone's trustworthiness. Those would be claims our own measurements refute, and no amount of demand will add them.
Questions

Before you plan around it

When does it ship?
Will the shape change before then?
Can I resell the output?
Is there a sandbox?

Check one post.Stop paying for reach.