QuantTrailAPI referenceIntegration guideOpenAPIGet an API key

QuantTrail API

Send a computer's hardware and what it is for. Get back the local AI models that run well on it, how much memory and context they need, and the commands to download them.

https://quanttrailpicker.com

Getting started

Introduction

The QuantTrail API answers one question: which local AI models run well on this machine, for this job, and how do I get them? It knows about 266 open models (Qwen, Gemma, Llama, Mistral, DeepSeek, Phi, Granite and more), their download sizes in every GGUF format, the memory each needs at a given context length, and where to download them.

You send hardware and a use. You get ranked models with memory estimates, where they run (GPU, unified memory, GPU and RAM, CPU or phone), expected speed, the largest context that fits and, if you ask, ready-made ollama pull and hf download commands. QuantTrail does not host or proxy model files.

Base URLhttps://quanttrailpicker.com
FormatJSON in, JSON out. POST bodies must be Content-Type: application/json, up to 16,384 bytes
AuthenticationOptional API key in X-QuantTrail-Key (authentication)
Versioningv1 changes are additive: new fields and routes, never removed or renamed ones
Machine-readableOpenAPI 3.1

Most apps need one call: Get picks for a use. For filters (licenses, formats, families, speed) use Rank models. Building it into an app: the integration guide has detection scripts, a client and a checklist.

Authentication

Calls work without a key, within the anonymous limits. With a key, requests use your account level's limits instead. There are two credentials; do not mix them up.

CredentialLooks likeOpensSend as
API keyqt_u3f9a0c12b4d5_ and 40 hex charactersEvery public /v1 route, with your level's limits and model familiesX-QuantTrail-Key: <key>, or Authorization: Bearer <key>
Session tokenA Supabase Auth access token (JWT) from signing inYour account routes: /v1/me, keys, saved computers, votingAuthorization: Bearer <token>

Get a key on the API page: sign in with a confirmed account, name the key, pick its model family, and copy it. It is shown once; QuantTrail keeps only a hash. If you lose it or it leaks, roll it: the old key stops working at once.

  • Keep keys on a machine you control: your server, a desktop app's local settings, a home server. Never in a web page, a browser bundle, a mobile app package or a public repository. Browser and phone clients should call your server, which calls QuantTrail.
  • A wrong, rolled or revoked key gets 401 invalid_key. It is not served anonymously instead, so a misconfigured app notices at once.
  • Keys do nothing on /v1/me routes. A stolen key cannot make keys or see the account.
  • Session tokens expire after about an hour; the website refreshes them. Scripts can sign in with @supabase/supabase-js using auth.url and auth.key from meta.

The operator's own applications use application keys with per-minute, per-day and allowance limits; refusals add 403 quota_exhausted.

Levels and limits

A key's limits come from its account's level, read on every request, so a level change applies at once. Live values come from plans; these are the current ones.

LevelPriceKeysRequests a weekRequests a minute, per keyModel families per key
Free011,000101
Basic 55 USD a month210,000303
Basic 1010 USD a month350,00060all
Basic 1515 USD a month5150,000120all
Basic Lifetime250 USD once10no limit120all
  • Every level can use every filter, and every key can carry its own limits. Levels differ in keys, volume and families.
  • Weekly requests are counted across all of an account's keys, Monday 00:00 UTC to Sunday. Over: 429 weekly_limit.
  • Per minute is per key, in UTC calendar minutes. Over: 429 rate_limited with Retry-After.
  • Every /v1 request sent with a key counts, catalog reads included; /v1/me routes never do. Refused requests count too, so do not retry in a loop.
  • Model families: a Free or Basic 5 key sees only its families everywhere. Other models are left out of lists and answer 404. A key's families can change once every 7 days.
  • Paid levels are not on sale yet; the operator sets levels by hand.

Without a key, /v1/recommend, /v1/picks and /v1/requirements are limited per client address: a call less than 1 second after the previous one is held about 2 seconds, then answered. Every 10th early call starts a timeout (60 seconds, then 120, then 180) answered with 429 rate_limited and Retry-After. After 30 quiet minutes the client is forgotten.

Key limits

Any key, on any level, can be limited to what one app needs. Set the limits on the API page (Limits for this key) or with Create a key and Update a key. Every request made with the key then sees only models and formats inside them, on every route: lists, picks, rankings, fit checks, requirements and model pages. A model outside them answers 404, and a candidate outside them comes back in unknown_candidates.

