Skip to content

Publications

chronicle.publications registers external publications — papers you have a DOI or BibTeX for — so they can be cited as experiment inputs and discovered by anyone on Chronicle.

A publication is a public, system-owned, immutable reference asset (asset_type: "publication"). You register it once from a DOI or a BibTeX entry; a known DOI dedups to the existing record rather than minting a duplicate. Because it's a plain asset, you cite it like any other input — pass its id to variations.create(input_asset_ids=[...]), or link it to an open experiment or variation with chronicle.datasets.link(pub_id, experiment_id).

Register by DOI

Pass a doi and Chronicle resolves the metadata (via Crossref, falling back to doi.org):

result = chronicle.publications.register(doi="10.1103/PhysRevLett.116.061102")
pub = result["publication"]
print(pub["id"], result["existing"])   # asset id; True if it deduped to an existing record

register returns {"publication": {...}, "existing": bool}. A DOI Chronicle already knows returns the existing record with existing=True.

Parameter Type Default Notes
doi str None Resolved via Crossref → doi.org. Dedup identity.
bibtex str None Raw BibTeX entry. One of doi / bibtex is required.
draft bool False Register a private, mutable placeholder (see below).
confirm_create bool False Mint a new record when a BibTeX entry needs resolution.

You must pass at least one of doi or bibtex, or register raises ValueError.

Register by BibTeX

When you only have a BibTeX entry, pass it as bibtex:

result = chronicle.publications.register(bibtex="""
@article{ligo2016,
  title  = {Observation of Gravitational Waves from a Binary Black Hole Merger},
  author = {Abbott, B. P. and others},
  journal= {Physical Review Letters},
  year   = {2016},
  doi    = {10.1103/PhysRevLett.116.061102},
}
""")

A BibTeX entry with no DOI that doesn't cleanly match may come back as:

{"status": "needs_resolution", "parsed": {...}, "candidates": [...]}

Pick a candidate and link it as a citation, or re-call with confirm_create=True to mint a fresh record from your parsed entry.

Drafts and finalize

For work that isn't published yet, register a draft — a private, mutable placeholder owned by you, citable immediately:

draft = chronicle.publications.register(
    bibtex="@unpublished{ours2026, title={Ripple PDE Distillation}, author={...}, year={2026}}",
    draft=True,
)["publication"]

A draft is the only mutable publication; registered ones are immutable. Once the work is accepted, finalize promotes the draft in place to a registered, public record:

chronicle.publications.finalize(
    draft["id"],
    doi="10.5555/our-accepted-paper",
)

The asset id is unchanged, so existing citation links stay intact. As with register, pass at least one of doi / bibtex (or it raises ValueError). Only a draft you can write may be finalized. Returns {"publication": {...}}.

Search and get

search matches registered publications by title, newest first — run it before registering to reuse an existing record:

hits = chronicle.publications.search("gravitational waves")

Calling search() with no query returns the full list. For full-text or semantic matching, use chronicle.search with asset_types=["publication"] instead.

Fetch a single record (it's an asset) by id:

pub = chronicle.publications.get(draft["id"])