Testing the Google Indexing API with cURL and Postman
This guide covers indexing api curl and Postman testing so you can verify credentials, endpoints, and quotas before writing automation. It is for developers, SEOs, and site owners who want exact requests, expected responses, and a repeatable manual workflow. You will mint access tokens, publish URL_UPDATED and URL_DELETED notifications, read metadata, interpret error codes, and graduate from manual checks to scripted workers.
Key takeaways
- cURL and Postman prove the full chain of key, token, delegation, and endpoint without hiding details inside libraries.
- The API is documented for JobPosting and BroadcastEvent pages, so use manual tests to confirm behavior for your URL types.
- A 200 means the hint was accepted, 403 means Search Console delegation is missing, and 429 means quota or rate limits need backoff.
- Keep manual tests to a few URLs per day, log request IDs, and move bulk work to queued scripts with pacing.
- Why test with cURL and Postman before coding
- What you need: project, key, property, and token basics
- Getting an access token without writing code
- Publishing URL_UPDATED with indexing api curl
- Reading notification status with cURL
- Sending URL_DELETED with cURL
- Building a Postman collection for the API
- Understanding success and error responses
- Quotas, pacing, and safe manual testing
- From manual tests to automated scripts
- Troubleshooting checklist for cURL and Postman
- Pre flight checklist for every manual test
- FAQ
<!-- IMAGE-PROMPT cover: 1200x630, DependsIt brand, deep charcoal #121212 or clean white background, vibrant mint #22E3B0 accent glow, thin node-network line art, Clash Display style bold heading space on left, General Sans clean labels, subject: cURL terminal and Postman window testing Google Indexing API publish and metadata calls, flat vector, high contrast, accessible, no photorealistic faces, no text smaller than 24px, no em dash in rendered text, export PNG then cwebp -q 82 to WEBP -->
Why test with cURL and Postman before coding
Manual testing with cURL and Postman shows each layer of the Indexing API without abstraction. You see the token request, the token response, the publish request headers, the publish response body, and the metadata lookup in sequence. When something fails, you know whether the key, the token, the delegation, or the endpoint caused it. Library based scripts hide these steps inside helpers, which is convenient after the flow works but confusing while you debug the first 403. Ten minutes with cURL often saves an hour of guessing inside code.
Postman adds repeatability to the same transparency. You save the token request, the publish request, and the metadata request as a collection with variables for access token, URL, and notification type. Teammates can import the collection, set their own key derived token, and run the same three calls against staging and production properties. This shared manual standard prevents the common situation where one developer tests with a personal project and another deploys with a client project, and no one notices the quota and property mismatch until bulk runs fail.
Manual tests also protect quota while you learn. A script loop can send hundreds of requests before you notice a normalization bug or a wrong property. cURL sends one request at a time, with visible output and a pause for reading. You can verify URL form, property match, robots state, and structured data before each send. For teams new to the API, that discipline matters more than speed. Once three manual publishes return 200 with sensible notifyTime values and next day metadata matches, you have a baseline that automation must reproduce. Any later deviation in scripted runs points to code or queue behavior, not to unknown API behavior.
Scope understanding benefits from manual work as well. Google documents the Indexing API for JobPosting and BroadcastEvent pages, and manual tests let you confirm handling for your own URL types with minimal risk. Submit one documented URL and one general URL you own, compare 200 responses, metadata storage, and later Search Console movement. The endpoint may accept both, but downstream crawl and coverage will differ. Recording those differences during manual testing sets honest expectations before you automate at volume. Background on identity setup is in the service account setup guide, with end to end context in the complete setup guide for faster indexing.
Plan for about thirty minutes for the full manual pass. Five minutes to confirm project, key, and delegation. Ten minutes to mint a token and run one publish. Five minutes to check metadata. Ten minutes to save Postman requests and note quota values. Keep notes with timestamps, URLs, HTTP statuses, and request IDs. Those notes become the acceptance criteria for later Python, Node, or PHP automation.
What you need: project, key, property, and token basics
You need a Cloud project with the Indexing API enabled, a service account JSON key you can read locally, and Owner delegation for that service account on each Search Console property you will test. Confirm each item visually before opening a terminal. Check Enabled APIs for Indexing API with traffic graphs. Check IAM Service Accounts for your account email and active key ID. Check Search Console Users and permissions for Owner status on the exact domain or prefix property. Record project ID, service account email, property URLs, and current quota in a short runbook. Manual calls cannot bypass missing delegation, so this confirmation prevents wasted token work.
Your workstation needs cURL 7.68 or newer, OpenSSL for JWT signing tests, Python 3 for one line token helpers if you prefer them, and Postman Desktop or Web with permission to call Google endpoints. Verify versions with curl --version and python3 --version. Confirm outbound HTTPS to oauth2.googleapis.com and indexing.googleapis.com, especially on corporate networks with proxies. If a proxy is required, set HTTPS_PROXY and confirm cURL uses it with verbose output on a test GET. Confirm system clock sync with NTP, because JWT issued at and expiry tolerances are tight and skew causes invalid grant errors that look like key failures.
Understand tokens before you request one. A service account JSON holds a private key and client_email. Your tooling builds a JWT assertion scoped to the indexing API, POSTs it to the token URI, and receives an access token valid for about one hour plus a token type of Bearer. A careful jwt curl indexing check means minting with the exact scope, confirming expiry about an hour ahead, and matching the service account email to Search Console before any publish. You then send that Bearer token on every Indexing API call. Tokens are short lived by design. You mint often, cache briefly, and never log full values.
Prepare two test URLs that isolate tooling from content issues. Use one job posting or livestream page for documented scope, with valid structured data, 200 status, indexable robots, and self referencing canonical. Use one stable article you own for general behavior with the same hygiene. Avoid staging hosts, session IDs, faceted filters, and redirect chains for first tests. Note URL, property, and content type for each. When you later compare publish 200s to Search Console movement, these notes let you separate tooling success from content eligibility without retesting.
Getting an access token without writing code
The cleanest no code token path uses gcloud with service account impersonation, where available, or a small Python helper that prints a token you paste into cURL and Postman. Pure bash JWT signing with OpenSSL is possible but error prone due to base64url details, so prefer gcloud or Python for the first token and reserve manual JWT assembly for learning. The goal of this step is a valid Bearer token for the indexing scope, obtained in under two minutes, with the service account email recorded alongside it.
If gcloud is installed and authorized for your project, activate the service account with the JSON key, then print an access token for the indexing scope. The commands below use a temporary activation that does not change your default login. Replace paths and project IDs with your own values. The printed token is long. Copy it carefully without line breaks and store it in a shell variable for cURL, plus a Postman variable for GUI calls. Note the service account email from the key file so later 403 debugging can match identity to delegation.
gcloud auth activate-service-account --key-file="/etc/secrets/indexing-publisher-key.json" --project="clientname-indexing-01"
gcloud auth print-access-token --scopes="https://www.googleapis.com/auth/indexing"
If gcloud is not available, use a ten line Python helper that loads the JSON, scopes it, refreshes, and prints token prefix plus full token to a file with mode 600. Run it on the same machine that runs cURL to avoid clock differences between hosts. The snippet below prints email and expiry to console and writes the full token to a restricted file you can source into cURL. Delete the file after testing or keep it only until expiry, since tokens live about an hour and should not linger in shell history or shared notes.
import os
from google.oauth2 import service_account
from google.auth.transport.requests import Request
KEY_PATH = "/etc/secrets/indexing-publisher-key.json"
creds = service_account.Credentials.from_service_account_file(KEY_PATH, scopes=["https://www.googleapis.com/auth/indexing"])
creds.refresh(Request())
print("email:", creds.service_account_email)
print("expiry:", creds.expiry)
open("/tmp/indexing-token.txt", "w").write(creds.token)
print("token saved to /tmp/indexing-token.txt, prefix:", creds.token[:10])
Verify the token before publishing. Decode the JWT payload section at a local debugger without pasting the full token into public sites, or simply check that the token starts with ya29 or a similar Google prefix and that expiry is about an hour ahead. Confirm the service account email matches the Search Console Owner entry exactly. A single character mismatch in project ID causes 403 later even with a fresh token, so compare strings character by character now. Once verified, export the token for cURL and paste it into Postman variables. You are ready for the first publish.
Publishing URL_UPDATED with indexing api curl
Publishing with cURL is a single POST with JSON body and Bearer header. To curl submit url google safely, set Content-Type to application/json, Authorization to Bearer plus your token, and data to url plus type URL_UPDATED, using the documented indexing api endpoint for publish. Use --fail-with-body or capture HTTP code explicitly so 403 and 429 are visible rather than hidden. This indexing api request example reads the token from a file to avoid shell history exposure and prints HTTP code plus response body. Start with one URL you control, with canonical form matching your Search Console property exactly.
TOKEN=$(cat /tmp/indexing-token.txt)
curl -s -w "\nHTTP:%{http_code}\n" -X POST "https://indexing.googleapis.com/v3/urlNotifications:publish" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"url": "https://example.com/jobs/senior-support-specialist", "type": "URL_UPDATED"}'
Success returns HTTP 200 with JSON containing urlNotificationMetadata, including url, latestUpdate with type and notifyTime, and top level notifyTime. Save the full body with timestamp, URL, and request context in your notes. A 200 means the hint was accepted for later processing. It does not mean the page is indexed or will rank. Follow with metadata checks the next day plus Search Console URL Inspection and server log review for Googlebot visits to see downstream effect.
Validate inputs before each manual send to protect quota. Confirm the URL is absolute https, matches the delegated property, returns 200 without login tricks, allows crawling in robots.txt, has no noindex, and uses the canonical variant without session parameters. For job postings, submit on creation and on material updates such as title or closing date. For livestreams, submit on schedule publication and on going live. For general pages used as a hint, submit on creation and on substantial updates, not on every minor edit. One careful manual send teaches more than ten rushed sends with mixed URL hygiene.
<!-- IMAGE-PROMPT diagram-01: 1600px max, DependsIt brand mint #22E3B0 on charcoal #121212 or white, node-network line art, subject: cURL publish flow diagram showing token file then POST publish then 200 metadata response with notifyTime, flat vector, accessible, no em dash, Clash Display style headings, General Sans labels -->
Reading notification status with cURL
Metadata reads confirm what Google stored for a URL through this channel. Use GET on the urlnotifications endpoint with the URL encoded as a query parameter and the same Bearer token, which is the same indexing api endpoint used for reads across all languages. A stored notification returns 200 with latestUpdate and notifyTime. A never submitted URL returns 404 with a message that no notification was found. Treat this indexing api test as a storage check, not an index status check. This check is ideal for confirming that yesterday manual publish actually persisted, and for distinguishing never submitted from submitted but not yet crawled.
TOKEN=$(cat /tmp/indexing-token.txt)
URL="https://example.com/jobs/senior-support-specialist"
curl -s -w "\nHTTP:%{http_code}\n" \
-H "Authorization: Bearer $TOKEN" \
"https://indexing.googleapis.com/v3/urlNotifications/metadata?url=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1], safe=''))" "$URL")"
Encode the URL parameter carefully. cURL does not auto encode query values, so spaces, plus signs, and non ASCII characters must be percent encoded. The example uses Python one liner for encoding to avoid mistakes. Trailing slash, protocol, and case differences create different lookup keys. Publish with https://example.com/jobs/role and lookup with https://example.com/jobs/role/ can show 200 then 404 for what looks like the same page. Standardize on canonical form and reuse the exact string for publish and metadata to avoid false alarms.
Use metadata sparingly during manual testing. One check per URL the next day is enough to confirm persistence. Immediate checks seconds after publish can return 404 due to storage lag, which causes unnecessary worry. If immediate verification matters, wait five minutes and retry once. For bulk audits later, sample ten percent plus all failures rather than reading every URL. Metadata uses a separate read quota that is usually generous, but clean habits now keep dashboards readable when automation scales.
Sending URL_DELETED with cURL
Retired pages use the same publish endpoint with type URL_DELETED. Use it only for URLs you control that now return 404 or 410, or that show an expired notice with appropriate noindex handling. Do not use URL_DELETED for moved content. For moves, publish URL_UPDATED for the new canonical and rely on 301 redirects plus sitemap updates to consolidate signals. Matching type to page reality keeps coverage states clean.
TOKEN=$(cat /tmp/indexing-token.txt)
curl -s -w "\nHTTP:%{http_code}\n" -X POST "https://indexing.googleapis.com/v3/urlNotifications:publish" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"url": "https://example.com/jobs/closed-role-123", "type": "URL_DELETED"}'
Preflight deletions like publications. Fetch the URL, confirm 404 or 410 status, check robots and canonical, and confirm structured data reflects closed state where applicable, such as validThrough in the past for JobPosting. A URL_DELETED for a page that still returns 200 indexable contradicts signals and can trigger extra recrawls. Update the page first, then notify. For manual bulk closures, pace one request every minute, prioritize pages with search impressions or stale indexed snippets, and leave low traffic expired pages for sitemap decay. Log each deletion with timestamp and response for next day metadata review.
Building a Postman collection for the API
Postman turns the three cURL calls into a shareable indexing api postman collection with variables and saved examples. Create a collection named Indexing API Manual, with environments for Staging and Production. Define variables for baseUrl as https://indexing.googleapis.com, token as your Bearer value without the word Bearer, testUrl as your canonical test page, and deleteUrl as a retired test page. A postman google api setup should mark token as secret type so it masks in the UI. Share the collection without values, so teammates import structure and supply their own tokens. This prevents accidental token leaks through shared workspaces. For disciplined api testing seo work, keep manual volume low and log every send.
Create three requests. Token Help as a GET to a docs placeholder or as a comment request that explains how to mint tokens with gcloud or Python, since Postman cannot sign service account JWTs natively without scripts. Publish URL_UPDATED as POST to {{baseUrl}}/v3/urlNotifications:publish with Bearer auth set to {{token}} and raw JSON body with url {{testUrl}} and type URL_UPDATED. Get Metadata as GET to {{baseUrl}}/v3/urlNotifications/metadata with query param url set to {{testUrl}} and Bearer auth. Duplicate Publish for URL_DELETED with {{deleteUrl}} and type URL_DELETED. Add tests that assert status 200 and presence of urlNotificationMetadata or latestUpdate, so runs show green checks for healthy calls.
Configure auth at the collection level with Type Bearer Token and Value {{token}}, then inherit auth in each request. Set timeouts to 30000 ms and enable SSL verification. Add pre request scripts that fail fast if token is empty, with a clear message to mint a fresh token. Add test scripts that log notifyTime on success and full error body on failure to the Postman console. Save example responses for 200, 403, 404, and 429 so new team members recognize each case without triggering them. Export the collection as JSON v2.1 and store it in git without variable values, alongside a README that explains minting, property matching, and quota care.
Run the collection manually with the Runner for three URLs before sharing. Confirm Publish returns 200, Metadata returns 200 the next day for submitted URLs and 404 for never submitted ones, and Delete returns 200 for retired test pages. Record runner results with timestamps in your runbook. If teammates see 403 while you see 200 with the same collection, compare token emails and property selections first. Most Postman 403s trace to using a token from one service account while checking a property delegated to another.
Understanding success and error responses
Read responses by HTTP status plus JSON body, not by status alone. Success is 200 with urlNotificationMetadata containing url, latestUpdate, and notifyTime. Store notifyTime as proof of acceptance and correlate it with later bot visits. Client errors point to setup or input. Server errors point to temporary Google issues where backoff and retry are appropriate. The table below gives a manual testing runbook you can tape to your monitor while learning.
| HTTP | Body signal | Meaning | Next step |
|---|---|---|---|
| 200 | urlNotificationMetadata with notifyTime | Hint accepted | Log, check metadata next day |
| 401 | invalid credentials or invalid grant | Bad or expired token, clock skew | Mint fresh token, sync NTP |
| 403 permission denied | Service account lacks Owner | Missing Search Console delegation | Add Owner on exact property |
| 403 API not enabled | API disabled or wrong project | Enable in correct project | Fix Cloud enablement |
| 404 publish or metadata | No stored notification or bad endpoint | Typo or never submitted | Correct endpoint, verify URL |
| 429 | Quota or rate limit | Daily or per minute cap reached | Pause, retry after reset |
| 5xx | Backend error | Temporary Google issue | Backoff, retry limited times |
Inspect error bodies fully in Postman console or with curl -v for headers plus -s for body. Look for message, status, and details that name the missing permission or quota. Redact tokens before sharing excerpts. For 403, do not mint new tokens repeatedly. Open Search Console Users and permissions and confirm exact email and Owner status. For JWT errors during minting, re-download the JSON, verify newlines, and check scope string. For deeper per code guidance, see our reference on Indexing API errors including 403, 429, and JWT failures.
<!-- IMAGE-PROMPT workflow-02: 1600px max, DependsIt brand, subject: Postman collection workflow showing token variable then publish request then metadata request then saved examples, flat vector, accessible, no em dash, mint #22E3B0 on charcoal #121212, node-network line art, Clash Display style headings, General Sans labels -->
Quotas, pacing, and safe manual testing
Manual tests consume the same quotas as scripts, so treat them with the same care. New projects often start with modest daily publish quotas, commonly near 200 notifications per day, plus separate read quotas and per minute rates. Your Cloud console Quotas page shows exact numbers for your project. Record them before manual work and keep manual volume to a handful per day, for example three to five URLs, leaving headroom for automation and retries. Log each manual send with timestamp, URL, type, HTTP status, and response prefix, even though volume is low. Those lines become the baseline that scripted runs must match.
Pace manual sends by at least 30 to 60 seconds apart. Rapid pasting in Postman Runner or shell loops can burst per minute limits and return 429 that confuses learning. If you hit 429 manually, stop for the day for publishes and switch to reading docs or checking metadata for yesterday URLs. Do not retry in a tight loop. Note reset expectations from quota docs and resume the next day with smaller batches. For planning bulk automation later, review quota limits and how to stay under them and keep the same 75 percent target that production workers use.
Separate publish and read quotas in your notes. Publishes are the constrained resource. Metadata reads are usually generous but not infinite. A manual rhythm of publish today, metadata tomorrow keeps both graphs clean. Avoid running Postman monitors every five minutes against metadata for hundreds of URLs. That polling adds noise and can mask real publish pressure in shared dashboards. For large audits, sample rather than exhaustively poll, and export results to a sheet with publish time, publish status, metadata time, and metadata type for clean analysis.
From manual tests to automated scripts
Graduate to code once manual results are stable and understood. The acceptance bar is three manual publishes with 200, matching next day metadata, plus one delete test and one 403 diagnosis you can explain. At that point, a google api rest call from Python, Node, or PHP reproduces the same requests with pacing, retries, and logging. Python teams can start from established patterns for submitting URLs with Python and checking status with the same endpoints. Node teams can use equivalent patterns for calling the API from Node.js with JWT clients and paced workers. Both use the same endpoints, scopes, and quota logic you just verified manually, so translation is direct.
Carry over three artifacts from manual work. The normalized URL list with canonical forms that returned 200. The property to service account mapping table with Owner confirmations. The quota numbers and pacing that avoided 429. Encode those into script config, queue schema, and worker sleep intervals rather than rediscovering them in code. Keep cURL and Postman for spot checks after automation goes live. When a scripted URL returns an unexpected status, reproduce with a single cURL using a fresh token and the exact normalized string. If cURL succeeds where the script fails, the bug is in code handling. If both fail the same way, the cause is delegation, quota, or URL state.
Choose automation triggers that match content change rates. Job boards suit twice daily queue drains. Livestream schedules suit hourly checks with small batches. General blogs suit post publish hooks that enqueue plus nightly catch up for misses. In all cases, keep intake fast and local, with API output paced in background workers. Do not call the API synchronously from web requests. That couples page saves to token and API latency and risks quota bursts on traffic spikes. Queue first, drain with backoff, and alert on 403 bursts or early day 429s. Manual tests remain the diagnostic tool you reach for when dashboards diverge from expectations.
Troubleshooting checklist for cURL and Postman
Work through failures in order without skipping steps. First, confirm token freshness. Tokens live about an hour. If your token is older, mint a new one and retry once. Check service account email from the key file against Search Console Owners. A mismatch here explains most 403s. Confirm API enablement in the correct project by opening Enabled APIs for the project ID in your runbook. A surprising number of 403 API not enabled cases trace to enabling in a personal project while submitting with a client project key.
Second, confirm URL and property matching. Print the exact URL string sent, check protocol, host case, trailing slash, and query encoding. Open the Search Console property selector and confirm the property contains that exact URL form. Test with the canonical URL from the page source, not with a shortened or decorated variant. Check robots.txt fetch as Googlebot, meta robots, and HTTP status with a plain cURL GET without auth. Submitting a noindex or disallowed URL returns 200 at the API layer but leads nowhere, so preflight saves quota and confusion.
Third, confirm quota and rate state. Open Cloud Quotas graphs for publish and metadata. If publishes flatline at the daily cap, pause until reset and window remaining URLs forward. If 429 appears on the first request of the day, look for a second worker, a forgotten Runner schedule, or a shell loop still running. Kill duplicates before retrying. For persistent 5xx, back off with 60, 300, then 900 second waits and retry up to four times. Log each attempt with timestamp and response prefix. For official scope and auth background, see Indexing API prerequisites and using the Indexing API.
Pre flight checklist for every manual test
Run this checklist before every cURL or Postman send so manual tests stay comparable and quota safe. Start with identity and project. Confirm the service account email in your key file matches the Owner entry in Search Console for the exact property you will test, including domain versus prefix scope. Confirm the Cloud project ID in your runbook matches the project where the Indexing API shows as enabled and where quota graphs will update. Confirm the JSON key ID matches the deployed file and that no other active keys create ambiguity about which identity you use. Log the email and project ID with each test session so later review never guesses.
Next, validate the URL string character by character. Copy the canonical from page source, confirm https, host case, trailing slash policy, and absence of session parameters or fragments that do not change content. Fetch the URL without auth and confirm 200 status, indexable robots, no noindex, and self referencing canonical. Check robots.txt for the path and confirm structured data validity where you claim JobPosting or BroadcastEvent scope. Paste the exact string into both publish and metadata steps without retyping, to avoid slash or encoding drift that creates false 404s on lookup.
Then confirm token, quota, and logging readiness. Mint a fresh token if the current one is older than fifty minutes, verify expiry about an hour ahead, and store it in a shell variable plus a Postman secret variable without writing it to shared notes. Open Cloud Quotas and confirm remaining publish capacity for today, keeping manual volume to a handful so automation retains headroom. Prepare a log line template with timestamp, normalized URL, type, HTTP status, response prefix, and request ID. Send one request, read the full response, record notifyTime on 200, and wait at least thirty seconds before the next send. When every manual test follows this pre flight, later automation inherits clean URL forms, correct property mappings, and honest baselines for success.
FAQ
How do I get a token quickly for indexing api curl testing?
Use gcloud auth print-access-token with the indexing scope after activating your service account, or run a small Python helper that refreshes credentials and saves the token to a restricted file with mode 600. This jwt curl indexing shortcut gives you a valid Bearer token in under two minutes without hand building JWT claims. Copy the token into a shell variable for cURL and into a Postman secret variable for GUI calls, without writing it to shared notes or shell history. Tokens last about an hour, so mint fresh for each test session, confirm expiry about an hour ahead, and record the service account email alongside the token for later 403 debugging.
Why does indexing api curl return 403 permission denied with a fresh token?
The token proves key, scope, and clock, but publish permission is checked separately in Search Console. The service account email must be Owner on the exact property containing the URL, with no typos and no domain versus prefix mismatch. Open Users and permissions for that property, confirm exact email and Owner role, and retry with the same token if still valid. Also confirm the indexing api endpoint spelling and that the API is enabled in the same Cloud project that owns the key, since enabling in a personal project while submitting with a client key produces the same 403. Park further sends until delegation is fixed.
What is the difference between 404 on publish and 404 on the urlnotifications endpoint metadata?
A 404 on metadata for a never submitted URL is normal and means no notification is stored for that string, which is a useful indexing api test signal. A 404 tied to a typo in the endpoint path or a malformed request means your URL path is wrong, not that storage is empty. Check endpoint spelling for publish calls, confirm you use the exact urlnotifications endpoint form, and standardize URL normalization for metadata lookups before assuming an API fault. Reuse the identical canonical string for publish and metadata, including protocol, host case, and trailing slash, and wait five minutes before rechecking to allow for storage lag.
How many manual indexing api test calls can I run per day?
Keep manual publishes to three to five URLs per day while learning, well below typical daily quotas near 200, and log each with timestamp, URL, type, status, and response prefix. This restrained indexing api test rhythm leaves headroom for automation and retries while building a clean baseline. Save bulk work for queued scripts with pacing of 30 to 60 seconds and exponential backoff. Use metadata reads the next day to confirm persistence without spending publish quota, sample rather than polling exhaustively, and pause publishes for the day if 429 appears. Note reset expectations and resume with smaller batches tomorrow.
Should I save tokens in an indexing api postman workspace?
Save collection structure without token values in any indexing api postman workspace. Each teammate should supply their own short lived token via environment variables marked secret, minted from their own authorized flow. A safe postman google api setup shares baseUrl, request shapes, and saved examples for 200, 403, 404, and 429, but never syncs long lived tokens or JSON keys through shared workspaces, screenshots, or docs. Masked variables plus local minting keep manual testing safe and auditable. Export the collection as JSON without values, store it in git with a README, and rotate any token that was ever pasted into a shared note.
When should I move from Postman to code with this google api rest call?
Move when three manual publishes return 200 with matching next day metadata, you can explain one 403 and one 429 from experience, and you have recorded quotas, property mappings, and normalized URL forms. At that point, each google api rest call is understood well enough to encode in scripts with pacing, retries, and JSON logging, while Postman stays for spot checks and incident reproduction. Good api testing seo discipline means carrying over the canonical URL list, the service account mapping table, and the quota numbers into script config rather than rediscovering them. Keep cURL one liners handy, since a single curl submit url google reproduction quickly shows whether a script failure is code behavior or delegation, quota, or URL state.
Sources
- https://developers.google.com/search/apis/indexing-api/v3/prereqs
- https://developers.google.com/search/apis/indexing-api/v3/quickstart
- https://developers.google.com/search/apis/indexing-api/v3/using-api
- https://support.google.com/webmasters/answer/9008080
- https://www.indexnow.org/documentation