LimitKeeps
familiesModels in these families. Required on Free (1) and Basic 5 (up to 3), locked for 7 days after a change; optional elsewhere and changeable at any time
family_kind"brand" keeps the general-purpose families, "specialized" the ones built for one job or size band (the kind in families)
quantsOnly these formats. Other formats are not listed, ranked or estimated. A known (untracked) format is used when the request names it in quants
tasksModels that support at least one of these tasks
support_levelsModels in these release-date levels
origins, vendorsModels from these origins or companies
license: "permissive"Models with a permissive license
allow_gated: falseModels without a Hugging Face click-through

Limits combine with the request: a request can narrow further with its own filters, never widen. When a Free or Basic 5 account moves to a level without a family limit, the family its level forced stops applying and the key opens to every family; families chosen as a limit keep applying.

Errors

Errors are JSON with a stable error code. field names the request field to fix; message explains in plain English.

StatuserrorMeaning
400invalid_requestA field is wrong, unknown, missing or duplicated. Unknown fields are refused on purpose. Fix it; do not retry unchanged
401invalid_keyKey malformed, rolled or revoked
401sign_in_requiredAccount route without a valid session token
403quota_exhaustedApplication key allowance used up
404not_foundUnknown route, hidden model, or a model outside your key's families
405method_not_allowedWrong method (HEAD included)
409key_limit, preset_limitToo many keys or saved computers
410goneRetired route
413payload_too_largeBody over 16,384 bytes
415unsupported_media_typePOST without Content-Type: application/json
429rate_limitedToo fast; wait Retry-After seconds
429weekly_limitWeekly requests used; resets Monday 00:00 UTC
429families_locked, vote_lockedChanged too recently; message says when it opens
500internal_errorServer fault; retry later with backoff
503sign_in_unavailable, plans_unavailable, votes_disabledA dependency is down or a feature is off

A 403 with an HTML body reading "error code: 1010" comes from Cloudflare, not the API: your HTTP library's default User-Agent was refused (Python's urllib is one). Send your own User-Agent.

CORS and caching

  • CORS is open to every origin on /v1: methods GET, POST, OPTIONS; request headers Content-Type, Authorization, X-QuantTrail-Key.
  • Browsers can read X-QuantTrail-App, X-RateLimit-Remaining-Minute, X-RateLimit-Remaining-Day, X-Quota-Remaining and Retry-After. Server code can read every header.
  • Recommendations, votes and account routes are no-store. Hardware lookups, survey and highlights cache up to 5 minutes; other catalog GETs up to an hour. POST answers and errors never cache.
  • An answer only changes when the catalog changes (updated_at in meta, a few times a day) or the hardware does. Caching each answer for an hour per machine is plenty.

Privacy

Requests, hardware and addresses are not stored or logged, with two exceptions the caller controls:

  • Phone and board survey. When hardware.device_model names a phone, tablet or board and store_device is not false, the model name as sent, the RAM and the hardware class are kept for review (at most three per client session) and survey.message thanks the caller. Desktops are never recorded. Send store_device: false unless your users agreed.
  • Saved computers, only when a signed-in account saves one.

Votes keep only the hardware class. Keys are stored as hashes. The rate limiter names its counter with a hash of the address.

Objects

The hardware object

Every recommendation route takes the same hardware object. Send everything you know: each field improves the answer, and hardware_resolved.estimate.notes says what was assumed. What you send always wins over a matched device, then a matched chip, then memory type and speed.

Required: platform and ram_gb, unless tier or a device_model found in devices is sent.

Fields

tierstring

A hardware class: low, mid, high or max (tiers). Fills every field from a preset; use it when the user does not know their hardware.

platformstring

Operating system. Required unless tier or a known device_model is sent.

One of windows macos linux android ios.

ram_gbnumber

Installed system RAM in GB (the marketed size: 32, not 31.7). Required unless tier or a known device_model is sent.

From 1 to 2048.

cpu_coresinteger

Logical processors. Fewer than 6 slows CPU speed estimates one step.

From 1 to 512.

gpu_namestring

Graphics card name or WebGL renderer string. A match in GPUs fills gpu and vram_gb you did not send. An unknown name without vram_gb counts as no GPU, with a hint.

