A standard click-through curve says that moving our 71 best page-2 queries up to position 5 is worth about 1,224 extra clicks a month. Our own page-1 results say the real figure is closer to 16.

Both numbers come from the same Search Console data, run through the endpoint this post is about. The gap between them is the most useful thing we found while building it, and it changed what the endpoint returns.

What a page-2 quick win is

A query where you rank 11 to 20 is one page away from being seen. The page already exists and Google already thinks it is relevant. Moving it a few places is usually less work than ranking a new page from nothing. SEO people call these striking-distance keywords or low-hanging fruit.

Finding them by hand means exporting Search Console, filtering positions, sorting by impressions and guessing which ones matter. POST /quick-wins does that and adds three things: the page each query lands on, an opportunity score, and an estimate of extra clicks.

We do not connect to your Search Console

Be clear on this before anything else. There is no "connect your Google account" button. Our product has Search Console access to exactly one property, our own, through a service account. We did not build an OAuth connection for customers.

So the endpoint takes rows you export yourself and does the arithmetic. Nothing is fetched and nothing is stored.

curl -X POST "https://seoscoreapi.com/quick-wins" \
  -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
  -d '{
    "rows": [
      {"query": "moz alternatives", "page": "https://example.com/vs/moz",
       "clicks": 0, "impressions": 1059, "position": 11.1}
    ]
  }'

It accepts three shapes:

  • rows as objects with query, page, clicks, impressions and position
  • rows exactly as the Search Analytics API returns them, with keys: [query, page]. The API returns up to 25,000 rows per request when you ask for the query and page dimensions together.
  • csv, the Performance report export as text. Columns are matched by header name.

page is optional. The report's export lists queries and pages in separate files, so rows from the queries file have no page. You still get the ranked list; you don't get the landing page.

What we ran it on

We pulled our own property, seoscoreapi.com, for the 28 days ending 2026-10-02, by query and page: 2,794 rows covering 1,818 queries.

Count
Queries ranking 11 to 20 580
Left out for fewer than 50 impressions 509
Quick wins 71
Impressions behind those 71 20,369

One page accounts for 21 of the 71: our Moz comparison, with 8,436 impressions across queries like "moz alternatives" (position 11.1) and "moz api" (12.0). That is a clear instruction. One page to improve, not 21 keywords to chase.

This is one site, ours, in one month. It is a developer-tool site with odd traffic, as you are about to see. Your numbers will look different.

The estimate, and why we didn't trust it

For each quick win the endpoint works out extra clicks like this: impressions times the click-through rate expected at the target position, minus the clicks you already get.

Here is the problem. Google publishes no click-through curve. Every tool that shows "estimated traffic gain" is using somebody's curve from a study of other people's sites. Ours uses 6% at position 5. On our data that produced 1,224 extra clicks a month.

In that same month, every row in the export put together earned 34 clicks from 110,674 impressions.

So we added a check. If your rows include enough page-1 data, the endpoint compares the clicks your page-1 results earned with the clicks the curve says they should have earned:

"ctr_calibration": {
  "page_one_impressions": 30200,
  "page_one_clicks": 31,
  "clicks_the_curve_expected": 1598,
  "ratio": 0.019
}

Our page-1 results earned 2% of what the curve predicts. Scale the estimate by that ratio and 1,224 becomes 16. Every quick win now carries both figures, estimated_extra_clicks and estimated_extra_clicks_calibrated, and the response warns you when they are far apart.

Why our ratio is so low

We believe most of our impressions are not people. Search Console counts an impression "whenever an item appears in the current page of results", and it does not say who loaded that page. Queries about SEO APIs are exactly what rank trackers, scrapers and AI agents search for. In a review of our own data in September 2026, our click-through rate from the United States was 0.03%, against 0.30% from everywhere else at the same positions.

We can't prove who is behind an impression. Search Console doesn't report it. What we can say is that the curve was wrong for us by a factor of about fifty, and we would not have known without checking it against our own page 1.

A local plumber's data will look nothing like ours. We expect their impressions to be mostly real people and the ratio to sit much closer to 1, though we have not measured it. That is the point: the calibration tells you which kind of site you are.

Our position

An "estimated traffic gain" that has not been checked against your own click-through rate is a made-up number, however precise it looks. We nearly shipped one.

If you take one thing from this post, send the whole export and not only positions 11 to 20, so the check has page-1 data to work with.

What comes back for each query

This is the top result from our run:

{
  "query": "moz alternatives",
  "page": "https://seoscoreapi.com/vs/moz",
  "position": 11.1,
  "impressions": 1059,
  "clicks": 0,
  "opportunity_score": 96.6,
  "estimated_extra_clicks": 64,
  "estimated_extra_clicks_range": {"at_position_10": 23, "at_position_3": 116},
  "estimated_extra_clicks_calibrated": 1,
  "action": "consolidate",
  "plain_english": "2 of your pages show up for this search and split the credit, so pick one page to be the answer and point the others at it.",
  "also_ranking_pages": ["https://seoscoreapi.com/blog/best-moz-alternatives"]
}

The opportunity score runs 0 to 100: 40% for how close the query is to page 1, 40% for impressions, and 20% for how far clicks fall short of what the position should earn.

action is one of four:

Action When
consolidate Two or more of your pages show for the same query
small_push Positions 11 to 13: internal links and a modest improvement may do it
fix_snippet Clicks are well below expected, and there were enough impressions to tell
improve_page Lower half of page 2: the page needs to answer the query better

pages groups the wins by landing page, which is usually the more useful view.

What it doesn't know

  • Whether the query is worth winning. "moz api pricing" is in our list at position 11.5. People searching it want Moz's prices, not ours. The endpoint ranks by opportunity, not by fit. Use exclude_terms and your own judgment.
  • Position is an average. Google reports the topmost position your site held, averaged. A query at 11.1 was on page 1 for some searches already. Google's own help page notes that position 11 can mean the first result on page 2 or a spot in a side panel.
  • The calibration is one number. It scales every position by the same ratio, and brand searches push it up. If the ratio comes back above 1.5 the response suggests excluding your brand name.
  • It holds impressions constant. A result that moves to page 1 is seen by more people, so impressions rise. For a site with real searchers that makes the estimate conservative. For a site like ours it doesn't rescue it.
  • It won't tell you how to move the page. It points at the page and the kind of fix. Running an audit on that page is the next step.

Using it

POST /quick-wins works on every plan, including free, and counts as one audit per call. A request we reject for bad input is not counted. Send up to 1 MB of JSON, which is roughly 5,000 rows with URLs.

Options: min_impressions (default 50), target_position (default 5), limit (default 25), exclude_terms, and ctr_curve if you have measured your own.

If you already export Search Console every month, get a free key and post the file. The first thing to read is the ratio.