Skip to main content
GET
Poll an async scoring job.
Returns the current state of a cold-scoring job. Jobs are created automatically by POST /v1/score when no fresh cached record exists.

Status transitions

Status is settled lazily — the first poll that observes a terminal underlying execution flips the row. A job that’s never polled stays pending in storage until its 30-day TTL.

Reading a complete job

Once you have the score_url, do GET https://api.keplerinsights.us/v1/score/stripe.com to read the actual score. The two-step is intentional: the job row stays small and cheap; the full score response stays the same shape regardless of how it was triggered.

Failure reasons

Cross-user access

Job IDs are server-side bound to the API key that created them. Polling someone else’s job ID returns:
If you’re proxying multiple downstream users through one Kepler key, you’ll need to map their session IDs to your job_ids yourself.

Expiration

Jobs are kept 30 days then auto-expire. Polling an expired job returns 404. Don’t rely on job rows for long-term history; use GET /v1/score/{domain}/history for that.

Authorizations

X-API-Key
string
header
required

Live keys are prefixed ki_live_, test keys ki_test_. Issue + revoke keys at https://console.keplerinsights.us. Never embed a key in client-side code — every endpoint is backend-to-API only.

Path Parameters

job_id
string<uuid>
required

Response

Job state.

mode
string
job_id
string<uuid>
status
enum<string>
Available options:
pending,
complete,
failed
domain
string
created_at
string<date-time>
completed_at
string<date-time> | null
result_ref
object | null

Present on complete. Use score_url to fetch the actual record.

score_url
string | null
Example:

"/v1/score/stripe.com"

failure_reason
enum<string> | null
Available options:
sfn_failed,
sfn_timed_out,
sfn_aborted,
scoring_completed_no_record