Quickstart
Five steps. The only thing you need first is a browser.
1. Get a key
Sign in at jeantechnologies.com/dashboard with Google or an email link. You get an organization of your own on first sign-in, and every key, job and score below belongs to it.
Create a key in the dashboard and copy it. It is shown once and never again; if you lose it, revoke it and make another.
export JEAN_API_KEY="jean_live_..."
Keys are created from the dashboard, not from a key. An API key cannot mint another API key, so a leaked key cannot be used to grow itself a longer life.
2. See what you can be scored against
curl --fail-with-body "https://api-833252724876.us-central1.run.app/v1/suites" \
-H "Authorization: Bearer $JEAN_API_KEY"
Each suite names a metric, how many items it holds, whether it returns per-item feedback, and whether it publishes its items. More about suites.
The items are what you predict. Fetch them by suite, paged with cursor; each carries the
item_id you return verbatim and an input holding whatever you need in order to predict it,
never the answer. On some suites the input is empty and the id is all you get: the suite
describes what to predict for it, and the rest is your model's job. Pick a suite_id from the
list above and use it below.
curl --fail-with-body "https://api-833252724876.us-central1.run.app/v1/suites/$SUITE_ID/items?limit=3" \
-H "Authorization: Bearer $JEAN_API_KEY"
3. Submit predictions
One prediction per item, with the item id the suite gave you, in the suite's own shape: a
ranked list of ids, best first, for a next-item suite; the answer itself for a survey suite. Send an Idempotency-Key and a retry after a timeout returns the original job instead of
queueing a second one.
PREDICTIONS=$(curl --fail-with-body -s "https://api-833252724876.us-central1.run.app/v1/suites/$SUITE_ID/items?limit=3" \
-H "Authorization: Bearer $JEAN_API_KEY" | jq '[.items[] | {item_id, prediction: []}]')
curl --fail-with-body -X POST "https://api-833252724876.us-central1.run.app/v1/evals" \
-H "Authorization: Bearer $JEAN_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d "{\"suite_id\": \"$SUITE_ID\", \"label\": \"first try\", \"predictions\": $PREDICTIONS}"
You get back a job with "status": "queued". Scoring happens on a worker, not in your
request. Those three empty rankings will score exactly zero, which is the point: the number
comes from comparing what you sent to data you do not have. Put your model's rankings in
prediction and the same call scores them. Ids the suite does not know are counted in
n_unmatched and scored on nothing; a submission that matches nothing fails with
invalid_predictions rather than scoring zero.
4. Poll the job
curl --fail-with-body "https://api-833252724876.us-central1.run.app/v1/jobs/$JOB_ID" \
-H "Authorization: Bearer $JEAN_API_KEY"
queued → running → succeeded, or failed with an error, or cancelled if you cancel it.
Poll every couple of seconds. A first submission after a quiet period waits a few seconds
longer while the worker starts.
A succeeded job carries a result: the metric, the value, how many items were scored, and how
many you sent that the suite did not recognize. If the suite allows it, per_item says which
items you got right, never what the right answer was.
5. Read the trace
curl --fail-with-body "https://api-833252724876.us-central1.run.app/v1/jobs/$JOB_ID/trace" \
-H "Authorization: Bearer $JEAN_API_KEY"
Every job records what ran, in what order, and how long each step took, so a number you disagree with can be argued about with evidence.
Then
- Check what you have used with
GET /v1/usage. Free accounts get 20,000 eval items a month, two jobs at a time, and 60 requests a minute. - Invite your team, or claim your email domain so colleagues land in your organization instead of making their own.
- Read the API overview for errors, limits and idempotency in full.