PHPackages                             goodmorning/craft-indexnow - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. goodmorning/craft-indexnow

ActiveCraft-plugin[Search &amp; Filtering](/categories/search)

goodmorning/craft-indexnow
==========================

IndexNow integration for Craft CMS

1.0.2(9mo ago)010proprietaryPHPPHP &gt;=8.2

Since Sep 19Pushed 9mo agoCompare

[ Source](https://github.com/goodmorningoslo/craft-indexnow)[ Packagist](https://packagist.org/packages/goodmorning/craft-indexnow)[ RSS](/packages/goodmorning-craft-indexnow/feed)WikiDiscussions main Synced today

READMEChangelog (3)Dependencies (3)Versions (4)Used By (0)

IndexNow for Craft CMS
======================

[](#indexnow-for-craft-cms)

IndexNow integration for Craft CMS.
This plugin automatically (or programmatically) notifies participating search engines when content on your site changes, so they can crawl and update search results faster.

What is IndexNow?
-----------------

[](#what-is-indexnow)

[IndexNow](https://www.indexnow.org/) is an open protocol originally backed by Microsoft Bing and Yandex.
Instead of waiting for search engines to discover changed content via periodic crawling, your site **pushes** a small JSON payload listing new / updated / deleted URLs. Benefits:

- Faster reflection of fresh or removed content
- Reduced unnecessary crawl load
- Lightweight (simple POST with JSON)
- Privacy-friendly (you choose what to send)

The core endpoint used (by default) is: `https://api.indexnow.org/indexnow`, which proxies to participating engines.

Features
--------

[](#features)

- 🔑 Automatic key verification route: `https://your-site/.txt`
- 🛰️ URL submission service with retry &amp; logging
- 🧪 Dry run mode for safe testing (no external HTTP requests)
- 🌐 Environment gating (only activate on selected environment)
- 🧩 Twig extension (exposes settings for templates)
- 🛠️ Control panel utility (`Utilities > IndexNow`)
- 👤 Permission: restrict access to plugin settings (`indexnow-accessSettings`)
- 🧾 Optional request payload logging (for audits / debugging)
- 🔌 Endpoint override (point to a mock server or future protocol changes)

Requirements
------------

[](#requirements)

- Craft CMS 5.7.0+
- PHP 8.2+
- OpenSSL / cURL enabled (default Craft HTTP stack requirements)
- Outbound HTTPS allowed to `api.indexnow.org` (or your override)

Installation
------------

[](#installation)

### From the plugin store (recommended)

[](#from-the-plugin-store-recommended)

1. In the control panel, go to plugin store → search for “indexnow”.
2. Click install.

### Via Composer

[](#via-composer)

```
# From your Craft project root
composer require goodmorning/craft-indexnow
php craft plugin/install craft-indexnow
```

Configuration &amp; settings
----------------------------

[](#configuration--settings)

You can configure settings in the control panel (Settings → Plugins → IndexNow) or optionally via a config file override (`config/indexnow.php`).

### Current settings (based on code)

[](#current-settings-based-on-code)

SettingTypeDefaultDescription`apiKey`string(none)Secret key used both for verification file route and payload authentication. Required for submissions.`environment`string`production`Environment name in which the plugin should actively initialize URL submission logic.`logPayload`bool`false`If true, logs the full JSON payload prior to sending (use with caution in production).`dryRun`bool`false`If true, skips the outbound HTTP request but logs as if it would submit (useful for testing).`endpointOverride`string(empty)Alternate IndexNow endpoint (e.g. staging / mock server). If set, plugin logs the override.### Config file example (`config/indexnow.php`)

[](#config-file-example-configindexnowphp)

Create this file if you’d like to lock or override settings from code (these values will typically override CP-edited values depending on how your Settings model is implemented):

```