gpustring

Kind of the strongest graphics adapter. apple requires macos. unified is a shared-memory PC (AMD Strix Halo, NVIDIA DGX Spark and similar).

One of none integrated nvidia amd intel apple unified. Default "none".

vram_gbnumber

Dedicated video memory. Used only for nvidia, amd and intel; 90% of it is the GPU budget.

From 0 to 1024. Default 0.

disk_free_gbnumber

Free space where models will be stored. Larger downloads are dropped (insufficient_disk).

From 0 to 100000.

memory_bandwidth_gbpsnumber

System memory bandwidth in GB/s. Gives a tokens-per-second estimate for CPU and phone fits. Beats every memory field below.

From 1 to 2000.

device_modelstring

Phone, tablet or board name or model code (Galaxy S24, SM-S928B, Raspberry Pi 5). A match in devices fills platform, RAM (its smallest option), cores and bandwidth you did not send.

chipstring

Chip name (Snapdragon 8 Gen 3, Apple A18 Pro). A match in chips fills cores and bandwidth you did not send.

memory_typestring

Memory type. With memory_speed_mts and memory_bus_bits it gives the bandwidth when no device or chip did.

One of ddr3 ddr4 ddr5 lpddr3 lpddr4 lpddr4x lpddr5 lpddr5x.

memory_speed_mtsnumber

Memory transfer rate in MT/s, for example 6000. A typical speed for memory_type is assumed when missing.

From 400 to 20000.

memory_bus_bitsinteger

Memory bus width. Assumed 128 for DDR (two channels), 64 for LPDDR and phones.

From 16 to 1024.

The preferences object

Filters for Rank models and Hardware requirements. Every level may use every filter. If a list comes back empty, excluded counts the models each filter removed: task, context, license, family, vendor, origin, support, insufficient_memory, insufficient_disk, too_large, too_slow, below_smartness_min, not_in_candidates.

Fields

smartness_minnumber

Drops formats whose smartness (model score minus the format penalty) is below this.

From 1 to 10. Default 1.

size_max_gbnumber

Drops formats with a larger download.

From above 0 to 100000.

prioritystring

Ranking weights: balanced 50% smartness, 30% speed; quality 70/15; speed 30/55; small puts 40% on a small download. See ranking.

One of balanced quality speed small. Default "balanced".

min_speedstring

Drops formats slower than this.

One of fast moderate slow very_slow. Default "slow".

tasksarray of strings

Task ids from meta (chat, coding, reasoning, vision, tool_use, multilingual). A model must support every listed task.

Default ["chat"].

context_tokensinteger

Context length to plan memory for. Models with a smaller window are dropped.

From 512 to 2000000. Default 8192.

originsarray of strings

Vendor origins to keep: china, usa, other.

Default [].

families_includearray of strings

Only these model families (families).

Default [].

families_excludearray of strings

Leave out these model families.

Default [].

family_kindstring

brand keeps the general-purpose families (Gemma, Qwen, Llama); specialized keeps the families built for one job or one size band (code completion, small devices). The kind of each family is in families.

One of any brand specialized. Default "any".

vendors_includearray of strings

Only these companies (vendors).

Default [].

vendors_excludearray of strings

Leave out these companies.

Default [].

licensestring

permissive keeps Apache, MIT and similar licenses.

One of any permissive. Default "any".

allow_gatedboolean

false drops models that need a license click-through on Hugging Face.

Default true.

quant_minstring

The lowest tracked format to consider, by quality order from formats. The default leaves out IQ2_M, Q3_K_M and IQ4_XS; send IQ2_M for small machines.

Default "Q4_K_M".

support_levelsarray of strings

Release-date levels from meta: current, limited_1, limited_b2, limited_b1, limited_a2, limited_a1. Empty means all.

Default [].

quantsarray of strings

Exact formats to consider, any tracked or known id from formats. Replaces quant_min. Known formats are estimated where the file was not seen.

Default [].

The recommendation object

Each item in reasoning, speed, recommendations, popular and cpu_recommendations.

Fields

rankinteger

1 is the best in its list.

id, namestring

Catalog id and display name.

family, generation, vendor, vendor_name, origin, countrystring

Where the model comes from.

quantstring

The chosen format, for example Q4_K_M.

formatobject

