C library for the Public Suffix List
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
George Sokianos 92d3ef3d19 Changes in the Makefile.os4 to fully compile 8 months ago
.github CI: Install missing autopoint 10 months ago
contrib Make builtin option independant from runtime one 1 year ago
docs/libpsl meson: build reference manual with gtk_doc 3 years ago
fuzz Release v0.21.2 9 months ago
include Release v0.21.2 9 months ago
list@4aec132984 Update PSL 10 months ago
m4 Update m4/ax_check_compile_flag.m4 2 years ago
msvc Make builtin option independant from runtime one 1 year ago
po autoconf first version 10 years ago
src Release v0.21.2 9 months ago
tests Release v0.21.2 9 months ago
tools tools/psl.c: Fix build on Windows 9 months ago
.dir-locals.el document indentation conventions for emacs users 10 years ago
.gitignore Rename suffixes_dafsa.c to suffixes_dafsa.h 5 years ago
.gitmodules Add https://github.com/publicsuffix as git submodule 8 years ago
.lgtm.yml Add .lgtm.yml 5 years ago
.travis.yml Try if upgrading ubuntu helps with the coveralls issue 3 years ago
.travis_coveralls.sh Cleanup .travis_coveralls.sh 6 years ago
AUTHORS Release V0.21.0 5 years ago
COPYING Release v0.21.2 9 months ago
LICENSE Release v0.21.2 9 months ago
Makefile.am Include meson build files into tarball 4 years ago
Makefile.os4 Changes in the Makefile.os4 to fully compile 8 months ago
NEWS Release v0.21.2 9 months ago
README inital commit 10 years ago
README.MSVC.md NMake builds: Include Visual Studio version in output dir 4 years ago
README.md Add 'Building from tarball' to README.md 3 years ago
autogen.sh Let autogen.sh work on Solaris and without gtkdocize 8 years ago
configure.ac Use AC_SYS_LARGEFILE 11 months ago
libpsl.pc.in s/Publix/Public/ 7 years ago
libtool_version_info.txt Release v0.21.2 9 months ago
meson.build meson: Clean up ICU dependency search 9 months ago
meson_options.txt Make builtin option independant from runtime one 1 year ago
version.txt Release v0.21.2 9 months ago


Travis-CI Status Coverity Scan Coverage Status

Solaris OpenCSW Build Status Solaris amd64 Build Status Solaris i386 Build Status Solaris Sparc Build Status Solaris SparcV9

libpsl - C library to handle the Public Suffix List

A Public Suffix List is a collection of Top Level Domains (TLDs) suffixes. TLDs include Global Top Level Domains (gTLDs) like .com and .net; Country Top Level Domains (ccTLDs) like .de and .cn; and Brand Top Level Domains like .apple and .google. Brand TLDs allows users to register their own top level domain that exist at the same level as ICANN's gTLDs. Brand TLDs are sometimes referred to as Vanity Domains.

Browsers, web clients and other user agents can use a public suffix list to:

  • avoid privacy-leaking "supercookies"
  • avoid privacy-leaking "super domain" certificates (see post from Jeffry Walton)
  • domain highlighting parts of the domain in a user interface
  • sorting domain lists by site


  • has built-in PSL data for fast access (DAWG/DAFSA reduces size from 180kB to ~32kB)
  • allows to load PSL data from files
  • checks if a given domain is a "public suffix"
  • provides immediate cookie domain verification
  • finds the longest public part of a given domain
  • finds the shortest private part of a given domain
  • works with international domains (UTF-8 and IDNA2008 Punycode)
  • is thread-safe
  • handles IDNA2008 UTS#46 (if libicu is available)

Find more information about the Public Suffix List here.

Download the Public Suffix List here.

The original DAFSA code is from the Chromium Project.

API Documentation

You find the current API documentation here.

Quick API example

#include <stdio.h>
#include <libpsl.h>

int main(int argc, char **argv)
	const char *domain = "www.example.com";
	const char *cookie_domain = ".com";
	const psl_ctx_t *psl = psl_builtin();
	int is_public, is_acceptable;

	is_public = psl_is_public_suffix(psl, domain);
	printf("%s %s a public suffix.\n", domain, is_public ? "is" : "is not");

	is_acceptable = psl_is_cookie_domain_acceptable(psl, domain, cookie_domain);
	printf("cookie domain '%s' %s acceptable for domain '%s'.\n",
		cookie_domain, is_acceptable ? "is" : "is not", domain);

	return 0;

Command Line Tool

Libpsl comes with a tool 'psl' that gives you access to most of the library API via command line.

$ psl --help

prints the usage.

Convert PSL into DAFSA

The DAFSA format is a compressed representation of strings. Here we use it to reduce the whole PSL to about 32k in size.

Generate psl.dafsa from list/public_suffix_list.dat

$ src/psl-make-dafsa --output-format=binary list/public_suffix_list.dat psl.dafsa

Test the result (example)

$ tools/psl --load-psl-file psl.dafsa aeroclub.aero


Libpsl is made available under the terms of the MIT license.
See the LICENSE file that accompanies this distribution for the full text of the license.

src/psl-make-dafsa and src/lookup_string_in_fixed_set.c are licensed under the term written in src/LICENSE.chromium.

Building from tarball

Choose a release from https://github.com/rockdaboot/libpsl/tags an download the tarball named libpsl-{version}.tar.*. Unpack with tar xf <filename>, cd into the libsl* directory.

Build with

make check

Install with

sudo make install

Building from git

You should have python2.7+ installed.

Download project and prepare sources with

	git clone https://github.com/rockdaboot/libpsl
	make check

If you prefer a meson build

	meson builddir
	ninja -C builddir
	ninja -C builddir test

There is also an unofficial MSVC nmake build configuration in msvc/. Please see README.MSVC.md on building libpsl with Visual Studio via NMake or Meson.

Mailing List

Mailing List Archive

Mailing List

To join the mailing list send an email to


and follow the instructions provided by the answer mail.

Or click join.