This page describes every endpoint of the Domain Feed API. To get started, authenticate, check your plan’s limits or understand the errors, go to getting started. The values in the examples are made up.

Conventions

  • Base URL: https://api.cifradia.com. Every data endpoint lives under /v1.
  • Authentication: send the key in the Authorization: Bearer <your key> header, never in the URL. The examples read it from the KEY variable.
  • Format: responses are JSON (/v1/dailyzip/ returns a ZIP). Parameters go in the query string; encode values with special characters such as % or | (curl --data-urlencode does it for you). For example, the wildcard % is written %25 in the URL: ?kw=%25bank%25.
  • Dates: yyyymmdd in requests (for example 20260115) and yyyy-mm-dd in responses. All are UTC.
  • Plan: your plan limits how far back you can go, which TLDs you can query and whether you can download the daily ZIP. Outside your plan, the API answers 403.
  • Specification: the OpenAPI document is at api.cifradia.com/openapi.json.
export KEY="<your key>"

GET /v1/tlds

Lists the TLDs the feed works with, with their cumulative totals and the counts of each one’s latest update.

Parameters

ParameterTypeDefaultValues and notes
listallbooleanfalse

With true it also includes TLDs that have no data yet (all counts 0).

Example

curl -H "Authorization: Bearer $KEY" "https://api.cifradia.com/v1/tlds"

Response

{
  "status": true,
  "records": 2,
  "data": [
    {
      "tld": "com",
      "domaincount": 1000,
      "total_added_count": 1200,
      "total_deleted_count": 200,
      "latest_add_count": 30,
      "latest_delete_count": 10,
      "last_processed": "2026-01-15"
    },
    {
      "tld": "net",
      "domaincount": 400,
      "total_added_count": 450,
      "total_deleted_count": 50,
      "latest_add_count": 12,
      "latest_delete_count": 4,
      "last_processed": "2026-01-15"
    }
  ]
}

Notes

  • On a plan limited to certain TLDs, the list contains only those TLDs.
  • records is the number of TLDs returned. domaincount is the cumulative net (added minus deleted); total_added_count and total_deleted_count are the cumulative gross figures; latest_add_count and latest_delete_count refer only to the latest processed update (last_processed).

GET /v1/added

Returns the domains newly registered on a date or over a date range, with filters by keyword, TLD and IDN.

Parameters

ParameterTypeDefaultValues and notes
date

text yyyymmdd

latest day with data

Reference date. If you leave it out, the latest day with data is used among the TLDs you ask for or, if you ask for none, among those of your plan.

kwtextnone

Keyword filter on the domain name, without the TLD. Separate alternatives with | (OR) and use % as a wildcard: %bank% contains “bank”, bank% starts with “bank”. Without a wildcard, the name must match exactly. _ matches any single character.

tldstextall in your plan

Comma-separated TLDs, without the dot and case-insensitive, for example com,net,org. If you ask for one your plan does not include, the API answers 403.

dcmtexteq

Date comparison mode: eq (that day), lte (up to that day), lt (before), gte (from that day) or gt (after). Ranges reach up to 45 days before the date (lt, lte) or 45 days after (gt, gte); lte and gte also include the date itself.

idninteger2

0: non-IDN domains only. 1: IDN only. 2: all.

sortontextdate

Field the results are sorted by, highest first: date, domain, length, idn or tld.

dmtextdata

data returns the count and the list of domains; stats returns only the count (records), without the list.

limitinteger50000

Maximum number of domains to return. The cap is 250000; a larger value gives 422.

offsetinteger0

How many domains to skip, for paging. Minimum 0.

Example

curl -G -H "Authorization: Bearer $KEY" \
  --data-urlencode "kw=%bank%" \
  --data-urlencode "tlds=com,net" \
  --data-urlencode "date=20260115" \
  "https://api.cifradia.com/v1/added"

Response

