CodeCrafters URL Indexing for Google and IndexNow

Description

CodeCrafters URL Indexing is not affiliated with or endorsed by Google, Microsoft, or the IndexNow initiative. Google, Bing, and IndexNow are trademarks of their respective owners.

CodeCrafters URL Indexing tells search engines about your content the moment it changes. When you publish, update, or delete a post or page, the plugin notifies Google and IndexNow-compatible engines right away—so you spend less time waiting for organic crawls and more time shipping content.

Faster discovery instead of waiting for crawlers

Traditional SEO relies on search bots finding new URLs on their own schedule. That can take hours or days. CodeCrafters URL Indexing shortens that gap by sending explicit URL notifications whenever your content changes. Fresh posts, corrected pages, and removed URLs are all reported promptly so indexing can begin sooner.

Two modern APIs in one lightweight plugin

  • Google Indexing API — Authenticates with a Google Cloud service account (OAuth 2.0 / JWT) and publishes URL_UPDATED or URL_DELETED notifications to Google’s Indexing API. Ideal for sites that need timely Google awareness of content changes.
  • IndexNow — Submits URLs to the IndexNow protocol used by Bing, Yandex, Naver, and other participating engines. A site key is generated on activation and verified via a rewrite-served key file—no manual upload to your server disk.

Enable either API or both. Each connection can be tested from the settings screen before you go live.

Zero bloat, privacy-first architecture

CodeCrafters URL Indexing is built for WordPress performance and hygiene:

  • Pure WordPress APIs—no Composer runtime libraries, no jQuery admin scripts, no heavy SDKs
  • API pings are offloaded to WP-Cron so saving a post never waits on a remote request
  • Google access tokens are cached in WordPress transients, and the daily Google quota counter is updated atomically so concurrent pings cannot exceed it
  • Credentials stay in your database (wp_options); the Google JSON key is never written to the uploads folder

Submission log with automatic cleanup

Every ping is recorded in a dedicated log table: URL, engine, action, status, HTTP code, and response body. Filter by engine, status, or date, export CSV when you need an audit trail, and rely on automatic pruning so old entries are cleaned up on a schedule (30 days by default, configurable from 7 to 365 days).

Manual control when you need it

Prefer to push a single URL now? The post editor meta box includes Submit to Google and Submit to IndexNow buttons so you can re-notify engines after a quiet edit or a failed automatic attempt—without leaving the editor.

Configure which post types are monitored, toggle auto-ping per engine, and watch your Google daily quota usage from Settings. CodeCrafters URL Indexing stays out of your theme and front end while keeping search engines in the loop.

How it works

  1. You change content. You publish, update, unpublish, trash, or permanently delete a post, page, or any monitored post type.
  2. The plugin queues a ping. It picks the right notification type (URL_UPDATED for published content, URL_DELETED when a published URL is removed or unpublished) and schedules a single WP-Cron event. Your save finishes immediately.
  3. Search engines are notified in the background. The cron job sends the URL to the Google Indexing API (if enabled and within your daily quota) and to IndexNow (if enabled), which shares it with Bing, Yandex, Naver, and other participating engines.
  4. Every result is logged. The outcome (success, failed, skipped, or quota exceeded), HTTP code, and raw response are saved to the Submission Logs screen so you can see exactly what happened.

Notifications ask search engines to crawl sooner. They do not guarantee indexing or ranking; each engine still decides whether and when to index a URL.

Google Indexing API vs. IndexNow

  • Google Indexing API notifies Google Search. You provide a Google Cloud service account JSON key and add that service account as an Owner in Google Search Console. Up to 200 requests per day per Google Cloud project. One-time setup takes about 10–15 minutes.
  • IndexNow notifies Bing, Yandex, Naver, and other IndexNow partners. You provide nothing: the plugin generates the key and serves the verification file for you. It works the moment you enable it.

Most sites enable IndexNow right away and add Google once Search Console ownership is ready.

Developer hooks

  • ccurlidx_post_types — filter the list of monitored post types.
  • ccurlidx_should_ping — return false to skip pings for a specific post or status transition.
  • ccurlidx_should_ping_google / ccurlidx_should_ping_indexnow — skip a single engine for a given URL.