id, label ("Balanced"), quality_level (1 to 5), size_pct, compression_pct, description.

params_bnumber

Billions of parameters.

file_gb, size_sourcenumber, string

Download size and whether it was measured from the repository or estimated.

est_memory_gbnumber

Memory needed at the requested context: weights x 1.05, plus context, plus 0.5 GB (0.6 GB more for vision).

memory_breakdownobject

weights_gb, context_gb, overhead_gb.

max_context_tokensinteger

The most context that still fits the same memory, rounded down to 1,024. Use it for llama.cpp -c or Ollama num_ctx.

fitstring

gpu (all on the graphics card), unified (Apple or shared memory), split (GPU and system RAM), cpu or mobile.

One of gpu unified split cpu mobile.

speedstring

Expected generation speed class.

One of fast moderate slow very_slow.

est_tokens_per_secondnumber or null

Estimated from memory bandwidth for CPU and phone fits; null otherwise.

smartness, effective_smartness, scorenumber

Heuristic quality (1 to 10), after the format penalty, and the ranking score (0 to 100).

tasks, context_tokens, license, gatedmixed

What the model is for, its window, its license and whether Hugging Face asks for a click-through.

supportobject

{id, label, limited}: the release-date level.

min_tierstring

The lowest hardware class that runs it (Q4_K_M, slow or better).

votes, vote_nudgeobject, number

Votes from accounts with the same hardware class, and the points they add or take (up to 5).

downloadsinteger

Hugging Face downloads, last 30 days.

reasons, warningsarray of strings

Plain-English notes. Show warnings to the user.

linksobject

huggingface, gguf, ollama addresses.

installobject

Only with install: true. See the install object.

The install object

Added to each item when the request has install: true.

  • ollama is null when Ollama has no tag. Ollama picks its own format for a tag (usually Q4_K_M), which may differ from quant.
  • gguf is null without a GGUF repository. file, file_url and curl are null until the repository has been listed; cli always works (pip install -U huggingface_hub) and fetches every part of a split file (parts above 1).
  • Gated models need the license accepted on Hugging Face and HF_TOKEN set where the download runs.
  • Every command works in Windows cmd, PowerShell and Linux or macOS shells.

How ranking works

For each model, every allowed format is checked against the hardware budgets; the best-scoring format represents the model, and models are sorted by score.

MachineGPU budgetSystem budget
Discrete GPU (nvidia, amd, intel with VRAM)90% of VRAMRAM minus 25% for the OS (3 to 8 GB)
Mac (apple) or unified PC70% of RAM (75% from 36 GB)none
No discrete GPUnoneRAM minus 25% for the OS (3 to 8 GB)
Android, iOSnone40%, 35% of RAM
fitWhenspeed
gpuFits the GPU budgetfast
unifiedFits the unified budgetApple: to 8B fast, to 32B moderate, else slow. Other: to 8B moderate, else slow
splitFits GPU plus systemmoderate if the GPU holds 60% or more, else slow
cpu, mobileFits system memoryFrom bandwidth: tokens/s = bandwidth x 0.5 / file size (20 fast, 8 moderate, 3 slow). Without it, by size and cores
prioritySmartnessSpeedSmall downloadRecentHeadroom
balanced50%30%5%10%5%
quality70%15%0%10%5%
speed30%55%5%5%5%
small30%20%40%5%5%

Votes from accounts with the same hardware class add or take up to 5 points. Smartness is a heuristic from size, generation and published scores; speeds are estimates, not benchmarks on your machine.

Recommendations

Get picks for a use

POST/v1/picks

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits; without a key, the anonymous hold.

The call most apps need. Returns two ranked lists for one use: reasoning, the smartest models that fit, and speed, the fastest that fit (moderate speed or better when possible). The same model can be in both.

Picks use fixed profiles and take no filters; use Rank models for those. They leave out base models whose instruct version is listed, re-quantized copies without a GGUF or Ollama download, and CPU-only fallbacks. dnd_dm keeps general chat models of 3B or more.

GET works too, with flat names: /v1/picks?use=chat&platform=windows&ram_gb=16&gpu=nvidia&vram_gb=8&install=true&store_device=false.

Body parameters

hardwareobjectRequired
usestringRequired

The job: coding, chat or dnd_dm. The operator can add uses; a wrong value lists the current ones.

context_tokensinteger

