NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #541 most downloaded on PyPI
Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well.
Last release today
03 Oct 2026
Release timing varies
gaps range from 1 weeks to 8 months
Nearly every release is documented
notes for 54 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
16 years old
67 releases · first in 2011
Document added and deprecated names
Full Changelog: 5.3.2...5.4.0
One column per quarter.
Fix reverse_domain_name stray dots when suffix or domain empty
reverse_domain_name stray dots when suffix or domain empty (#368)Full Changelog: 5.3.1...5.3.2
Drop support for EOL Python 3.9
Full Changelog: 5.3.0...5.3.1
Deprecate registered_domain property
registry_suffix (#344)
suffixtop_domain_under_public_suffix (#344)top_domain_under_registry_suffix (#344)registered_domain property
top_domain_under_public_suffix instead, which has the same behaviorreverse_domain_name property in CLI --json output (a545c67)suffix_index return type to be richer than bools, andFull Changelog: 5.2.0...5.3.0
Add reverse_domain_name result property
reverse_domain_name result property (#342)ExtractResult and update (36ff658)
Full Changelog: 5.1.3...5.2.0
Drop support for EOL Python 3.8
Full Changelog: 5.1.2...5.1.3
Remove socket.inet_pton , to fix platform-dependent IP parsing
What's Changed Bugfixes Fix path join on Windows ( #314 ) Support Python 3.12 Contributors @elliotwutingfeng Full Changelog : 5.1.0...5.1.1
Full Changelog: 5.1.0...5.1.1
Allow passing in requests.Session
Full Changelog: 5.0.1...5.1.0
Indicate MD5 not used in a security context (FIPS compliance)
Full Changelog: 5.0.0...5.0.1
Migrate ExtractResult from namedtuple to dataclass
ExtractResult from namedtuple to dataclass (#306)
This means no more iterating/indexing/slicing/unpacking the result
object returned by this library. It is no longer a tuple. You must
directly reference the fields you're interested in.
For example, the
following will no longer work.
tldextract.extract("example.com")[1:3]
# TypeError: 'ExtractResult' object is not subscriptableInstead, use the following.
ext = tldextract.extract("example.com")
(ext.domain, ext.suffix)Full Changelog: 4.0.0...5.0.0
Always include suffix if private suffix enabled and private suffix exists
is_private: bool, to the ExtractResult
namedtuple, indicating whether the extraction came from the PSL's
private domains or not.ExtractResult.subdomain) or convenience properties (e.g.
ExtractResult.{fqdn,registered_domain}).Full Changelog: https://github.com/john-kurkowski/tldextract/compare/3.5.0...4.0.0
This is the same content as version 3.6.0, originally released 2023-09-19, which was yanked.
Nothing published for this version
Accept only 4 decimal octet IPv4 addresses
Full Changelog: https://github.com/john-kurkowski/tldextract/compare/3.4.4...3.5.0
Honor private domains flag on self, not only when passed to __call__
self, not only when passed to __call__ (#289)Speed up 10-15% over all inputs
suffix_index() to use a trie (#285)Speed up 10-40% on "average" inputs, and even more on pathological inputs, like long subdomains
Fix Pyright not finding tldextract public interface
Add method extract_urllib to extract from a urllib.parse.{ParseResult,SplitResult}
Fix documented types, in README and in exception message
Add CLI flag --suffix_list_url to set the suffix list URL(s) or source file(s)
Fix incorrect namespace used for caching function returns
Only run pylint in Tox environments, i.e. CI, not by default in tests
Drop support for EOL Python 3.5
Prefer to cache in XDG cache directory in user folder, vs. in Python install folder
Catch permission error when making cache dir, as well as cache file
Fix tlds property AttributeError
No changes since 3.0.0.rc1.
No changes since 3.0.0.rc1.
This release fixes the long standing bug that public and private suffixes were generated separately and could not be switched at runtime, #66.
This release fixes the long standing bug that public and private suffixes were generated separately and could not be switched at runtime, #66.
cache_file to cache_dir as it is no longer a single file but a directory (#207)--cache_file to --cache_dirinclude_psl_private_domains on call, not only on constructiondebug log the diff during updateFix concurrent access to cache file when using tldextract in multiple threads
Use pkgutil instead of pkg_resources
Ignore case on punycode prefix check
Add cache_fetch_timeout kwarg and TLDEXTRACT_CACHE_TIMEOUT env var
* Features * Add fqdn convenience property (#129) * Add ipv4 convenience property
Switch to explicit Python version check
Consolidate test suite running with tox
Relax required requests version: >= 2.1
No changes since 2.0rc1.
No changes since 2.0rc1.
This release focuses on shedding confusing code branches & deprecated cruft.
This release focuses on shedding confusing code branches & deprecated cruft.
TLDExtract constructor param
suffix_list_url
str or iterable. Its replacement,
suffix_list_urls only takes an iterable. This better communicates
that it tries a sequence of URLs, in order. To only try 1 URL, pass
an iterable with exactly 1 URL str.pickle) - #81
TLDExtract's fetch param. To disable live HTTP requests for the
latest PSL, instead pass suffix_list_urls=None.ExtractResult.tld property. Use ExtractResult.suffix instead.tldextract.tldextract into a few files.
import tldextract. But if you were relying on direct import from
tldextract.tldextract anyway, those imports may have moved.python -m tldextract for the same
effect as the included tldextract console script. This used to
be python -m tldextract.tldextract.Support possible gzipped PSL response - #88
Fix potential for UnicodeEncodeError with info log - #85
UnicodeEncodeError with info log - #85Ease running scripts during local development
Domain parsing fails with trailing spaces - #75
Fix publishing mistake with 1.7.0.
Fix publishing mistake with 1.7.0.
Nothing published for this version
Pass extra_suffixes directly to constructor
extra_suffixes directly to constructorAvoid u'' literal for Python 3.0 - 3.2 compatibility. Tests will still fail though.
Exclude PSL's private domains by default - #19
include_psl_private_domains=TrueUnicodeError for inputs that looked like an IPFix minor Python 3 unicode errors
Match PSL's GitHub mirror rename, from mozilla-central to gecko-dev
Specify your own PSL url/file with suffix_list_url kwarg
suffix_list_url kwargfallback_to_snapshot kwarg - defaults to Truefetch kwargNothing published for this version
Nothing published for this version
New aliases suffix and registered_domain
suffix and registered_domainNothing published for this version
Nothing published for this version
Nothing published for this version
* Bugfixes * Reliable logger name (#10) * Forgotten import sys
* Docs * Summarize advanced usage * Removals * Remove deprecated global
Your coding agent can read these notes before it upgrades. Set up the MCP server →