External Services

This plugin connects to the following external services:

  1. Google OAuth 2.0 token endpoint (https://oauth2.googleapis.com/token)

    • Purpose: Exchanges a signed service-account JWT for a short-lived access token used by the Indexing API
    • Data sent: A signed JWT asserting the service account identity (no page content or visitor data)
    • Authentication: Service account private key stored locally in WordPress options
    • Google API Terms of Service
    • Google Privacy Policy
  2. Google Indexing API (https://indexing.googleapis.com)

    • Purpose: Notifies Google when a URL is published, updated, or deleted
    • Data sent: The full URL of the published/updated/deleted page and the notification type (URL_UPDATED or URL_DELETED)
    • Authentication: OAuth 2.0 Bearer token obtained from the token endpoint above
    • Google API Terms of Service
    • Google Privacy Policy
  3. IndexNow API (https://api.indexnow.org)

The IndexNow key verification file is served by this WordPress site at /{key}.txt (rewrite rule). That response is not an external service call.

Screenshots

Installation

  1. Upload the codecrafters-url-indexing folder to /wp-content/plugins/, or install the plugin from Plugins Add New in your WordPress admin.
  2. Activate CodeCrafters URL Indexing through the Plugins menu. An IndexNow API key is generated automatically on activation.
  3. Go to URL Indexing Settings. Enable Google and/or IndexNow, and choose which post types should trigger automatic pings.
  4. For Google: create a Google Cloud service account with the Indexing API enabled, download the JSON key, paste it into the settings field, and add the service account email as an owner in Google Search Console for your property. Click Test Google Connection.
  5. For IndexNow: confirm the key file URL is reachable (served by the plugin via rewrite rules), then click Test IndexNow Connection. Save settings—new publishes, updates, and deletes will ping the enabled engines asynchronously.

FAQ

Do I need both Google and IndexNow?

No. Use either or both. IndexNow covers Bing and other partners with almost no setup. Google requires a Google Cloud project, Search Console ownership, and has a daily quota. Many sites start with IndexNow and add Google later.

Do I need a Google account?

Only if you enable the Google Indexing API. IndexNow works independently with the key generated by the plugin and does not require a Google account.

How do I get Google Indexing API credentials?

  1. Open Google Cloud Console and create (or select) a project.
  2. Go to APIs & Services Library, search for Web Search Indexing API, and click Enable.
  3. Go to IAM & Admin Service Accounts Create service account. Give it a clear name; no extra Cloud roles are needed.
  4. Open the service account, go to Keys Add key Create new key JSON, and download the file. Copy the service account email (it looks like name@project-id.iam.gserviceaccount.com).
  5. Open Google Search Console, select the property for your site, go to Settings Users and permissions, and add the service account email with Owner permission.
  6. In WordPress, go to URL Indexing Settings, enable Google Indexing API, paste the entire JSON file into Service account JSON, save, and click Test Google Connection.

Where should I paste the Google JSON key?

In URL Indexing Settings Service account JSON. Paste the full contents of the downloaded .json file. Do not upload the file to your media library or leave it in a public folder. On later saves, leave the field blank to keep the stored key unchanged.

Is my Google JSON key safe?

The key is stored in the WordPress options table, never as a publicly accessible file, and is not autoloaded on every page. Still treat it like a password: limit who has administrator access, use HTTPS, and never commit the key to version control or show it in screenshots.

Why does Google need a JSON key while IndexNow does not?

Google authenticates with a service account (OAuth 2.0 signed with the private key in the JSON file) and requires that account to own the site in Search Console. IndexNow proves ownership differently: search engines fetch a key file from your domain. The plugin creates that key and serves the file automatically.

How does the IndexNow key file work?

On activation the plugin generates a random 32-character key and serves it at https://yoursite.com/{key}.txt through a WordPress rewrite rule. No physical file is written to your server. Search engines fetch that URL to confirm you control the site.

Is IndexNow free? Is the Google Indexing API free?

IndexNow is a free, open protocol. Google’s Indexing API is generally free within its documented quota (commonly 200 requests per day per Google Cloud project). Check Google’s current quotas and billing policies for your project.

What’s the Google API daily limit?

Google typically allows about 200 Indexing API requests per day per Cloud project. The plugin lets you set a lower cap (180 by default, up to 200) and stops sending Google requests once it is reached; those attempts are logged as “Quota exceeded”. The counter resets at midnight UTC, and current usage is shown on the Settings and Tools screens.

Does IndexNow have a quota?

IndexNow does not publish a small daily cap like Google’s. Still, only notify real changes and avoid repeated resubmissions of the same URL.

Will this get my pages indexed instantly?

No plugin can guarantee that. Notifications ask search engines to crawl your URL sooner, but Google, Bing, and others still decide whether and when to index it based on quality, crawl budget, and their own systems.

Will this slow down my site or the editor?

No. Saving a post never waits on a remote API. Pings are scheduled through WP-Cron and run in the background after the request finishes. Nothing is loaded on the front end of your site, and the admin screens use lightweight vanilla JavaScript with no jQuery dependency.

What happens when I unpublish, trash, or delete a post?

When a published post is moved to draft, pending, private, scheduled, or trash, or is permanently deleted, the plugin sends a URL_DELETED notification to Google and notifies IndexNow of the change, so engines can drop or recrawl the stale URL faster.

Can I submit a URL manually?

Yes. Open any published post or page in the editor and use Submit to Google or Submit to IndexNow in the CodeCrafters URL Indexing panel in the sidebar. The panel also shows the last submission result for each engine. Results appear in the Submission Logs.

Which post types are supported?

Posts and pages are monitored by default. In Settings you can select any public post type with front-end URLs, such as WooCommerce products. Developers can adjust the list with the ccurlidx_post_types filter.

The Google connection test fails. What should I check?

  1. The Web Search Indexing API is enabled in the same Cloud project as the key.
  2. You pasted the entire JSON, including private_key and client_email.
  3. The service account email is an Owner of the correct Search Console property.
  4. Your WordPress site URL matches the Search Console property (www vs. non-www, http vs. https).
  5. The OpenSSL PHP extension is available on your server (required to sign the request).

The IndexNow connection test fails. What should I check?

  1. IndexNow is enabled and settings are saved.
  2. Open the Key file URL in a private browser window. It should show only the key text.
  3. If that URL returns a 404, go to Settings Permalinks and click Save Changes once to refresh rewrite rules.
  4. Make sure a security plugin or firewall is not blocking the .txt URL.
  5. If you just regenerated the key, wait a few minutes and test again.

Should I regenerate my IndexNow key?

Only if the key may have been exposed or you need to rotate it. Regenerating creates a new key and verification URL, and the old key stops working; search engines will re-verify the new key file.

Do I need Bing Webmaster Tools or Search Console for IndexNow?

No. Search Console ownership is required only for the Google Indexing API. Verifying your site in Bing Webmaster Tools is optional but lets you see IndexNow submissions there.

Does this replace my XML sitemap?

No. Keep your sitemap (WordPress core sitemaps or your SEO plugin). This plugin adds instant push notifications on top of normal crawler discovery.

How long are logs kept?

30 days by default. You can change the retention period (7 to 365 days) in Settings, and old entries are pruned automatically by a daily scheduled task. You can also export logs to CSV or clear them from the Submission Logs screen.

Is this GDPR compliant?

The plugin sends page URLs (and for IndexNow, your host and API key) to search engines. It does not send personal data such as names, emails, or visitor identifiers, and it adds no tracking to your site. Credentials are stored in your WordPress database. Review Google’s and Microsoft’s privacy policies linked in the External Services section, and mention these transfers in your own privacy policy if required.

What happens when I uninstall the plugin?

Deleting the plugin from the Plugins screen removes its settings, stored credentials, quota counters, scheduled events, and the submission log table.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“CodeCrafters URL Indexing for Google and IndexNow” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.0.0

  • Initial release