Context length to plan for. Defaults per use: coding 16384, chat 8192, dnd_dm 16384.

From 512 to 2000000.

limitinteger

Items per list.

From 1 to 10. Default 3.

installboolean

Add an install object with Ollama and Hugging Face download commands to each item.

Default false.

store_deviceboolean

Phone and board survey. When device_model names a phone, tablet or board, its name, RAM and class are kept for review unless this is false. Desktops are never recorded. See privacy.

Default true.

Returns

use, profile, context_tokens, and two lists of recommendation objects, plus:

reasoningarray

Up to limit models, smartest first.

speedarray

Up to limit models, fastest first.

profileobject

label, tasks, min_params_b of the use.

hardware_resolvedobject

The machine as understood: every hardware field, tier, gpu_budget_gb, system_budget_gb and estimate {device, chip, bandwidth_source, notes}. Show notes to the user; they say what was matched and assumed.

capacityobject

fast (GPU or unified budget) and total budgets with the largest model, in billions of parameters, that fits at Q4 and Q8.

hintsarray of strings

Why a list is empty or degraded. Show them.

catalogobject

updated_at and model_count.

surveyobject or null

null unless a phone or board device_model was sent; then {stored, message}.

Errors

400 invalid_requestA field is wrong, unknown or missing; field names it.
413 payload_too_largeBody over 16,384 bytes.
415 unsupported_media_typeSend Content-Type: application/json.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Rank models

POST/v1/recommend

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits; without a key, the anonymous hold.

One ranked list with every filter: tasks, priority, speed, formats, licenses, families, vendors, origins and release levels. Also returns the same models by downloads, CPU-only results, and how many models each filter removed.

GET takes every hardware and preference field flat, arrays comma-separated: /v1/recommend?platform=linux&ram_gb=64&gpu=nvidia&vram_gb=24&tasks=coding&quants=Q4_K_M,Q6_K&limit=3.

Body parameters

hardwareobjectRequired
preferencesobject
candidatesarray of strings

Only these models. Matches a catalog id, a Hugging Face repo or an Ollama tag (qwen3:8b). Unmatched names come back in unknown_candidates.

Default [].

include_cpuboolean

Add cpu_recommendations, the same search with the GPU ignored, when a discrete GPU is present.

Default true.

detectedarray of strings

Which of platform, cpu_cores, ram_gb, gpu your app detected rather than the user typed. Accepted; it does not change the ranking.

One of platform cpu_cores ram_gb gpu. Default [].

limitinteger

Items per list.

From 1 to 25. Default 5.

installboolean

Add an install object with Ollama and Hugging Face download commands to each item.

Default false.

store_deviceboolean

Phone and board survey. When device_model names a phone, tablet or board, its name, RAM and class are kept for review unless this is false. Desktops are never recorded. See privacy.

Default true.

Returns

Lists of recommendation objects, plus:

recommendationsarray

By score.

populararray

The same models by downloads.

cpu_recommendationsarray or null

The same search with the GPU ignored; null without a discrete GPU or with include_cpu: false.

excludedobject

Models removed per filter, for example {"task": 213, "license": 6}.

unknown_candidatesarray of strings

candidates that matched nothing.

hardware_resolvedobject

The machine as understood: every hardware field, tier, gpu_budget_gb, system_budget_gb and estimate {device, chip, bandwidth_source, notes}. Show notes to the user; they say what was matched and assumed.

capacityobject

fast (GPU or unified budget) and total budgets with the largest model, in billions of parameters, that fits at Q4 and Q8.

hintsarray of strings

Why a list is empty or degraded. Show them.

catalogobject

updated_at and model_count.

surveyobject or null

null unless a phone or board device_model was sent; then {stored, message}.

Errors

400 invalid_requestA field is wrong, unknown or missing; field names it.
413 payload_too_largeBody over 16,384 bytes.
415 unsupported_media_typeSend Content-Type: application/json.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Check one model

POST/v1/models/{id}/fit

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Will this model run here, and in which format? Returns every format of one model on the given hardware, with memory, where it runs, speed and the context that fits, and the format the ranking would choose.

Path parameters

idstringRequired

Catalog model id, from list models.

Body parameters

hardwareobjectRequired

A hardware object.

context_tokensinteger

Context to plan for.

From 512 to 2000000. Default 8192.

Returns

