Convert CSL-JSON to BibTeX
This is the reverse of a BibTeX-to-CSL-JSON conversion: it takes CSL-JSON — the
format used by Pandoc and citeproc — and produces BibTeX entries you can
use directly with LaTeX. It is handy when a collaborator sends a .json bibliography
but your document is built with bibtex or biber.
When to use this tool
The most common situation is receiving a bibliography.json from someone using
Pandoc-flavoured Markdown or Zotero’s “CSL JSON” export. If your own document uses
\bibliography{refs} and compiles with pdflatex + bibtex, you need a .bib
file, not JSON. Paste the CSL-JSON here and copy a ready-to-add .bib block.
It is also useful when you have chained a CSL-based reference manager upstream but
need to hand off a LaTeX project to a journal that only accepts .bib submissions.
How it works
The tool parses the JSON (accepting either an array of items or a single object),
then walks each CSL item. The CSL type chooses the BibTeX entry type
(article-journal→@article, paper-conference→@inproceedings, thesis→@phdthesis,
and so on). Variables are mapped back to fields: title→title, container-title→journal
or booktitle, volume→volume, issue→number, page→pages (with - rewritten as the
LaTeX --), DOI→doi, publisher→publisher.
Author and editor arrays are rebuilt into Family, Given strings joined with and.
The issued date-parts array supplies the year (and month if present). Special
characters such as &, % and _ are escaped so the resulting .bib compiles
cleanly under LaTeX.
Worked example
Given this CSL-JSON snippet:
[{
"id": "Doe2023",
"type": "article-journal",
"title": "On Logical Inference",
"author": [{"family": "Doe", "given": "Jane"}],
"issued": {"date-parts": [[2023, 4]]},
"container-title": "Journal of Logic",
"volume": "12",
"page": "55-67",
"DOI": "10.0000/jol.2023.55"
}]
The converter produces:
@article{Doe2023,
author = {Doe, Jane},
title = {On Logical Inference},
journal = {Journal of Logic},
year = {2023},
month = {4},
volume = {12},
pages = {55--67},
doi = {10.0000/jol.2023.55},
}
Notice that the page range becomes 55--67 with the LaTeX double-hyphen, ready for
typesetting as an en-dash.
Notes and edge cases
If a CSL item lacks an id, a cite key is synthesised from the first author’s family
name and the year (for example Smith2021). Page ranges are normalised to the LaTeX
double-hyphen en-dash form (3--17) regardless of how they were written in the input.
For CSL types without a direct BibTeX mapping — webpage, broadcast, dataset — the
entry falls back to @misc, which is the conventional catch-all. You may want to
manually promote these to @online or @unpublished if you are using BibLaTeX rather
than plain BibTeX, since BibLaTeX defines those richer entry types.
BibTeX vs BibLaTeX: which do you need?
If your document compiles with pdflatex + bibtex, you need classic BibTeX output. If it uses biblatex + biber (now common in German academic publishing and increasingly elsewhere), you have richer entry types available — @online, @software, @dataset — and may want to manually edit the @misc fallbacks after conversion.
A quick way to tell which system you are using: look at your .tex preamble. \usepackage{biblatex} means BibLaTeX/biber; \bibliographystyle{...} means classic BibTeX.
Common problems after conversion
Missing abstract or URL fields. BibTeX traditionally ignores abstract and url fields, but BibLaTeX respects them. If you need these preserved, check that the CSL items carry a URL key — the converter maps it to the url field. Abstracts are not part of the standard CSL-to-BibTeX mapping and will not appear in the output.
Accented characters. CSL-JSON stores text in Unicode. Classic BibTeX works best when accents are encoded as LaTeX commands ({\'e} rather than é). If your journal uses pdflatex without inputenc=utf8, you may need to escape diacritics after conversion. BibLaTeX with biber handles UTF-8 natively and requires no escaping.
Conference proceedings. CSL’s paper-conference maps to @inproceedings, but it only populates the booktitle field if the CSL item carries a container-title. If your CSL lacks that key, the booktitle will be empty — fill it in manually from the conference name.
Everything runs locally in your browser — your citation data is never uploaded.