Integration guides · 2026-10-17
Liquid d1-ultra API: probability decisions on /v1/systemone
Call Liquid d1-ultra as liquid/d1-ultra on the /v1/systemone endpoint: a probability per question over text and images, $0.042 per 1M input tokens.
Short answer: a model that returns a probability per question, not text
LLMTR (llmtr.com) is a gateway that gives access to language models from different providers through one OpenAI-compatible API. You call d1-ultra, Liquid AI's decision model, there with the model id liquid/d1-ultra on the POST /v1/systemone endpoint; the base address is https://llmtr.com/v1, as for every other model. 1M input tokens cost $0.042 and output costs $0.
d1-ultra is not a chat model. You send it a state and questions you define, and it returns one structured answer per question: the probability of yes for a yes/no question, one of your options with a probability distribution for a choice question, or a position on your own scale for a score question. The state goes in as text or JSON, and you can attach images next to it. Liquid announced the model on 15 October 2026 as a new decision model that can read text, images or both at once.
How do you call the Liquid d1-ultra API?
Send the request to https://llmtr.com/v1/systemone as a POST, with your LLMTR API key after Bearer in the Authorization header. The body has three required fields: model, state and questions. questions is a map whose keys you choose, and the answers come back under the same keys. The request below asks two questions about a product listing from your own catalog: does the listing mention a safety feature, and which category does it belong to.
Question keys are not sent to the model; they only match answers back to questions, so write the full question in instructions. Questions in one request are evaluated independently, and one answer never becomes context for another. The body is validated strictly: an unknown or misspelt field gets 400 invalid_request and the error message names it. This endpoint does not use the Chat Completions format, so instead of the OpenAI SDK's chat client use an HTTP client such as curl or Python requests.
A curl request that asks a noul and a choice question about one product listing.
curl https://llmtr.com/v1/systemone \
-H "Authorization: Bearer $LLMTR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "liquid/d1-ultra",
"state": "Listing 8841: Stainless steel kettle, 1.7 L, 2200 W. Automatic shut-off and boil-dry protection. Ships in 2 days.",
"questions": {
"safety_feature": {
"type": "noul",
"instructions": "Does the listing mention a safety feature?"
},
"category": {
"type": "choice",
"instructions": "Which catalog category does this listing belong to?",
"criteria": {
"kitchen": "Kitchen appliances and cookware",
"electronics": "Phones, computers, audio and video",
"garden": "Garden tools and outdoor equipment",
"other": null
}
}
}
}'
Question types and the shape of the response
d1-ultra answers three question types. noul is a yes/no question and returns the probability that the answer is yes, between 0 and 1. choice picks one of the options you define in criteria and returns the selected option, the probability of every option and a confidence value. If an input may not fit the list, add an option such as other; otherwise the model always returns the closest option. score returns a probability-weighted position on an ordered list of at least two levels, along with the probabilities, a legend and a confidence value.
In the response, the model field carries the LLMTR catalog id, answers carries the keys from your request and usage carries the input and output token counts. According to Liquid's documentation, decision models generate no tokens, so output_tokens is always 0. The example response below shows the shape of the request above; the numbers are examples. The box type, which asks for a location, does not exist on this model; a request that sends one returns 400 invalid_request before it reaches the model.
Example response: the fields follow Liquid's documented shape, the numbers are examples.
{
"model": "liquid/d1-ultra",
"answers": {
"safety_feature": { "type": "noul", "noul": 0.97 },
"category": {
"type": "choice",
"choice": "kitchen",
"probabilities": { "kitchen": 0.9, "electronics": 0.07, "garden": 0.01, "other": 0.02 },
"confidence": 0.87
}
},
"usage": { "input_tokens": 292, "output_tokens": 0 }
}
Sending images: the images array
Images go in the top-level images array, and every question sees every image in it. An entry can be a base64 data URL (data:image/jpeg;base64,...) or an object with content_type and base64 fields; no extra header is needed. LLMTR accepts JPEG, PNG and WebP and carries at most 8 images per request. An http or https address, another file type or a ninth image returns 400 invalid_request. Refer to the images in order: the first image, the second image.
According to Liquid's documentation, an image's token count is ceil(ceil(width / 32) x ceil(height / 32) x 1.5), and the image is counted again for every question; a 1024 x 1024 image costs 1,536 tokens per question. All images in one request combined can hold at most 10,000 squares of 32 x 32 pixels, an image's long side can be at most 100 times its short side, and the request body must stay under 4.5 MB; a larger body returns 413 provider_error. Liquid's announcement gives defect detection as an example; the code below asks whether a photo of a circuit board matches its spec.
A d1-ultra request with Python requests that sends one JPEG in the images array.
import base64
import os
import requests
API_KEY = os.environ["LLMTR_API_KEY"]
with open("board.jpg", "rb") as f:
photo = base64.b64encode(f.read()).decode("ascii")
response = requests.post(
"https://llmtr.com/v1/systemone",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"model": "liquid/d1-ultra",
"state": "Inspection 77. Spec: the board has four mounting screws installed and no scorch marks. The first image is the board.",
"images": [f"data:image/jpeg;base64,{photo}"],
"questions": {
"matches_spec": {
"type": "noul",
"instructions": "Does the board in the first image match the spec?",
}
},
},
timeout=60,
)
response.raise_for_status()
result = response.json()
print(result["answers"]["matches_spec"]["noul"])
print(result["usage"])
Pricing: every question is billed as a separate prompt
For liquid/d1-ultra, 1M input tokens cost $0.042 and output costs $0. According to Liquid's announcement, each question is billed as its own prompt, including its text and all images; in other words, the state and the images are counted again for every question. LLMTR charges from the usage.input_tokens value in the response, which adds up the input of all questions, image tokens included.
A worked example: a three-question request where each question, state included, is about 500 tokens comes to about 1,500 input tokens: 1,500 x $0.042 / 1,000,000 = $0.000063. Add one 1024 x 1024 image to the same request and it adds 1,536 tokens per question, for 6,108 tokens in total, about $0.000257. So send only the questions whose answers you will use. The optional max_budget_usd field refuses a request before sending it when the cost estimated from the body exceeds that value; for a hard ceiling, use a spending limit on the API key.
| Property | Value |
|---|---|
| Model id | liquid/d1-ultra |
| Endpoint | POST /v1/systemone |
| Input price | $0.042 per 1M tokens |
| Output price | $0 per 1M tokens |
| Limit per question | 32,768 tokens (state and images included) or 250,000 bytes of text |
| Images | up to 8 per request; JPEG, PNG, WebP |
| Question types | noul, choice, score |
Limits, error codes and the data notice
Each question, along with the state and every image, must fit within 32,768 tokens or 250,000 bytes of text; a request over that returns 422 provider_error and the message says which question went over. In that case, shrink the state, the images or that question. LLMTR accepts at most 1,000 questions per request. The endpoint does not stream, so the response arrives in one piece, and the model does not appear in the Playground or on the chat endpoints. If the key's request limit is exceeded you get 429 rate_limit_error, if your credit balance does not cover the request 402 insufficient_credits, and if the model cannot answer for a while 503 model_unavailable.
The data notice on the model card is explicit: this model is served through a third-party provider, and the text and images you send may be retained by the provider and used to train Liquid's models. Do not send sensitive, personal or customer data. Liquid does not publish a list of supported languages for d1-ultra; if you will work with Turkish text, look at the results on your own samples first.
Call d1-ultra through LLMTR
Create an account, create an API key and send the first decision request to https://llmtr.com/v1/systemone with liquid/d1-ultra.
- Account. Create an account at llmtr.com and top up your balance under Dashboard > Billing.
- API key. Create a key under Dashboard > API Keys. The raw key is shown only once; store it as the LLMTR_API_KEY environment variable.
- First decision. Send a JSON body with the model, state and questions fields to https://llmtr.com/v1/systemone and read the probabilities under answers.
Frequently asked questions
How much does the Liquid d1-ultra API cost?
On LLMTR, liquid/d1-ultra costs $0.042 per 1M input tokens and $0 for output. Because every question is billed along with the state and all images, the total token count grows with the number of questions.
Can I call d1-ultra with the OpenAI SDK?
Not with the Chat Completions client; the model answers only on the https://llmtr.com/v1/systemone endpoint. Send a JSON body with model, state and questions from any HTTP client, with the Authorization: Bearer header.
Does d1-ultra accept images?
Yes. Send them in the top-level images array, as base64 data URLs or as objects with content_type and base64 fields. JPEG, PNG and WebP are accepted, a request can carry up to 8 images, and each image is counted again for every question.