model, context_tokens, hardware_resolved, and:

recommendedstring or null

The format the ranking would choose.

notesarray of strings

Plain-English summary.

formatsarray

One per tracked format: quant, label, quality_level, file_gb, est_memory_gb, fit (or none), speed, est_tokens_per_second, est_words_per_second, max_context_tokens, short_by_gb (0 when it fits), install.

Errors

400 invalid_requestA field is wrong, unknown or missing; field names it.
413 payload_too_largeBody over 16,384 bytes.
415 unsupported_media_typeSend Content-Type: application/json.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.
404 not_foundNo such model, or outside your key's families.

Hardware requirements

POST/v1/requirements

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits; without a key, the anonymous hold.

The reverse question: what hardware does a model, or a set of preferences, need? Send exactly one of models or preferences.

Body parameters

modelsarray of strings

Catalog model ids. Unknown ids come back in unknown_models. Send models or preferences, not both.

Default [].

preferencesobject

A preferences object. Send models or preferences, not both.

context_tokensinteger

Context length to plan memory for. Models with a smaller window are dropped.

From 512 to 2000000. Default 8192.

limitinteger

Items per list.

From 1 to 25. Default 5.

Returns

catalog, and:

modelsarray

Each model with variants: quant, file_gb, est_memory_gb, min_vram_gb, min_ram_gb_cpu_only, min_unified_ram_gb (null when no common size is enough).

minimum_hardwareobject

For the first model at Q4_K_M: vram_gb, ram_gb_cpu_only, unified_ram_gb, disk_gb.

unknown_modelsarray of strings

Ids that matched nothing.

Errors

400 invalid_requestA field is wrong, unknown or missing; field names it.
413 payload_too_largeBody over 16,384 bytes.
415 unsupported_media_typeSend Content-Type: application/json.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Catalog

List models

GET/v1/models

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Every active model with its formats. Filters combine.

Query parameters

familystring

Family id (families).

generationstring

Generation label.

vendorstring

Vendor id (vendors).

originstring

china, usa or other.

taskstring

Task id.

qstring

Text in the id or name.

include_retiredstring

1 adds retired models.

Returns

{catalog, models}. Each model: id, name, family, generation, vendor, vendor_name, origin, country, hf_repo, gguf_repo, ollama, params_b, downloads, likes, released_at, support, papers, base_model, context_tokens, license, license_class, gated, tasks, smartness, min_tier, status and variants (quant_id, file_gb, size_source, file_name, file_parts).

Errors

400 invalid_requestUnknown filter.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Get a model

GET/v1/models/{id}

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

One model with every format and a links block for further reading.

Path parameters

idstringRequired

Catalog model id.

Returns

The model fields from list models, plus links: model_card, files, discussions, vendor, gguf, ollama, papers, base_model, demos.

Errors

404 not_foundNo such model, hidden, or outside your key's families.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

List families

GET/v1/families

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Model families with their vendor and active model count. Family ids are what keys are opened to and what families_include takes.

Returns

An array: id, label, vendor, kind (brand or specialized), default_context, generations, model_count.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

List vendors

GET/v1/vendors

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Companies with country, origin and active model count.

Returns

An array: id, name, country, origin, model_count.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

List formats

GET/v1/formats

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

GGUF formats. tracked formats are used by default; known ones only when named in quants. position orders them by quality for quant_min.

Returns

An array: id, label, quality_level, description, bits_per_weight, smartness_penalty, position, status, size_pct, compression_pct.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Get metadata

GET/v1/meta

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Catalog freshness and every option list, for building forms. Check updated_at to know when cached answers are stale.

Returns

updated_at, model_count, active_models, retired_models, tasks, origins, quantizations (tracked), tiers, support_levels (id, label, before), platforms, gpu_kinds, vote_thresholds, auth (url, key for Supabase sign-in, or null).

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Top models by size class

GET/v1/top-models

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

The strongest models for five size classes, from phone to 128 GB, for chat and coding, ranked as a search would.

Returns

catalog_updated_at, uses, and classes: each with id, label, hardware and lists per use (rank, id, name, vendor_name, params_b, quant, file_gb, fit, speed, context_tokens, released_at, license, links).

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

New and popular

GET/v1/highlights

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

The most recently released models mixed one-for-one with the most downloaded (last 30 days).

Returns

