public API · v1 BETA

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.

GET /api/v1/models?limit=3
{
  "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.

NEW Ten worked cases in ten languages. From a Monday briefing in Python to a marketplace guard in Rust. Read the guide →
step-by-step

Four commands to a live call.

01
Install the CLI

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.

02
Generate a key

At /shop/account#api-keys. Shown once. Copy it into a password manager on the spot.

03
Put it in your environment
export ABLITERATION_API_KEY=abl_live_...
04
Call the API
curl -H "Authorization: Bearer $ABLITERATION_API_KEY" \
  'https://abliteration.org/api/v1/models?limit=3'
six ways in

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.

Sample · from $5
Twenty rows in thirty seconds.
Filter by method, family, license, author or date. Sort, page, done. The first payload costs one credit. If the shape is wrong you paid a cent.
Take a sample →
Full export · CSV or JSON
The whole catalog, kept fresh.
live · 18,508 now  rebuilt hourly with new methods, new authors, new fields. Your scrape from last Tuesday is already wrong. Pull once, or every hour.
Export the catalog →
Model radar · one lookup
One model, machine-readable.
Method, classification evidence, downloads history, SHA-256 file manifest, base-model chain. All the fields the site shows, plus the ones it doesn't, in one JSON payload.
Look up a model →
Flagship indices · unique
Four indices, our own.
Disenchantment, Freedom Velocity, Weaponization, F2W Latency. Values plus history, one endpoint. Nobody else publishes these.
Pull the indices →
Trends · methods, authors, time
Who owns the field.
Ranked methods, top authors, every dated release and press note. M8 leads at 15.5M downloads.
Read the trends →
Datasets · alignment atlas
The dataset atlas.
Three stages of ablation, three categories, 3,860 datasets classified. Sorted by adoption.
Browse datasets →

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 →

nineteen routes

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.

GET 5-300+ cr
/api/v1/models

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.

GET 10 cr
/api/v1/models/{id}

One model with files, benchmarks and an author summary. Delisted models are served here too, with `is_delisted=1` and `days_since_gone`.

GET 5 cr
/api/v1/models/delisted

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`.

GET 20 cr
/api/v1/models/historical-deletions/summary

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.

GET 5 cr
/api/v1/models/historical-deletions/list

Paged/filterable backlog of the 24-month deletion analysis. Filters: `since_month`, `min_peak_downloads`. Sort by `downloads`, `recent` or `lifespan`.

GET 5 cr
/api/v1/models/{id}/drifts

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`.

GET 10 cr
/api/v1/models/{id}/readme-at/{commit}

Wayback endpoint: the full README markdown at one commit sha. Reach for it after spotting a suspicious drift.

GET 15 cr
/api/v1/market/anomalies

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`.

GET 5 cr
/api/v1/models/{id}/download-history

Per-model download timeline — the raw signal /market/anomalies scans over. Default 90 days, `days=0` for the full history.

GET 5-15 cr
/api/v1/methods

The M-code taxonomy with live model counts.

GET 1 cr
/api/v1/methods/{id}

One method: definition, count, top authors, sample models.

GET 20 cr
/api/v1/indices

All four flagship indices with recent DAI history.

GET 10 cr
/api/v1/indices/{id}

One index with its full history series.

GET 5-15 cr
/api/v1/authors

Authors ranked by downloads or model count. Paged.

GET 1 cr
/api/v1/authors/{id}

One author with aggregate totals and their top models.

GET 5-15 cr
/api/v1/datasets

Filter alignment datasets by category, author and license. Paged.

GET 1 cr
/api/v1/datasets/{id}

One dataset with files and its passport, when it has one.

GET 50 cr
/api/v1/timeline

Curated field events. Filter by date range and event type.

GET free
/api/v1/openapi.json

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.

NEW · change stream

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.

Compliance & safety research
What got deleted

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
Narrative shifts
What got rewritten

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}
Market intelligence
What moved fast

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
recipe What disappeared from HF this week
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.

bearer only

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_...
sha-256
only the hash is stored
401
revoked_key on next request
once
raw token shown at create time
one wallet

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.

1 cr
Single entity

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}
5–15 cr
Cheap lists

Authors, datasets and methods. Five for the first hundred rows, plus one per further hundred, capped at fifteen.

/api/v1/authors?sort=-total_downloads
10 cr
One model

Full 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}
10 cr
One index

One flagship index with its full history series.

/api/v1/indices/dai
5–300+ cr
Model list

Stepped 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=50
20 cr
All four indices

Freedom Velocity is computed from a full scan at request time.

/api/v1/indices
50 cr
Timeline

Hand-curated, not scraped. One call, whole record.

/api/v1/timeline
free
OpenAPI spec

No key required. Deciding whether an API is worth signing up for should not require signing up.

/api/v1/openapi.json
Priced on what you got

Lists cost by rows returned, after filters and after the limit clamp. Ten thousand possible matches capped to fifty → fifty-row price.

60 requests / minute per key

Sliding window. Over the limit → 429 with retry_after in seconds. Refused calls are not charged.

Preview → billed

While metering reads preview, responses show what each call will cost - nothing is deducted yet.

interactive

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'
machine-readable

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
questions

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.

CommandReturnsCredits
abl loginsign in, save keyfree
abl logoutremove the local keyfree
abl whoamikey prefix + balance5
abl creditscredit balance5
abl modelslist models5–300+ (stepped, offset-multiplied)
abl models <id>one model10
abl authorslist authors5–15 (by rows)
abl authors <id>one author1
abl methodsM-code taxonomy5–15 (by rows)
abl methods <id>one method1
abl datasetslist datasets5–15 (by rows)
abl datasets <id>one dataset1
abl indicesall four flagship indices20
abl indices <id>one index with history10
abl timelinecurated field events50

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.

Get an API key→
Catalog is the map. Apps are the tools.

Run models on your own machine, not in the cloud.

Every model page has an "Open in Abliteration" button that hands the model directly to the first-party desktop client, at the quantization your rig can actually run. No API keys, no subscription, no prompt leakage.

Open in Abliteration