{
  "status": true,
  "date": "2026-01-15",
  "records": 2,
  "source": "added domains",
  "data": [
    {
      "domain": "example.com",
      "name": "example",
      "tld": "com",
      "length": 7,
      "idn": 0,
      "ipv4": null,
      "date": "2026-01-15"
    },
    {
      "domain": "example.net",
      "name": "example",
      "tld": "net",
      "length": 7,
      "idn": 0,
      "ipv4": null,
      "date": "2026-01-15"
    }
  ]
}

Notes

  • records is the total number of domains that match the filters, regardless of limit and offset. To walk a large result, repeat the request adding limit to offset until you reach records, and use sorton=domain: with the default order there are ties, so pages can repeat or skip domains.
  • The response date is the reference date; each domain carries its own date, which matters when you ask for a range.
  • domain is the full name (example.com) and name is the name without the TLD. idn is 0 or 1. ipv4 is optional and is null when there is no value.
  • Added domains: a domain counts on the day we first detect it. The previous day’s changes are usually available around 07:30 UTC; this is a typical timing, not a guarantee.
  • Your plan limits the history: a date before that limit gives 403, and a range that crosses it is clipped to the limit.

GET /v1/deleted

Returns the domains deleted on a date or over a date range, with filters by keyword, TLD and IDN.

Parameters

ParameterTypeDefaultValues and notes
date

text yyyymmdd

latest day with data

Reference date. If you leave it out, the latest day with data is used among the TLDs you ask for or, if you ask for none, among those of your plan.

kwtextnone

Keyword filter on the domain name, without the TLD. Separate alternatives with | (OR) and use % as a wildcard: %bank% contains “bank”, bank% starts with “bank”. Without a wildcard, the name must match exactly. _ matches any single character.

tldstextall in your plan

Comma-separated TLDs, without the dot and case-insensitive, for example com,net,org. If you ask for one your plan does not include, the API answers 403.

dcmtexteq

Date comparison mode: eq (that day), lte (up to that day), lt (before), gte (from that day) or gt (after). Ranges reach up to 45 days before the date (lt, lte) or 45 days after (gt, gte); lte and gte also include the date itself.

idninteger2

0: non-IDN domains only. 1: IDN only. 2: all.

sortontextdate

Field the results are sorted by, highest first: date, domain, length, idn or tld.

dmtextdata

data returns the count and the list of domains; stats returns only the count (records), without the list.

limitinteger50000

Maximum number of domains to return. The cap is 250000; a larger value gives 422.

offsetinteger0

How many domains to skip, for paging. Minimum 0.

Example

curl -G -H "Authorization: Bearer $KEY" \
  --data-urlencode "kw=%bank%" \
  --data-urlencode "tlds=com,net" \
  --data-urlencode "date=20260115" \
  "https://api.cifradia.com/v1/deleted"

Response

{
  "status": true,
  "date": "2026-01-15",
  "records": 2,
  "source": "deleted domains",
  "data": [
    {
      "domain": "example.com",
      "name": "example",
      "tld": "com",
      "length": 7,
      "idn": 0,
      "ipv4": null,
      "date": "2026-01-15"
    },
    {
      "domain": "example.net",
      "name": "example",
      "tld": "net",
      "length": 7,
      "idn": 0,
      "ipv4": null,
      "date": "2026-01-15"
    }
  ]
}

Notes

  • records is the total number of domains that match the filters, regardless of limit and offset. To walk a large result, repeat the request adding limit to offset until you reach records, and use sorton=domain: with the default order there are ties, so pages can repeat or skip domains.
  • The response date is the reference date; each domain carries its own date, which matters when you ask for a range.
  • domain is the full name (example.com) and name is the name without the TLD. idn is 0 or 1. ipv4 is optional and is null when there is no value.
  • Deleted domains: a domain counts on the day we first detect it or it stops appearing. The previous day’s changes are usually available around 07:30 UTC; this is a typical timing, not a guarantee.
  • Your plan limits the history: a date before that limit gives 403, and a range that crosses it is clipped to the limit.

GET /v1/history

Returns every added and deleted event of one domain, oldest first. If the domain was registered and removed several times, all of them appear.

Parameters

ParameterTypeDefaultValues and notes
domaintextrequired