downloads_window_days and items: kind (new or popular), id, name, vendor_name, params_b, released_at, downloads, support, formats, smallest_gb, largest_gb, ready_download, ollama.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Hardware lookups

Find a GPU

GET/v1/hardware/gpus

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Graphics cards with kind and VRAM. Search for an autocomplete, or resolve a browser's WebGL renderer string to one card. Matching uses the longest name pattern contained in what you send.

Query parameters

qstring

Words that must all appear in the name. Up to 20 results.

rendererstring

A renderer string, for example ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11). Returns {match}.

Returns

Without parameters, every card. gpus (or match): id, name, gpu_vendor, kind (discrete, integrated, apple, unified), vram_gb, match.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Find a phone or board

GET/v1/hardware/devices

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Phones, tablets and single-board computers with chip, RAM options and memory bandwidth. Send a name or model code as hardware.device_model and the API fills the rest. iOS identifiers such as iPhone17,1 do not match; send the marketing name or the chip.

Query parameters

qstring

Words in the name or chip. Up to 10 results.

modelstring

A name or model code. Returns {match}.

rendererstring

A board's GPU renderer. Returns {match}.

Returns

devices (or match): id, name, kind (phone, tablet, board), platform, soc, ram_options_gb, bandwidth_gbps, cpu_cores, speed_class.

Errors

400 invalid_requestUnknown filter.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Find a chip

GET/v1/hardware/chips

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

Phone and board chips with memory type and bandwidth, for devices not in the device list.

Query parameters

qstring

Words in the name. Up to 10 results.

namestring

A chip name. Returns {match}.

Returns

chips (or match): id, name, memory_type, bandwidth_gbps, cpu_cores.

Errors

400 invalid_requestUnknown filter.
401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

List hardware classes

GET/v1/hardware/tiers

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

The four hardware classes. Send hardware.tier for a quick answer when the machine is unknown; the class is also what votes and min_tier use.

Returns

An array: id, label, description, preset (what tier fills in) and minimums (what a machine needs to be in the class).

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Community

Get votes for a model

GET/v1/models/{id}/votes

Authentication
None; a session token adds your own vote.

Good and not-good votes from QuantTrail accounts, per hardware class. Never says who voted. With a session token the answer adds your own vote.

Path parameters

idstringRequired

Catalog model id.

Returns

model, total {up, down}, classes (tier, label, description, up, down), percent_after (the class size from which the website shows percentages) and yours ({tier, value, changeable_at} or null).

Errors

404 not_foundNo such model.

Vote on a model

POST/v1/models/{id}/votes

Authentication
Session token required (Authorization: Bearer <token>).

One vote per account per model, with the hardware class it was tried on. A vote can change 48 hours after it was cast or last changed; sending the same vote again is accepted.

Path parameters

idstringRequired

Catalog model id.

Body parameters

valuestringRequired

Whether it was a good fit.

One of up down.

tierstringRequired

Hardware class it ran on.

One of low mid high max.

Returns

The same shape as Get votes, with yours filled in.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.
429 vote_lockedChanged less than 48 hours ago; message gives the time.
503 votes_disabledVoting is switched off.

Phone and board survey

GET/v1/survey

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

The most recommended models per phone and board class, from the survey. No counts, names or RAM.

Returns

classes: one per class with its top models.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Account

List levels

GET/v1/plans

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

The account levels with their limits. Read this instead of hard-coding the numbers; the operator can change them.

Returns

plans: id, label, position, price_month_usd, price_year_usd, price_once_usd, keys_max, requests_per_week (null: no limit), requests_per_minute, families_max (null: every family), description; and payments.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Get your account

GET/v1/me

Authentication
Session token required (Authorization: Bearer <token>).

Your level, this week's use across all keys, and your keys.

Returns

email, level (a plan with billing and expires_at), is_admin, week {starts, used, limit}, keys, family_change_days, plans. Each key: id, name, hint, status (active or revoked), families (null: every family), limits (null: none; see key limits), requests_this_week, last_used_at, created_at, rolled_at, families_changeable_at.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.

Create a key

POST/v1/me/keys

Authentication
Session token required (Authorization: Bearer <token>).

Makes an API key. The key is in the answer once; copy it then. The API page does the same with a form.

Body parameters

namestringRequired

A name for you, up to 60 characters.

familiesarray of strings

