Limits
Lengths count UTF-16 code units, as JavaScript's string.length does, so an emoji can count as two characters. No string you send may contain a NUL character or an unpaired surrogate, and one that does answers 400 validation_failed.
| Limit | Value | Over the limit |
|---|---|---|
| Texts per call | 1 | Make one call per text. See Answering many texts. |
Field value, or text |
100,000 characters | 400 validation_failed |
context |
100,000 characters | 400 validation_failed |
| Fields, both contexts and longest question | About 26,000 tokens, counted as 4 characters of JSON each | 400 Request too large: about N tokens of fields, context and the longest question, the limit is 26000 |
| Request body | 1 MiB | 413 Malformed request |
ref |
1 to 200 characters, after trimming | 400 validation_failed |
idempotency_key |
1 to 200 characters, after trimming, unique in the account | 400 validation_failed, or 409 when first used with another prism |
version |
A whole number from 1 to 2,147,483,647 | 400 validation_failed, or 404 when the version doesn't exist |
{prism} in the path |
1 to 64 characters, a slug or a UUID | 400 validation_failed, or 404 when no such prism |
{result_id} in the path |
A UUID | 400 Invalid request: result_id: Invalid uuid |
| Model time | 15 seconds per attempt by default. A second attempt only after a 429 or a 5xx |
A failed result, 502 |
| Retries of one failed result | 1. See Errors and retries. | 409 This result was already retried as <id>. |
Prisms
Section titled “Prisms”You set these in the app when you build a prism. They explain what a call can send and get back.
| Limit | Value |
|---|---|
| Fields | 1 to 8 |
| Field, question and column keys | A lowercase letter, then up to 63 lowercase letters, digits or _ |
| Reserved keys | context for fields. result_id, ref, version, status, error and created_at for field, question and column keys. other and insufficient_information for Choice option keys |
| Context | Up to 8,000 characters |
| Questions | 1 to 100 |
| Question text | Up to 500 characters, plus up to 4,000 of instructions |
| Choice options | 2 to 253, plus other and insufficient_information |
| Scale levels | 2 to 10 |
| Option label | Up to 200 characters, plus up to 2,000 of description |
| Whole prism | About 16,000 tokens |
| Lens columns | 1 to 200 |
What the API does not have
Section titled “What the API does not have”- Rate limits. The API does not limit calls per key or per account. Keep a few calls in flight, as Answering many texts shows, rather than hundreds.
- A batch endpoint. Each call answers one text. Loop with bounded concurrency and an idempotency key per record.
- Webhooks and async jobs. The call waits for the answers, so there is nothing to poll or receive. Set a client timeout above 30 seconds, as Sending a text explains.
- Listing results. You read a result by its
id. Keep the ids you need, match results to records withref, or look results up in the app. - SDKs. Call the API over HTTP. To generate a client, use the OpenAPI 3.1 document at
/openapi.json. - Key scopes. A key works for every prism in its account. Give each system its own key, so you can tell their calls apart and revoke one without the others.
- CORS. Browsers can't call
/v1. Call it from your server, as Authentication explains. - A stability promise, yet. Prismlet is not live. Until launch,
/v1can change without notice. - Credits and billing. Responses carry no cost, and no call is refused for payment.