Docs
Indexing Guard runs as one step in your build. You send the pages you generated; it sends back the sitemaps to publish and a reason for every page it kept out.
1. Get a key
Pick a plan on the pricing section. Your key works straight away as a free trial: up to 100 URLs per build, 3 builds a day. Paying moves the same key up to your plan's limits. Store it as a CI secret, for example INDEXING_GUARD_KEY.
2. Call it from your build
Every call needs Authorization: Bearer <your key>.
curl -sS -o guard.json -w '%{http_code}' \
-H "Authorization: Bearer $INDEXING_GUARD_KEY" \
-H "Content-Type: application/json" \
--data @routes.json https://guard.myartmyrules.com/v1/process
routes.json looks like this:
{
"routes": [
{ "url": "/guides/oslo", "source_url": "https://data.example/oslo", "checked_date": "2026-10-01", "inventory_count": 12 }
]
}
url | Required. The page's path or full address on your site. |
source_url | Where the page's facts come from. Pages without a valid source are kept out of the sitemap. |
checked_date | When you last checked those facts, as YYYY-MM-DD. Becomes the sitemap's lastmod. Missing, invalid or future dates keep the page out. |
inventory_count | How many items the page lists. Zero takes the page out of the sitemap and your links. |
page_status | Set to "ignore" to take a page out of the sitemap and your links. |
canonical | Optional. The canonical tag from the built page ("" if none). Report only. |
title | Optional. The page title. Report only. |
word_count | Optional. Words of body text. Report only. |
3. Use the answer
A 200 answer has data.sitemap_index and data.sitemaps (files named in the index, split at 50,000 URLs). Write them to your output folder. data.noindex_urls and data.suppressed_urls list every page kept out, each with a reason. data.page_warnings flags canonical, title and thin-page problems for your team; they never change the sitemap. data.report has the counts. On the free trial these lists come back empty and data.note says so; the counts and sitemaps are complete, and page-by-page reasons start when you pay.
Reasons and fixes
missing_source | Add source_url: the page the facts come from. |
invalid_source | source_url must be a full http or https address. |
missing_date | Add checked_date as YYYY-MM-DD: the day you last checked the facts. |
invalid_date | checked_date must be a real date written YYYY-MM-DD. |
future_date | checked_date is after today. Use the day the facts were actually checked. |
ignore | page_status is "ignore". Remove it when the page should be found again. |
zero_inventory | inventory_count is 0. The page comes back once it lists something. |
missing_canonical | The built page has no canonical tag. Warning only. |
canonical_elsewhere | The canonical tag points to a different page. Warning only. |
missing_title | The built page has no title. Warning only. |
duplicate_title | Another page in this build has the same title. Warning only. |
thin_content | The page has little body text. Warning only. |
What changed since the last build
To see what moved, add an optional previous object to the request with the lists from your last answer: sitemap_urls (a list of addresses), noindex_urls and suppressed_urls (each { "url", "reason" }) and page_warnings (each { "url", "issue" }). Send address lists only, not sitemap files, and no more than your plan's URL limit. The answer then has data.change_list with pages added, removed and changed, counts per reason, and the fix line for each page that is newly kept out. We compare in memory and store nothing from previous. If it can't be read, the build still succeeds and change_list says so. On the free trial you get counts only.
4. Never block a deploy
Treat any answer other than 200 as "keep your existing sitemap and carry on". The build should warn, not fail.
200 | Use the sitemaps in the response. |
400 | The body isn't valid. The error says why. |
401 | Missing, unknown or rotated API key. |
402 | Subscription inactive. |
413 | More URLs than your plan covers per build. |
429 | Daily build limit reached. |
500 | Something failed on our side. |
Run history
GET /v1/runs lists your last 50 builds with their counts. We store counts only, never your URLs.
Rotate a key
POST /v1/keys/rotate with your current key returns a new one in data.api_key. The old key stops working at once. Your plan, billing and run history carry over. We show the new key once and keep only a fingerprint of it.
curl -sS -X POST -H "Authorization: Bearer $INDEXING_GUARD_KEY" https://guard.myartmyrules.com/v1/keys/rotate
AI agents
Claude Code, Cursor, Codex and other MCP clients can call Indexing Guard at https://guard.myartmyrules.com/mcp with the same key. Setup is on the AI agents page.
Support
Every answer has an X-Request-Id header. Include it when you write to terrell@myartmyrules.com.
Search engines decide what they index and rank. Indexing Guard controls what you submit.