Family ids the key is for, up to the level's families_max. Required on levels with a family limit; optional elsewhere (empty: every family).

limitsobject

Limits on what the key can see, on any level: vendors, origins, tasks (a model must support at least one), support_levels, quants (lists of ids), family_kind ("brand" or "specialized"), license: "permissive" and allow_gated: false. Empty lists and "any" mean no limit there. null clears every limit. See key limits.

Returns

key (the only time it is shown), note, and the account summary from Get your account.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.
400 invalid_requestName or families missing, unknown or too many.
409 key_limitThe level's key count is reached; revoke one first.

Update a key

POST/v1/me/keys/{id}

Authentication
Session token required (Authorization: Bearer <token>).

Renames a key, or changes its model families or limits. On levels with a family limit, families can change once every 7 days per key; everything else changes at once.

Path parameters

idstringRequired

The key id, for example u3f9a0c12b4d5.

Body parameters

namestring

New name.

familiesarray of strings

New family ids; empty for every family on a level without a family limit.

limitsobject

Limits on what the key can see, on any level: vendors, origins, tasks (a model must support at least one), support_levels, quants (lists of ids), family_kind ("brand" or "specialized"), license: "permissive" and allow_gated: false. Empty lists and "any" mean no limit there. null clears every limit. See key limits.

Returns

The account summary.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.
404 not_foundNot one of your keys.
429 families_lockedFamilies changed less than 7 days ago.

Roll a key

POST/v1/me/keys/{id}/roll

Authentication
Session token required (Authorization: Bearer <token>).

Replaces the secret. The old key stops working at once. Rolling a revoked key makes it active again if the level allows another active key.

Path parameters

idstringRequired

The key id.

Returns

key (shown once), note and the account summary.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.
404 not_foundNot one of your keys.
409 key_limitNo free key slot for a revoked key.

Revoke a key

POST/v1/me/keys/{id}/revoke

Authentication
Session token required (Authorization: Bearer <token>).

Turns a key off. It stays in your list as revoked and frees a key slot.

Path parameters

idstringRequired

The key id.

Returns

The account summary.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.
404 not_foundNot one of your keys.

Saved computers

GET/v1/me/presets

Authentication
Session token required (Authorization: Bearer <token>).

Computers the account chose to save, up to 10. QuantTrail re-checks them as new models arrive and flags when a better one fits.

  • POST /v1/me/presets saves one: name, hardware, task (default chat), context_tokens, preferences (priority, min_speed, quants only). 409 preset_limit at 10.
  • GET or POST /v1/me/presets/{id} reads or changes one.
  • POST /v1/me/presets/{id}/check re-checks it now; POST /v1/me/presets/{id}/remove removes it.
  • POST /v1/me/presets/refresh re-checks every computer not checked for a day.

Returns

presets and limit. Each: id, name, hardware, task, context_tokens, preferences, best and largest (top three by score and by size: id, name, quant, score, params_b, file_gb, released_at, download, fit, speed), previous_best, checked_at, better_since, created_at.

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.
409 preset_limitTen computers saved already.

Followed families

GET/v1/me/watches

Authentication
Session token required (Authorization: Bearer <token>).

Model families the account follows, and the models new in them since it last looked.

  • POST /v1/me/watches with {"family": "qwen"} follows a family.
  • POST /v1/me/watches/seen marks everything as seen.
  • POST /v1/me/watches/{family}/remove stops following.

Returns

watches (family, label, since, seen_at) and new (id, name, family, vendor_name, params_b, released_at, first_seen_at, links).

Errors

401 sign_in_requiredNo valid session token, or the email is not confirmed.
503 sign_in_unavailableThe sign-in service did not answer. Retry later.

Service

Site settings

GET/v1/site

Authentication
Optional API key. Anonymous calls work within the anonymous limits.
Counts toward
Your key's minute and weekly limits when a key is sent. Not limited without one.

The donation message, donation links and contact address shown on the website.

Returns

donation_message, donations, contact_email.

Errors

401 invalid_keyThe key is malformed, rolled or revoked.
429 rate_limitedPer-minute key limit, or an anonymous timeout. Wait Retry-After seconds.
429 weekly_limitThe account used its weekly requests.

Health check

GET/health

Authentication
None.

Whether the service is up. Not counted, not limited.

Returns

ok, service, version.