Technical previewShare feedback
Fairspec
FairspecMaking data FAIR

Open source · MIT License

Standard and software to make data FAIR

Data exchange format compatible with DataCite for metadata and JSON Schema for structured data, shipped with Python, TypeScript, Rust, an MCP server, agent skills and a desktop app.

DataCite compatible metadata
"doi": "10.5281/zenodo.1234567",
"titles": [{ "title": "Climate Survey 2025" }],
"creators": [{ "name": "Ada Lovelace" }]
JSONSchema compatible for the data
"tableSchema": {
  "properties": {
    "id": { "type": "integer" },
    "temperature": { "type": "number" }
  }
}

Validating a 10 GB CSV

19.4M rows · 41 columns

5×faster than next

  • Fairspec12.6 s
  • pandera64.9 s
  • qsv71.4 s
  • CSV Validator8.8 min
  • frictionless-py13 min

Complete validators only; dataframely, Great Expectations, pandera (polars) and pointblank ran out of memory under 10 GB.

A simple format for FAIR data

Built on widely-adopted open standards. Easy to adopt, easy to extend.

  • Standards-based

    Compatible with DataCite Metadata Schema 4.6 for citation and JSON Schema Draft 2020-12 for structural validation.

  • Format-agnostic

    Describes any kind of data — CSV, TSV, JSON, JSONL, Parquet, Arrow, XLSX, ODS, SQLite — through a unified file dialect layer.

  • FAIR by design

    Findable, Accessible, Interoperable, and Reusable. Datasets carry the metadata needed to be properly cited and discovered.

  • Extensible

    Domain-specific profiles add custom properties and validation rules while staying compatible with the base specification.

dataset.json
{
  "$schema": "https://fairspec.org/profiles/latest/dataset.json",
  "title": "Climate Survey 2025",
  "creators": [
    { "name": "Ada Lovelace" }
  ],
  "resources": [
    {
      "data": "measurements.csv",
      "fileDialect": { "format": "csv" },
      "tableSchema": {
        "primaryKey": ["id"],
        "properties": {
          "id": { "type": "integer" },
          "temperature": { "type": "number" }
        }
      }
    }
  ]
}

One command. A FAIR dataset.

Point Fairspec at your files and it describes them: dialect, schema and integrity, ready to cite and validate.

terminal

$ cat members.csv

id,name,joined,score
1,Ada,2024-01-15,91.5
2,Grace,2024-02-03,88.0
3,Linus,2024-03-21,79.25

$ fairspec dataset infer members.csv --json > dataset.json

$ fairspec dataset validate dataset.json

✔ Validation passed

dataset.json
{
  "resources": [
    {
      "data": "members.csv",
      "name": "members",
      "textual": true,
      "integrity": { "type": "sha256", "hash": "67c830fe…108a" },
      "fileDialect": {
        "format": "csv", "delimiter": ",",
        "lineTerminator": "\n", "headerRows": [1]
      },
      "tableSchema": {
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": "string" },
          "joined": { "type": "string", "format": "date" },
          "score": { "type": "number" }
        }
      }
    }
  ]
}

Ready for AI agents

Hand the busywork of describing and checking data to your coding agent or AI assistant.

claude

› Why does broken.csv fail its schema?

●

Loading the fairspec-validation skill.

Skill(fairspec-validation)

●

Running the check it recommends.

$ fairspec table validate broken.csv --schema schema.json

⎿

✖ Value of the cell x in column id of row 3 is not integer

✖ Value of the cell 2024-02-30 in column joined of row 2 is not date

●

Both are cell/type errors: fix the value, or the schema's type or format.

  • Agent skills

    npx skills add https://fairspec.org teaches Claude Code, Cursor or Codex to explore, infer and validate data with Fairspec.

  • MCP server

    Gives any MCP-capable assistant tools to validate data, infer schemas and query tables, running on your machine.

  • A CLI built for scripts

    Commands take --json, so an agent with a shell reads results as data, not prose.

  • Docs agents can read

    Every page has a Markdown twin, indexed in /llms.txt.

Conformance suite

One test suite, every language

Python, TypeScript and Rust run the same language-neutral cases: the same input, the same operation, the same expected result. A difference between them is a failing test, not a surprise in your data.

test cases
2,000+
operations
17
libraries
3
Browse the suite →
conformance/tests/table-validate/cell-type.json
{
  "description": "a word is a cell/type error",
  "data": "id,name\ninvalid,alice\n2,bob\n",
  "valid": false,
  "errors": [{
    "type": "cell/type", "columnName": "id",
    "columnType": "integer", "rowNumber": 1,
    "cell": "invalid"
  }]
}
PythonTypeScriptRust

Performance

Validating a 10 GB CSV against its Table Schema from Python, Rust and TypeScript, against complete validators only: tools that check every cell and report each failing one. Each tool gets at most 10 GB of memory.

benchmark · 10 GB CSV · 19.4M rows · 41 columns · 795M cells
  • Fairspec (Python)795 MB/s1.0 GB
  • Fairspec (Rust)795 MB/s1.0 GB
  • Fairspec (TypeScript)647 MB/s1.6 GB
  • pandera (DuckDB)154 MB/s6.2 GB
  • qsv140 MB/s3.8 GB
  • CSV Validator18.9 MB/s3.1 GB
  • frictionless-py12.7 MB/s2.7 GB
  • pandera (polars)ran out of memory—> 10 GB
  • pointblank (polars)ran out of memory—> 10 GB
  • dataframelyran out of memory—> 10 GB
  • Great Expectations (pandas)ran out of memory—> 10 GB

Input megabytes per second and peak memory, median of 2 runs on an AMD Ryzen 5 PRO 7545U. Every finishing tool reports the same 100 seeded errors. Reproduce with pnpm -C benchmark measure --case nyc-311 --size 10GB.

Describe your data. Make it FAIR.

Read the specifications, browse the examples, and start describing your datasets in minutes.