Semrush is a competitive research suite. It describes ground somebody else already holds: the organic and paid keywords a domain ranks for, the ads it runs, the sites that link to it, where its pages sit. It does not watch your site, it watches your market, and a script can query it through its application programming interface instead of a report screen.
When the unit balance falls short, the pull does not fail. It shortens. The file arrives, it looks whole, and it is not.
1. The problem it solves for me
Search Console only returns my own property, and a volume source describes demand without saying who captures it. Starting an account, the same piece is always missing: the ground somebody else holds. Which of a competitor's pages picks up what, which words he buys clicks on, which sites cite him.
On a prime residential account, demand already existed and was split between a handful of established houses. The question was which of their pages collected it, and where those pages were linked from. No source coming out of the search engine answers that, and it is the only reason I pay for an estimation tool.
2. What I do with it, and the pull that taught me the lesson
On 20 August 2026 I pulled the referring domains of a set of competitors in a single pass. Roughly 620 rows came back. The price is written report by report in the Semrush documentation for backlink reports: the backlinks list and the referring domains list both cost 40 API units per row. 620 rows, so close to 25,000 units, and the month's balance went in that one request.
Since then I cap at 50 rows by default and price the pull before running it. Fifty referring domains sorted by authority say what 620 say about a competitor: the same directories, the same platforms, and the three or four genuine editorial links you will have to earn one at a time. The rest I had paid for and never read.
3. What I never ask it for
An uncapped pull. This is the most expensive limit of the lot, and the Semrush documentation on API unit balance spells it out: when the balance does not cover the number of rows requested, the response carries the number of rows the balance can pay for. No error, no warning, just a shorter export. On other families of requests, the same situation does return an error code.
A truncated file that never announces itself is more dangerous than a request that fails. The failed request is visible. The short file goes into a sheet, then into a recommendation, then in front of a client. So I read the balance before every pass, and compare rows returned against rows requested.
History by reflex. Semrush publishes its own worked example: 50 domains at 500 keywords cost 250,000 units in current data, and 1,250,000 more if you also want the state of play twelve months earlier. Five times the price, because a historical row is billed at 50 units where a current row costs 10. History gets requested on the shortlist, never on the starting list.
A measurement. The organic traffic Semrush displays is rebuilt from rankings and volumes. It is a model, not a count, and nothing guarantees it lands anywhere near right on a given site. What Google actually served is read elsewhere, and I have written up that source's own blind spots in what I ask Search Console for.
A competitor's full link profile. At 40 units a row, a domain carrying 5,000 links is worth 200,000 units on its own. I take the top slice sorted by authority and go elsewhere for the bulk, where link data is billed on another basis. What decides the outcome is not in a file anyway, it is what you have to offer in exchange for a link.
4. What I run alongside it
Three sources, three jobs, and none replaces the other two. Search Console measures what the engine served of my site. DataForSEO gives demand. Semrush describes ground held by others. When the third contradicts the first about my own site, the first wins.
On the paid side it is the same use turned round: the ads a competitor runs and the words he bids on weigh on my campaign plan, starting with the question of whether to pay for your own brand name. Against a paid search budget, one request on a competitor's ads costs less than a month spent testing blind.
5. What it costs, and the three moves that stop it costing more
Units are bought in packages on top of the subscription, and most analytics reports consume them by the row. Three moves are enough to stop losing them.
The first costs nothing: Semrush documents a free request that returns the remaining balance. It goes before every pull, not after. The second is the parameter that caps rows returned, set as a default rather than as a fix once the balance is down. The third is the query log, which gives each call its cost in units and the balance left immediately after: enough to explain a pass that got away from you, and not repeat it.
One detail worth having: an empty response consumes nothing. A filter that is too tight can be checked for free before it is widened onto a request that will cost.
Weigh the ore before you smelt it
A 620-row file and a 50-row file say the same thing about a market. Only the second leaves you something to work with next month. And when the balance runs short nothing warns you: the row count simply drops, without a word. Knowing what you are looking for before you send the request is what makes the file mean anything at all.
Want to know what your competitors are actually capturing?
I look at their pages, their links and their ads, and I tell you what can be taken back and what cannot. It is the starting point of my SEO and paid search engagements.
Request a free audit