skip to content →
FIELD_MANUAL / LIVEREVISIONv1.3 · 2026.10.04Updated 2026-10-04CHAPTERS12 FILEDCH_05INTEGRATION
[ CH_05.08 / FIELD_MANUAL ]

Search Console & indexing

[ CH_05.08 / SEARCH_CONSOLE ]

Search Console, indexing and traffic

Connect Google Search Console to see clicks, impressions, position and Google's index status for every page, and to let VectraSEO tell search engines about each post it publishes. Connect Google Analytics 4 as well and the project card shows traffic from every channel.

Connect

  1. 01Open the project's Settings, find Search Console and click Continue with Google.
  2. 02Approve access on Google's consent screen. VectraSEO asks for write access so it can submit your sitemap.
  3. 03Pick the Search Console property that matches your site. Data appears after the first refresh.
  4. 04Over the API, the same flow is POST /gsc/authorize (returns Google's consent URL), then POST /gsc/properties with the {code, state} Google sends back, then POST /gsc/connect with {state, property_url}.

Connecting, choosing a property and disconnecting need a signed-in session; an API key cannot do them. GET /gsc/status reports needs_reconsent: true when the connection cannot submit to Google, with reconsent_reason readonly_scope (connected with read-only access) or auth_revoked (Google rejected the stored grant). Either way, reconnect from Settings. is_stale turns true when the last refresh is more than 48 hours old. Disconnecting keeps the stored metrics for a reconnect.

Endpoints

Search Console · access
GET/projects/:id/gsc/statusConnection, needs_reconsent, reconsent_reason, is_stale · session
POST/projects/:id/gsc/authorizeStart connecting: returns Google's consent URL · session
POST/projects/:id/gsc/propertiesExchange the code and list your properties · session
POST/projects/:id/gsc/connectBind a property to the project · session
DELETE/projects/:id/gsc/connectDisconnect (stored metrics are kept) · session
GET/projects/:id/gsc/summaryProject rollup the card reads, including the traffic object · session
GET/projects/:id/gsc/pagesPer-URL numbers for your sitemap pages VectraSEO didn't write · session
POST/projects/:id/gsc/refreshRefresh now → job_id; once per 5 minutes · session
POST/projects/:id/gsc/sitemapSubmit the project's sitemap to Google now · session
GET/projects/:id/search/overviewClicks, impressions, CTR, position · projects:read
GET/projects/:id/search/queriesTop queries (?limit) · projects:read
GET/projects/:id/search/pagesPer-URL performance (?sort=clicks|clicks_delta|clicks_loss|position_delta|position_loss, ?limit) · projects:read
GET/projects/:id/search/pages/trendsEach page classed improving, declining, stable, new or lost (?sort=movers|improving|declining|clicks) · projects:read
GET/projects/:id/search/pages/historyOne page's weekly series (?url_hash from a trends row, ?weeks) · projects:read
GET/projects/:id/search/index-coverageGoogle's page-indexing buckets with example URLs · projects:read
GET/projects/:id/search/index-coverage/issuesNot-indexed buckets as issues, with example fixes · projects:read
GET/projects/:id/search/index-coverage/urlsInspected URLs, filterable (?bucket, ?q, ?sort, ?limit) and cursor-paginated · projects:read
POST/projects/:id/search/index-coverage/inspect-urlValidate fix: re-inspect one URL now · jobs:write
GET/projects/:id/indexing-healthPublished posts missing from your sitemap, or still unknown to Google · projects:read
GET/projects/:id/posts/:post_id/index-stateA post's last URL Inspection result and whether it can be re-checked · projects:read
POST/projects/:id/posts/:post_id/recheck-indexRe-inspect a published post's URL · session
  • Refresh. Data refreshes daily. POST /gsc/refresh queues one now (a job_id to poll), at most once every 5 minutes per project.
  • Submit sitemap. POST /gsc/sitemap returns Google's answer directly. It needs the project's sitemap URL set. 400: not connected, no sitemap, or a read-only connection. 429: pressed again within 5 minutes (see Retry-After). 502: Google refused or the grant failed; reconnect. Each detail is written to be shown as-is.
  • Validate fix. POST /search/index-coverage/inspect-url with {url} re-runs Google's URL Inspection for one URL: once per URL per hour, within a daily budget of 200 inspections per project shared with the scheduled refresh. Over either limit it returns 429.

Indexing signals on publish

After each successful publish VectraSEO sends these signals. They are best-effort: each is time-bounded, and none can fail or delay the publish.

SIGNAL
DETAILS
Sitemap resubmission
Resubmits the project's sitemap to Google. Needs Search Console connected with write access and the project's sitemap URL set.
IndexNow
Notifies Bing and Yandex. IndexNow only accepts a key file on the same host as the post, so you host it: Project Settings shows your key and the exact URL (https://your-site/{key}.txt, containing only the key). Before each publish we check that file on the post's host, with no redirect followed; until it is there, IndexNow is skipped and the settings card says why. Endpoints: GET /projects/:id/indexnow · projects:read, POST /projects/:id/indexnow/check · projects:write.
URL Inspection card
Each published post shows Google's index status for its URL, with a Re-check button (once per URL per hour).
Google Indexing API
Only when you have set it up with your own credentials; see below.

Master switch. Auto-submit new posts for indexing in the project's Search Console settings, or auto_indexing_enabled: false on PUT /projects/{id} (projects:write), stops every automatic submission, including the Indexing API below. It is on unless you turn it off.

Google Indexing API (experimental, opt-in)

Optionally, VectraSEO can also send each published post to the Google Indexing API (URL_UPDATED), and you can request indexing for pages Google reports as not indexed. This is experimental and off until you set it up. You bring your own Google Cloud OAuth client (client ID and secret) and consent to the sensitive indexing scope, so the Indexing API quota and any Terms-of-Service risk stay in your Google Cloud project. Nothing is shared with other VectraSEO customers.

> risk_acknowledgement_required

Google officially limits the Indexing API to specific content types. It may ignore a submission (a 200 is not a guarantee of indexing), pages pushed this way are often indexed quickly and then dropped, and Google can disable your project's access for unsupported content without notice. You must accept this before credentials are saved: accept_risk: true, or the request returns 400.

Indexing API (bring your own credentials) · access
GET/projects/:id/indexing-api/statusSetup state, last submission and last error · projects:read
PUT/projects/:id/indexing-api/credentialsSave {client_id, client_secret, property_url?, accept_risk: true} · session
POST/projects/:id/indexing-api/authorizeStart Google consent with your own OAuth client · session
POST/projects/:id/indexing-api/connectFinish consent with {code, state} · session
PUT/projects/:id/indexing-api/enabledPause or resume submissions with {enabled} · projects:write
DELETE/projects/:id/indexing-apiRemove the credentials and connection · session
POST/projects/:id/indexing-api/request-indexingRequest indexing for selected {urls} · jobs:write
POST/projects/:id/indexing-api/request-all-not-indexedRequest indexing for every not-indexed page, within the daily cap · jobs:write
  • Requests are capped at 200 per project per day, to match Google's default quota; responses report what is left.
  • Each URL is checked live first. Broken, soft-404 and redirecting URLs are skipped and use no quota.
  • A URL already requested is locked from re-submission for 14 days, because Google ignores rapid duplicate requests.

The project card's traffic numbers

The Traffic block on each project card uses the same 28-day window for every source, ending 3 days ago because Search Console data lags 2-3 days, and compares it with the 28 days before. It reads the traffic object on GET /projects/{id}/gsc/summary.

WHEN
THE CARD SHOWS
GA4 connected
Total GA4 sessions and the change against the previous window, split into six channels: Organic search, Direct, Referral, AI assistants (referrals from AI assistants, lifted out of Referral), Social and Other.
No GA4 data, site logs pushed
Human visits from the traffic you push yourself, labelled Visits (site logs). N of 28 days reported appears when days are missing, and a change is shown only when both windows are complete. Nothing is extrapolated.
Search Console only
Google clicks as a floor, for example 642+ visits, with the other channels marked as not measured. Never an estimate.
Nothing connected
What each connection adds, and a button to connect Search Console.

Do the sources agree? With both connected and at least 20 Google clicks, the card compares GA4's Google organic sessions with Search Console's whole-site Google clicks. From 70% to 110% reads Sources agree. Under 70% reads GA undercounting: the GA tag may be missing on some pages or blocked by a consent banner. Over 110% reads Wider GA property: the GA4 property tracks more than this site.

Search Console clicks cover the whole property once the first daily sync has stored them. A failed GA4 sync keeps the last numbers; after 48 hours without a successful sync they are marked Out of date. Most visits sorts by GA4 sessions, then first-party visits, then Google clicks.

[ END_OF_MANUAL ]
[ NEED_HELP? ]

Can't find what
you're looking for?

Reach out to the team. We answer every email and we read every bug report.