Full domain name, for example example.com. Compared case-insensitively. Without a dot (no TLD) the API answers 400.

Example

curl -G -H "Authorization: Bearer $KEY" \
  --data-urlencode "domain=example.com" \
  "https://api.cifradia.com/v1/history"

Response

{
  "status": true,
  "domain": "example.com",
  "records": 2,
  "data": [
    { "event_type": "added", "date": "2024-03-02" },
    { "event_type": "deleted", "date": "2025-03-05" }
  ]
}

Notes

  • event_type is added or deleted.
  • Only events within your plan’s history are returned. If the domain’s TLD is not in your plan, the API answers 403.
  • A domain with no events returns records: 0 and an empty data.

GET /v1/keywords

Counts how many added or deleted domains contain each keyword: at the start of the name, at the end, in the middle or anywhere. It counts non-IDN domains only.

Parameters

ParameterTypeDefaultValues and notes
sourcetextadded

added or deleted.

dmtextdata

What to return: data (one row per keyword and TLD), stats (only the number of rows, in records), topkw (the most frequent keywords, summed over all TLDs) or aggregate (a single row for one keyword; requires kw).

kwtextthe keywords Cifradia tracks

One or more words separated by |, 4 or more characters each; shorter ones give 400. With dm=aggregate only the first is used. Here % is not a wildcard: the word is searched inside the name.

tldstextall in your plan

Comma-separated TLDs. It filters only with dm=aggregate; the other modes ignore it (all the TLDs of your plan are used), but a TLD outside your plan still gives 403.

date

text yyyymmdd

latest day with dataReference date.
dcmtexteq

Date comparison mode: eq, lt, gt, lte or gte, with the same 45-day cap as /v1/added.

limitinteger100

Maximum rows for dm=topkw; the cap is 1000. The other modes ignore it.

Example

curl -G -H "Authorization: Bearer $KEY" \
  --data-urlencode "kw=bank|insurance" \
  --data-urlencode "dm=data" \
  --data-urlencode "source=added" \
  "https://api.cifradia.com/v1/keywords"

Response

{
  "status": true,
  "date": "2026-01-15",
  "records": 2,
  "data": [
    {
      "keyword": "bank",
      "tld": "com",
      "domains_starting_with_word": 12,
      "domains_ending_with_word": 5,
      "domains_with_word_in_middle": 3,
      "domains_containing_word_anywhere": 20
    },
    {
      "keyword": "insurance",
      "tld": "com",
      "domains_starting_with_word": 8,
      "domains_ending_with_word": 2,
      "domains_with_word_in_middle": 1,
      "domains_containing_word_anywhere": 11
    }
  ]
}

Notes

  • Rows are ordered from most to fewest domains containing the word (domains_containing_word_anywhere).
  • With dm=stats the response has status, date and records, without data. With dm=aggregate, data has a single row and no tld.
  • domains_containing_word_anywhere counts every domain that contains the word, wherever it is. A name that both starts and ends with it counts in both position counters.

GET /v1/dailyzip/

Downloads a ZIP with every domain added or deleted on one day, one full name per line, in a text file. It is meant for whoever needs the whole day without paging.

Parameters

ParameterTypeDefaultValues and notes
date

text yyyymmdd

the previous day (UTC)Day to download the list for.
sourcetextadded

added or deleted.

latestbooleanfalse

With true it downloads what has been processed so far for today (UTC). It cannot be combined with date: the API answers 400.

Example

curl -H "Authorization: Bearer $KEY" \
  -o added_20260115.zip \
  "https://api.cifradia.com/v1/dailyzip/?date=20260115&source=added"

Response

added_20260115.zip
└── added_2026-01-15.txt     # one domain per line, for example:
                             #   example.com
                             #   example.net

Notes

  • The path has a trailing slash: /v1/dailyzip/.
  • It is only in the plans that include it (Pro and Business). On Starter the API answers 403.
  • The file is generated while it downloads, so its size is not known in advance. It respects your plan’s history and includes only the TLDs your plan allows.