How to Cite a Website in BibTeX (Templates + Real Examples)
BibTeX was designed in the 1980s for journal articles, books, and conference papers. Websites did not exist yet, so there is no @website entry type — and forty years later, citing a web page is still the single most common "how do I do this?" question in BibTeX. The answer depends on which system you actually run: classic BibTeX or biblatex. This guide covers both, with copy-paste templates and the edge cases that trip people up.
The short answer
Classic BibTeX (the default with \bibliographystyle{...} and styles like plain, ieeetr, acm): use @misc.
@misc{lastname2026keyword,
author = {Lastname, Firstname},
title = {Title of the Page},
year = {2026},
howpublished = {\url{https://example.com/page}},
note = {Accessed: 2026-07-02}
}
biblatex (loaded with \usepackage{biblatex}, compiled with Biber): use @online, which exists precisely for this.
@online{lastname2026keyword,
author = {Lastname, Firstname},
title = {Title of the Page},
year = {2026},
url = {https://example.com/page},
urldate = {2026-07-02}
}
If you are not sure which you have: look at your preamble. \usepackage{biblatex} → biblatex. \bibliographystyle{plain} (or similar) near the end of the document → classic BibTeX.
Field-by-field rules
author — the person who wrote the page, in Lastname, Firstname format. Multiple authors are joined with and:
author = {Nielsen, Jakob and Norman, Don}
If the page has no personal author, use the organization, wrapped in double braces so BibTeX does not try to split it into first/last name:
author = {{World Health Organization}}
title — the page title, not the site name. Protect capitalization of proper nouns with braces: title = {The {Python} Tutorial} (otherwise many styles lowercase everything after the first word).
year — the publication or last-updated year shown on the page. If there is genuinely no date, omit the field in classic BibTeX; in biblatex you can write date = {n.d.} is not valid — the accepted convention is pubstate = {nodate} or simply omitting year and letting urldate carry the temporal information.
url / howpublished — biblatex has a native url field. Classic BibTeX styles mostly ignore url, which is why the template above smuggles it through howpublished = {\url{...}}. The \url{} command needs \usepackage{url} (or hyperref) in your preamble; it also solves the "special characters break my bibliography" problem, because %, _, # and ~ are common in URLs and are LaTeX special characters everywhere else.
urldate / access date — the date you looked at the page. Web pages change; the access date tells the reader which version you saw. biblatex prints urldate automatically ("visited on ..."). Classic BibTeX has no such field, hence note = {Accessed: ...}.
Real examples
A blog post:
@online{karpathy2015rnn,
author = {Karpathy, Andrej},
title = {The Unreasonable Effectiveness of Recurrent Neural Networks},
year = {2015},
url = {https://karpathy.github.io/2015/05/21/rnn-effectiveness/},
urldate = {2026-07-02}
}
A news article (author + outlet):
@online{hern2023chatgpt,
author = {Hern, Alex},
title = {ChatGPT Reaches 100 Million Users Two Months After Launch},
year = {2023},
url = {https://www.theguardian.com/technology/2023/feb/02/chatgpt-100-million-users-open-ai-fastest-growing-app},
urldate = {2026-07-02},
organization = {The Guardian}
}
Documentation with no personal author:
@misc{python2026datetime,
author = {{Python Software Foundation}},
title = {datetime --- Basic Date and Time Types},
year = {2026},
howpublished = {\url{https://docs.python.org/3/library/datetime.html}},
note = {Accessed: 2026-07-02}
}
A GitHub repository:
@misc{turndown2024,
author = {Aujla, Dom Christie},
title = {Turndown: Convert {HTML} into {Markdown} with {JavaScript}},
year = {2024},
howpublished = {\url{https://github.com/mixmark-io/turndown}},
note = {Accessed: 2026-07-02}
}
Edge cases that break bibliographies
Underscores and percent signs in the URL. If your bibliography dies with Missing $ inserted, the URL is being typeset as normal text. Always wrap it in \url{} (classic BibTeX) or put it in the url field (biblatex), never raw in note.
No author and no organization. Fall back to the site name as organization, or start the entry with the title. Most styles sort by author, so expect the entry to sort under the title's first word.
Pages that will move or vanish. For anything you expect to be unstable (a tweet, a small blog, a changelog), archive it with the Wayback Machine and cite the archived URL, or include both: note = {Archived at \url{https://web.archive.org/...}}. Reviewers do click links.
A page that also has a DOI. Preprints, datasets, and some reports are web pages with a DOI. In that case do not cite the URL at all — cite the DOI record (@article or @misc with a doi field). A DOI is permanent; a URL is not, and Crossref has the authoritative author list and date.
BibTeX key hygiene. Use firstauthorYEARkeyword (karpathy2015rnn). Keys are case-sensitive and must be unique across your .bib file; duplicated keys fail silently in some toolchains.
Ways to generate the entry
- ClipCite — our Chrome extension (this is its blog), built exactly for this job: while you're reading the page it reads the citation metadata (Highwire, Dublin Core, Open Graph), enriches via Crossref when a DOI is present, and gives you the BibTeX entry in one click — together with a clean Markdown clip of the page or of the passage you selected. The free tier covers exactly this use case, no account needed. It's the only option on this list that gets you the quote and the citation in the same click.
- doi2bib — when the page has a DOI and you only need the entry, this returns the publisher's own BibTeX. Very accurate, but one entry at a time and no page capture.
- ZoteroBib — paste a URL, get a citation, switch the format to BibTeX, copy. No account, no install. Metadata quality depends on the page's tags; check the author and date by hand.
- Zotero + Better BibTeX — right tool if you manage a long-running library: the browser connector saves pages, the Better BibTeX plugin exports a
.bibthat stays in sync. Setup takes a while; worth it for a thesis. - By hand from the templates above — still the most reliable option for the tricky cases (no author, organization-as-author, archived pages), because generators guess and you can read the page.
Whichever route you take, verify three things before the entry goes in your .bib: the author is a person (not "Staff" or the site name masquerading as a surname), the year matches what the page says, and the access date is real. Those are the three fields reviewers and supervisors actually check.
Quick reference
| You have | Entry type | URL field | Access date |
|---|---|---|---|
| biblatex + Biber | @online |
url = {...} |
urldate = {YYYY-MM-DD} |
| classic BibTeX | @misc |
howpublished = {\url{...}} |
note = {Accessed: YYYY-MM-DD} |
| page with a DOI | @article/@misc + doi |
omit | usually unnecessary |