The catalog,
JSON out.
Every model and its method classification, every alignment dataset, the four flagship indices, the curated field timeline - the same data the site runs on, straight into your pipeline.
One wallet. Metered in the same credits as the Research Agent. No separate billing. No free tier for machine traffic.
{ "data": [ { "id": "PocketAiHub/Qwen3.8-27B-Abliterated-MLX", "author": "PocketAiHub", "method": "M1", "family": "qwen", "downloads": 0 }, { "id": "PocketAiHub/Qwen3.8-9B-Abliterated-MLX", "author": "PocketAiHub", "method": "M1", "family": "qwen", "downloads": 0 }, { "id": "douyamv/Qwen3.8-27B-abliterated-GGUF", "author": "douyamv", "method": "M8", "family": "qwen", "downloads": 0 } ], "cost": 5, "credits_remaining": 709, "rate_limit_remaining": 59, "metering": "preview", "request_id": "…" }
Real response shape, real rows - this JSON was fetched when the page was built.
Four commands to a live call.
Any of these gives you abl on your PATH.
curl -sSf https://abliteration.org/install | bash
The installer detects your OS (macOS, Linux, WSL, BSD),
checks that Node.js ≥ 18 is present, then runs
npm i -g @abliteration/cli. Prefer to run
the underlying command yourself? Pick npm. On
a Mac with Homebrew or a Windows box with Scoop, pick
the matching tab.
At /shop/account#api-keys. Shown once. Copy it into a password manager on the spot.
export ABLITERATION_API_KEY=abl_live_... curl -H "Authorization: Bearer $ABLITERATION_API_KEY" \
'https://abliteration.org/api/v1/models?limit=3' What people build with it.
Each tile is a real thing a team is doing right now. The first two are the plain answer to how do I get your data. The other four show what happens next.
Four more cases in the guide, including a shell one-liner replay for anyone who wants to try before installing a client. Open the guide →
Endpoints.
Every route is GET and returns the same envelope:
your payload under data, plus cost,
credits_remaining, rate_limit_limit,
rate_limit_remaining, rate_limit_reset,
metering and request_id.
Filter by method, family, author, license, download range and date range. `delisted=live|dead|all` toggles tombstoned rows. Paged. Cost grows with page size AND with offset: cheap for filtered lookups, steep for consecutive paging.
One model with files, benchmarks and an author summary. Delisted models are served here too, with `is_delisted=1` and `days_since_gone`.
Change stream: models pulled from HF, with `last_seen_at` and `days_since_gone`. Poll with `since=<ISO date>` for an incremental feed. Sort by `recent` or `downloads`.
24-month deletion analysis rolled up: totals, deletion rate, average lifespan, monthly timeline, top-10 casualties by peak downloads. One call replaces half a dozen queries.
Paged/filterable backlog of the 24-month deletion analysis. Filters: `since_month`, `min_peak_downloads`. Sort by `downloads`, `recent` or `lifespan`.
Change stream: every commit that changed a model's README on HF, with `size_delta` per commit so spikes and prunes surface without fetching each version. Poll with `since_ts`.
Wayback endpoint: the full README markdown at one commit sha. Reach for it after spotting a suspicious drift.
Change stream: models whose downloads-per-window crossed a threshold (2× jump = `spike`, 0.5× fall = `drop`). Sorted by absolute delta. Filter with `window_days`, `min_baseline`, `kind`.
Per-model download timeline — the raw signal /market/anomalies scans over. Default 90 days, `days=0` for the full history.
The M-code taxonomy with live model counts.
One method: definition, count, top authors, sample models.
All four flagship indices with recent DAI history.
One index with its full history series.
Authors ranked by downloads or model count. Paged.
One author with aggregate totals and their top models.
Filter alignment datasets by category, author and license. Paged.
One dataset with files and its passport, when it has one.
Curated field events. Filter by date range and event type.
The machine-readable spec. No key required.
Ids that contain a slash, which is every model and dataset id, must be
percent-encoded: mlabonne%2FQwen3-30B-A3B-abliterated.
What changed on the Hub since your last check.
Seven routes above turn the catalog into a live signal, not a
snapshot. Every one of them takes a since* parameter,
so the shape of a call is “give me only what is new
since I last asked” — not another dump.
HF removes a model — we keep its final record. `is_delisted=1`, `last_seen_at`, `days_since_gone` on every row that vanished, plus a 24-month backlog with peak downloads and lifespan.
/models?delisted=dead/models/delisted/models/historical-deletions/summary/models/historical-deletions/list
Every commit that changed a model's README, with
size_delta per commit, plus the exact markdown at
any historical sha. Spot a hype pivot, a scrubbed disclaimer, a
license flip, without polling HF yourself.
/models/{id}/drifts/models/{id}/readme-at/{commit}
Every model whose downloads jumped ×2 (spike) or
fell to ×0.5 (drop) over a window, gated by a
minimum baseline to strip out noise. Plus the raw per-model
timeline behind the scan.
/market/anomalies/models/{id}/download-history curl -H "Authorization: Bearer $ABLITERATION_API_KEY" \
'https://abliteration.org/api/v1/models/delisted?sort=downloads&limit=10'
# Response (elided):
{
"data": [
{ "id": "someone/big-model",
"family": "qwen", "params_b": 35,
"downloads": 1005078,
"last_seen_at": "2026-09-18T12:00:00Z",
"days_since_gone": 1 },
...
],
"cost": 5,
"credits_remaining": 700
}
# Poll incrementally — next run passes since=<latest last_seen_at>:
curl -H "Authorization: Bearer $ABLITERATION_API_KEY" \
'https://abliteration.org/api/v1/models/delisted?since=2026-09-18T12:00:00Z' Every change-stream route is priced flat (5, 10 or 15 credits). No offset multiplier — polling is the point.
Authentication.
Send your key in the Authorization header. No
query-parameter form on purpose: URLs land in proxy logs, browser
history and shell history, and a key that leaks that way leaks
quietly.
A key is shown once, at the moment you create it. Only its SHA-256 is stored, so nobody - including us - can recover the original afterwards. Lost it? Regenerate: the old token dies, a new one is issued under the same name.
Revoke from /shop/account#api-keys.
The next call returns 401 revoked_key, not a generic
failure - so the cause is obvious from the response alone.
Authorization: Bearer abl_live_... Pricing and rate limits.
Credits you spend here are the credits the Research Agent spends - one wallet, one balance. The 20 welcome credits at signup work on the Agent only; the API requires purchased credits from the first call.
One dataset, author or method by id. Cheap - these ids are the shape of a lookup, not a bulk-scraping target.
/api/v1/authors/{id}Authors, datasets and methods. Five for the first hundred rows, plus one per further hundred, capped at fifteen.
/api/v1/authors?sort=-total_downloadsFull record for one model, priced above the other single entities because the catalog of models is the field's most bulk-scraped surface.
/api/v1/models/{id}One flagship index with its full history series.
/api/v1/indices/daiStepped by page size, multiplied by (1 + (offset/2500)²). A filtered lookup up to 200 rows costs 5; a full 1000-row page on page 1 costs 300; on page 10, 5100. Filter cheap, dump expensive.
/api/v1/models?method=M4&limit=50Freedom Velocity is computed from a full scan at request time.
/api/v1/indicesHand-curated, not scraped. One call, whole record.
/api/v1/timelineNo key required. Deciding whether an API is worth signing up for should not require signing up.
/api/v1/openapi.jsonLists cost by rows returned, after filters and after the limit clamp. Ten thousand possible matches capped to fifty → fifty-row price.
Sliding window. Over the limit → 429 with retry_after in seconds. Refused calls are not charged.
While metering reads preview, responses show what each call will cost - nothing is deducted yet.
Try it.
Copy an example, swap in your key from /shop/account#api-keys, and run it from your terminal.
# 1. Generate a key at /shop/account#api-keys
export ABLITERATION_API_KEY=abl_live_...
# 2. Call anything
curl -H "Authorization: Bearer $ABLITERATION_API_KEY" \
'https://abliteration.org/api/v1/models?method=M4&limit=3' import os, requests
r = requests.get(
"https://abliteration.org/api/v1/models",
params={"method": "M4", "limit": 3},
headers={"Authorization": f"Bearer {os.environ['ABLITERATION_API_KEY']}"},
)
body = r.json()
for m in body["data"]:
print(m["id"], m["downloads"])
print("cost:", body["cost"], "left:", body["credits_remaining"]) # Install: pick one.
curl -sSf https://abliteration.org/install | bash
# or: npm install -g @abliteration/cli
# or: brew install neymark/abliteration/abliteration
# Then, from any shell:
abl models --method M4 --limit 3 OpenAPI.
The source of truth for endpoint shapes. Import into Postman or Insomnia, or point a client generator at it. No key required - because deciding whether an API is worth signing up for should not require signing up.
Fetch the spec→curl https://abliteration.org/api/v1/openapi.json | jq Straight answers.
Is there a free tier?
No. The 20 welcome credits at signup work on the Research Agent only, so you can try the human-facing side without spending anything. The API is paid from the first call - machine traffic requires purchased credits. Same wallet, same formula for what a call costs; only the source of the balance differs.
What happens when I run out of paid credits?
The next call returns 402 Payment Required with
error: "api_requires_paid" and a message pointing to
the top-up page. Nothing partial is served, nothing silent is
deducted; the client sees the block plainly and can decide when
to top up. Rate-limit and welcome credits do not unblock the API
- only a purchased balance does.
How is this different from the Hugging Face API?
Hugging Face holds the sources. This holds the curation - which of two near-identical uploads is the same technique under a different name, which base a derivative actually came from when the metadata is wrong or absent, a published method classification you can disagree with and audit, the four indices, and a record of models that have since been pulled.
How do I watch for changes without hammering the API?
Poll aggregates, not the raw catalog. /models/historical-deletions/summary
once a day (20 credits) tells you if this month's deletion count
moved; if it did, /models/historical-deletions/list?since_month=YYYY-MM
lists exactly what's new. For downloads, /market/anomalies
(15 credits) surfaces the biggest spikes and drops across the whole
catalog in one call - cheaper than pulling every model's
/download-history yourself and diffing. Both endpoints
are page-friendly, so a webhook-style loop stays within a few dozen
credits per day.
What's the difference between /models?delisted=dead and /models/delisted?
Same underlying data, different shape. /models?delisted=dead
is the normal listing endpoint filtered to tombstoned rows - full
model records with every field, and the full filter arsenal (method,
family, base, sort, pagination). /models/delisted is a
stripped feed: id, name, last-seen downloads, when we noticed they
were gone. Use the second for compliance dashboards that just need
"what disappeared and when"; use the first when you also want the
enrichment we already had on the model before it was pulled.
How long do you keep data on deleted models?
Indefinitely. When Hugging Face pulls a model, we flip
is_delisted and freeze last_seen_at, but
the record - method classification, README, README history,
download timeline, base and family links - stays exactly where it
was. That's the point: the Hub is where these get erased; this
catalog is where they stay reachable. A specific record will only
be removed if a takedown request forces it, and we'll say so in
the row rather than silently blank it.
Can I dump the whole catalog?
No. See Terms, section 10. Paging politely through what you need is fine; systematic reconstruction of the catalog is not.
When does the CLI ship?
Shipped. @abliteration/cli is on npm as version
1.0.0. Install it four ways: the one-liner at
/install, npm install -g @abliteration/cli,
brew install neymark/abliteration/abliteration,
or Scoop on Windows. The command is abl. Docs
live under abl --help.
What commands does the CLI have, and what do they cost?
abl splits commands into Auth (sign in, keys,
balance) and Catalog (data). Add --json for
machine-readable output. Set ABLITERATION_API_KEY
to override the saved key, ABL_DEBUG=1 for stack
traces on errors.
| Command | Returns | Credits |
|---|---|---|
abl login | sign in, save key | free |
abl logout | remove the local key | free |
abl whoami | key prefix + balance | 5 |
abl credits | credit balance | 5 |
abl models | list models | 5–300+ (stepped, offset-multiplied) |
abl models <id> | one model | 10 |
abl authors | list authors | 5–15 (by rows) |
abl authors <id> | one author | 1 |
abl methods | M-code taxonomy | 5–15 (by rows) |
abl methods <id> | one method | 1 |
abl datasets | list datasets | 5–15 (by rows) |
abl datasets <id> | one dataset | 1 |
abl indices | all four flagship indices | 20 |
abl indices <id> | one index with history | 10 |
abl timeline | curated field events | 50 |
whoami and credits cost 5 cr each
because the server has no dedicated /whoami or
/credits endpoint — both commands piggyback on
GET /api/v1/methods, the cheapest existing route,
and read credits_remaining from its response. Use
them from scripts sparingly; the response of every data call
already echoes credits_remaining, so a long-running
job can track its balance without probing. Run abl --help
for the current list.
Is there a Python client?
Yes. pip install abliteration gives you a
typed Client covering every endpoint plus the
same abl command the Node CLI installs. httpx
under the hood, sync, Python 3.9+. Import:
from abliteration import Client. It shares
the ABLITERATION_API_KEY environment variable
with the Node CLI, so the two tools coexist on one shell.
Is there a Ruby client?
Yes. gem install abliteration installs a
typhoeus-based client generated from the OpenAPI spec.
Configure once and every route is a typed method:
Abliteration.configure { |c| c.access_token = ENV['ABLITERATION_API_KEY'] },
then Abliteration::ModelsApi.new.list_models(method: 'M4', limit: 5).
The envelope carries cost, credits_remaining
and rate-limit metadata on every response.
Is there a Rust client?
Yes. cargo add abliteration pulls a reqwest-based
client generated from the OpenAPI spec. One module per resource
(models_api, methods_api, and so on)
and typed serde models for every schema. Pass the
key on the shared configuration and call:
use abliteration::apis::configuration::Configuration;
use abliteration::apis::models_api;
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("ABLITERATION_API_KEY").ok();
let result = models_api::list_models(
&cfg, Some("M4"), None, None, None, None, None,
None, None, None, Some(5), None,
)?; Is there a TypeScript SDK?
Yes. npm install @abliteration/sdk installs a
zero-dependency SDK that uses the standard fetch
API - works in Node 18+ and modern browsers alike. It ships
both a CommonJS build and an ES-module build, with full
.d.ts types. This is the library the Node CLI
(@abliteration/cli) is built on, so both share
the same envelope shape and the same
ABLITERATION_API_KEY convention.
import { Configuration, ModelsApi } from '@abliteration/sdk';
const cfg = new Configuration({
accessToken: process.env.ABLITERATION_API_KEY,
});
const models = new ModelsApi(cfg);
const { data, cost, creditsRemaining } = await models.listModels({
method: 'M4', limit: 5,
}); Is there a .NET client?
Yes. dotnet add package abliteration pulls a
netstandard2.0 client generated from the OpenAPI
spec - works with .NET Core 2.0+, .NET Framework 4.6.1+ and
.NET 5 or later. One Api class per resource
(ModelsApi, MethodsApi, and so on),
typed models for every schema, async methods everywhere:
using abliteration.Api;
using abliteration.Client;
var config = new Configuration();
config.AccessToken = Environment.GetEnvironmentVariable("ABLITERATION_API_KEY");
var api = new ModelsApi(config);
var result = await api.ListModelsAsync(method: "M4", limit: 5);
foreach (var m in result.Data)
{
Console.WriteLine($"{m.Id} - {m.Downloads}");
} Is there a PHP client?
Yes. composer require abliteration/abliteration
installs a Guzzle-based client generated from the OpenAPI
spec. PHP 7.4 or 8+, PSR-4 autoload under
Abliteration\Client\. One Api class per
resource with typed models on every response:
<?php
require_once 'vendor/autoload.php';
$config = Abliteration\Client\Configuration::getDefaultConfiguration()
->setAccessToken(getenv('ABLITERATION_API_KEY'));
$api = new Abliteration\Client\Api\ModelsApi(
new GuzzleHttp\Client(),
$config,
);
$result = $api->listModels(method: 'M4', limit: 5);
foreach ($result->getData() as $m) {
echo $m->getId() . ' - ' . $m->getDownloads() . PHP_EOL;
} Is there an Elixir client?
Yes. Add {:abliteration, "~> 0.1"}
to your mix.exs deps. Tesla-based, Elixir 1.12+,
one module per resource with typed structs:
key = System.get_env("ABLITERATION_API_KEY")
config = Abliteration.Connection.new(bearer: key)
{:ok, envelope} = Abliteration.Api.Models.list_models(
config,
method: "M4",
limit: 5
)
Enum.each(envelope.data, fn m ->
IO.puts("#{m.id} - #{m.downloads}")
end) Is there a Dart / Flutter client?
Yes. dart pub add abliteration installs a Dio-based
client with immutable built_value models.
Works in Dart 2.18+ and Flutter. Note: because of
built_value, run
dart run build_runner build once after install
to materialise the .g.dart files.
import 'package:abliteration/abliteration.dart';
import 'package:dio/dio.dart';
final key = const String.fromEnvironment('ABLITERATION_API_KEY');
final client = Abliteration(
dio: Dio(BaseOptions(
baseUrl: 'https://abliteration.org/api/v1',
headers: {'Authorization': 'Bearer $key'},
)),
);
final response = await client.getModelsApi().listModels(
method: 'M4',
limit: 5,
);
for (final m in response.data!.data) {
print('${m.id} - ${m.downloads}');
} Is there a Java / Kotlin client?
Yes. Add org.abliteration:cli:0.1.0 to your
build - Java 8+ compatible, OkHttp + Gson under the hood,
works fine from Kotlin too.
// Maven
<dependency>
<groupId>org.abliteration</groupId>
<artifactId>cli</artifactId>
<version>0.1.0</version>
</dependency>
// Gradle (Kotlin DSL)
implementation("org.abliteration:cli:0.1.0")
// Usage
import org.abliteration.client.Configuration;
import org.abliteration.client.api.ModelsApi;
import org.abliteration.client.auth.HttpBearerAuth;
ApiClient client = Configuration.getDefaultApiClient();
HttpBearerAuth bearer = (HttpBearerAuth) client.getAuthentication("bearerAuth");
bearer.setBearerToken(System.getenv("ABLITERATION_API_KEY"));
var result = new ModelsApi(client).listModels(
"M4", null, null, null, null, null, null, null, null, 5, null
);
result.getData().forEach(m ->
System.out.println(m.getId() + " - " + m.getDownloads())
); Ready?
Paid from the first call. Bearer, JSON, done in ninety seconds.