Search Console & indexing
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
- 01Open the project's Settings, find Search Console and click Continue with Google.
- 02Approve access on Google's consent screen. VectraSEO asks for write access so it can submit your sitemap.
- 03Pick the Search Console property that matches your site. Data appears after the first refresh.
- 04Over the API, the same flow is
POST /gsc/authorize(returns Google's consent URL), thenPOST /gsc/propertieswith the{code, state}Google sends back, thenPOST /gsc/connectwith{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
/projects/:id/gsc/statusConnection, needs_reconsent, reconsent_reason, is_stale · session/projects/:id/gsc/authorizeStart connecting: returns Google's consent URL · session/projects/:id/gsc/propertiesExchange the code and list your properties · session/projects/:id/gsc/connectBind a property to the project · session/projects/:id/gsc/connectDisconnect (stored metrics are kept) · session/projects/:id/gsc/summaryProject rollup the card reads, including the traffic object · session/projects/:id/gsc/pagesPer-URL numbers for your sitemap pages VectraSEO didn't write · session/projects/:id/gsc/refreshRefresh now → job_id; once per 5 minutes · session/projects/:id/gsc/sitemapSubmit the project's sitemap to Google now · session/projects/:id/search/overviewClicks, impressions, CTR, position · projects:read/projects/:id/search/queriesTop queries (?limit) · projects:read/projects/:id/search/pagesPer-URL performance (?sort=clicks|clicks_delta|clicks_loss|position_delta|position_loss, ?limit) · projects:read/projects/:id/search/pages/trendsEach page classed improving, declining, stable, new or lost (?sort=movers|improving|declining|clicks) · projects:read/projects/:id/search/pages/historyOne page's weekly series (?url_hash from a trends row, ?weeks) · projects:read/projects/:id/search/index-coverageGoogle's page-indexing buckets with example URLs · projects:read/projects/:id/search/index-coverage/issuesNot-indexed buckets as issues, with example fixes · projects:read/projects/:id/search/index-coverage/urlsInspected URLs, filterable (?bucket, ?q, ?sort, ?limit) and cursor-paginated · projects:read/projects/:id/search/index-coverage/inspect-urlValidate fix: re-inspect one URL now · jobs:write/projects/:id/indexing-healthPublished posts missing from your sitemap, or still unknown to Google · projects:read/projects/:id/posts/:post_id/index-stateA post's last URL Inspection result and whether it can be re-checked · projects:read/projects/:id/posts/:post_id/recheck-indexRe-inspect a published post's URL · session- Refresh. Data refreshes daily.
POST /gsc/refreshqueues one now (ajob_idto poll), at most once every 5 minutes per project. - Submit sitemap.
POST /gsc/sitemapreturns 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 (seeRetry-After).502: Google refused or the grant failed; reconnect. Eachdetailis written to be shown as-is. - Validate fix.
POST /search/index-coverage/inspect-urlwith{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 returns429.
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.
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.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.
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.
/projects/:id/indexing-api/statusSetup state, last submission and last error · projects:read/projects/:id/indexing-api/credentialsSave {client_id, client_secret, property_url?, accept_risk: true} · session/projects/:id/indexing-api/authorizeStart Google consent with your own OAuth client · session/projects/:id/indexing-api/connectFinish consent with {code, state} · session/projects/:id/indexing-api/enabledPause or resume submissions with {enabled} · projects:write/projects/:id/indexing-apiRemove the credentials and connection · session/projects/:id/indexing-api/request-indexingRequest indexing for selected {urls} · jobs:write/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.
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.
Can't find what
you're looking for?
Reach out to the team. We answer every email and we read every bug report.