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 }
  ]
}
urlRequired. The page's path or full address on your site.
source_urlWhere the page's facts come from. Pages without a valid source are kept out of the sitemap.
checked_dateWhen you last checked those facts, as YYYY-MM-DD. Becomes the sitemap's lastmod. Missing, invalid or future dates keep the page out.
inventory_countHow many items the page lists. Zero takes the page out of the sitemap and your links.
page_statusSet to "ignore" to take a page out of the sitemap and your links.
canonicalOptional. The canonical tag from the built page ("" if none). Report only.
titleOptional. The page title. Report only.
word_countOptional. 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_sourceAdd source_url: the page the facts come from.
invalid_sourcesource_url must be a full http or https address.
missing_dateAdd checked_date as YYYY-MM-DD: the day you last checked the facts.
invalid_datechecked_date must be a real date written YYYY-MM-DD.
future_datechecked_date is after today. Use the day the facts were actually checked.
ignorepage_status is "ignore". Remove it when the page should be found again.
zero_inventoryinventory_count is 0. The page comes back once it lists something.
missing_canonicalThe built page has no canonical tag. Warning only.
canonical_elsewhereThe canonical tag points to a different page. Warning only.
missing_titleThe built page has no title. Warning only.
duplicate_titleAnother page in this build has the same title. Warning only.
thin_contentThe 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.

200Use the sitemaps in the response.
400The body isn't valid. The error says why.
401Missing, unknown or rotated API key.
402Subscription inactive.
413More URLs than your plan covers per build.
429Daily build limit reached.
500Something 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.