# spinf > spinf (speedy inference) answers many questions about a piece of content in a single pass: each question is a template ending at a `{?}` slot plus the answers to score there, and spinf returns the probability of each answer (POST /v1/score, or /v1/chat/completions with the OpenAI SDKs and `extra_body.scoring`). Only input tokens (content, questions and answers, empty floors) are billed, at $0.09 per million tokens with a minimum of 1,000 tokens per call; the scores are free. Beta. ## Docs - [Overview](https://spinf.com/docs/index.md) - [Quickstart](https://spinf.com/docs/quickstart.md) - [Scoring API](https://spinf.com/docs/scoring-api.md) (text; images and audio in preview, on request) - [Calibration](https://spinf.com/docs/calibration.md) - [Limits & pricing](https://spinf.com/docs/limits.md) - [FAQ](https://spinf.com/docs/faq.md) ## Request essentials - Body: `model` (default `spinf-12b`), `messages` (one content, OpenAI text parts) or `inputs` [{id, messages, query_ids?, queries?}] (many contents), and `scoring` {queries, empty_floor (default true), case_insensitive (default true)}. - A query: {id, template, options, combinations}. The template is read after the content, has up to 5 `{name}` placeholders and exactly one `{?}`, which must end it. Options: 1–1,000 strings of 1–5 tokens, written with a leading space (" rise"); no space before `{?}` (else 400 option_boundary). combinations: a list of {name: value}, or "all" with `values`. - Response: results[{input_id, queries[{id, combinations[{values, options[{text, logprob, p, floor_p}], residual, floor_residual}]}]}], warnings, usage. `p` is normalised over your options; the lift `p - floor_p` is what the content says; `residual` is mostly set by the template (near 1 for multi-token options), so judge fit on p and the lift. - OpenAI SDK: `client.chat.completions.create(model="spinf-12b", messages=[...], extra_body={"scoring": {...}})` with base_url `https://api.spinf.com/v1`; the scores are in the response's `results`.