The Search Console API: what it gives you and what it limits

Updated 2026-08-15

The endpoints available, the real quota numbers — 1,200 queries per minute per site, 2,000 URL inspections per day, 25,000 rows per request, 16 months of history — how pagination and dataState work, and the reports that are deliberately not exposed.

The Search Console API exposes most of what the web interface shows, with higher row limits and no clicking. It is also the only supported way to get your search data into a warehouse before it ages out.

What you can call

What is not exposed

Worth knowing before you plan around it:

The limits that shape your code

The two quotas, and which one actually stops you

Search Analytics is metered twice, and confusing the two is why people back off the wrong thing. Both return the same "quota exceeded" error, which does not help.

Rate quota, counted in requests

The published ceilings are generous:

Load quota, counted in how expensive your query is

This is the one most people hit, and it is not a request count at all. Every query consumes "load" in proportion to how much work it makes Google do, measured in 10-minute chunks (short-term) and 1-day chunks (long-term). Three things drive the cost:

The tell for which one you have hit: if a single query inside a 10-minute window still errors, that is long-term load quota, and the fix is a cheaper query shape or a shorter range. If it clears after 15 minutes, you were only over the short-term limit, and spreading the job across the day is enough. Either way, back off exponentially on HTTP 429 rather than retrying immediately.

Your actual consumption is visible in the quota tab of your project in the Google API Console. It is worth looking before you assume you need to redesign anything.

Two parameters worth understanding

dataStatefinal returns only fully processed days and runs about two days behind; all includes fresh partial days. Use final for anything you report on and all for monitoring. Detail in why Search Console data is two days behind.

aggregationTypebyPage, byProperty or auto. This changes the numbers, because a single search showing two of your pages counts once at property level and twice at page level. Pick one and keep it consistent, or your week-over-week comparison will move for no reason.

Access. OAuth 2.0, or a service account added as a user on the property. Two scopes exist and there is nothing between them: webmasters.readonly reads, and webmasters reads and writes. Writing means four methods — submit a sitemap, delete a sitemap, add a property, delete a property — so requesting it to submit a sitemap also grants the ability to remove the property. Request the read-only scope unless you genuinely need one of those four, and if you do need one, keep the others out of your own code.

The one thing to build first

A daily export of query × page × date at dataState: final, appended to a table you own. It is the only way to have search data older than 16 months when you eventually want it, and if you build one thing against this API it should be this.

Note the tension with the load quota above: query × page is the most expensive grouping there is. It stays cheap here only because each run covers a single day. So run it daily and append — do not schedule it weekly and pull seven days, and do not try to backfill all 16 months in one request. Walk the backfill a day at a time, and let it take an afternoon.

Searchlight is a client for this API — the same data, on a phone, without writing any of it.

See how Searchlight shows it