Alternatives to DataForSEO, read as a glossary of actions
A reference you can keep open next to the notebook. First the actions and their price, then the vocabulary that trips people up when a link table lands in R.
CranSEO research team ·
Find the action you need, note its credit cost, then check the term list below for anything unfamiliar. We list no column names here because you should read them from your own glimpse() output.
Actions: what one call gives you
| Action | Credits | What you get |
|---|---|---|
| domain, overview, stats, suggest | Free | Quick profile of a domain and suggestions; no key |
| bulk_dr | 1 | DR for up to 2,000 domains per call |
| compare | 1 | Side-by-side figures for up to 20 domains |
| top, dr_distribution, tld_breakdown | 1 | Rankings and distributions of the index |
| refdomains, backlinks | 2 | Rows of referring domains or individual links |
| anchors, toppages, anchor_cloud | 2 | Anchor text and most-linked pages |
| intersect | 2 | Domains linking to 2 to 10 targets at once |
| search, keyword | 3 | Full-text over anchors, titles and URLs; exact-anchor lookup |
Terms that confuse people in a data frame
| Term | Plain meaning |
|---|---|
| Referring domain | A distinct site that links to you, counted once however many links it sends |
| Backlink | One link from one page to another; many can come from the same referring domain |
| DR | round(100 log(ref_domains + 1) / log(2 10^7)); a log scale, so 10 to 20 is easier than 70 to 80 |
| Anchor | The clickable text of a link, useful as a categorical column |
| Link graph | Our own crawler's map of domain-to-domain links: 2,774,625,913 of them |
| Snapshot | The monthly state of the index; store its date next to every pull |
| Credit | Billing unit, $0.0001 each; a call is billed once whatever the row count |
Reading the action table like a data model
Think in grains. Every action returns rows at a certain level, and mixing levels is the quickest way to double-count.
refdomains gives one row per linking site, backlinks gives one row per link, anchors gives one row per distinct anchor text. A join between the first and the second multiplies rows, so aggregate before you merge and check nrow() before and after.
Paging works the same everywhere: page and per, with per between 10 and 5000, sorted by sort and order=asc|desc. Up to 1,000 rows come back per call, and deep pagination stops at 50,000, so ask for the sort that puts your answer first.
For the budget side of these choices, see the notebook budget, and for a chosen provider mix the decision tree.
Two warnings before you model anything
DR is not Moz DA. It is our own metric, built only from referring-domain counts, so never mix it with Ahrefs DR in one regression.
Counts also depend on the crawl. A site with a sudden jump after the March 2024 core update may simply have been crawled more fully this month, so check the snapshot date before telling a client anything.
Treat the glossary as a contract with your future self. If a column surprises you in six months, the definition above is what you should have assumed.
Naming habits for your own columns
Rename on import. Do it once.
Prefix columns by action, for example refdomains or anchors, before you join anything, so a merge never produces two columns that mean different things under the same name. Write the rename step into a function and reuse it in every notebook that touches the API.
This costs five lines and saves the argument about what a column means, which is the most common source of wrong numbers in link reports.