Public & SEO Surfaces

These endpoints are public, need no authentication, and are scoped to a site by its host. They power the live site, search engines, AI crawlers, and the agent help reference.

Help & reference

  • GET /content/help — a compact, machine-readable reference of every content type, block type, Liquid filter, and tag, plus task recipes. Built for AI agents to load once and then build correctly. Query: format (yaml|md|json, default yaml).

  • GET /content/help/block-fields?block_type=hero — the exact fields for a block type, with alias and anti-pattern hints. Omit block_type to list all.

  • GET /content/variables — the merge-tag vocabulary for dynamic templates ({{ firstname }}, {{ company_name }}, etc.).

Example:

curl "https://spideriq.ai/api/v1/content/help?format=yaml"

Sitemaps

  • GET /content/sitemap.xml — the XML sitemap, generated from your published, indexable content and kept current automatically.

  • GET /content/sitemap — the same as JSON.

Pages set to noindex are excluded. See Search Engines.

AI-crawler surfaces

  • GET /content/llms.txt — an index of your site (titles + links + descriptions) following the llmstxt.org convention.

  • GET /content/llms-full.txt — your site's full content as Markdown, in one fetch. Opt-in per site via extensions.llms_txt.full_enabled; size-governed; noindex-honoring.

  • GET /<slug>.md (or ?format=md on a page/post) — any page as clean Markdown.

See AI Crawlers.

Feeds

  • GET /content/feed.xml — RSS 2.0.

  • GET /content/atom.xml — Atom 1.0.

  • GET /content/feed.json — JSON Feed 1.1.

  • GET /content/robots.txt — a dynamic robots.txt honoring your settings.

  • GET /content/opensearch.xml — an OpenSearch description for browser search.

Public content reads

The read side of every content type is public:

  • GET /content/pages, GET /content/pages/{slug}

  • GET /content/posts, /content/posts/{slug}, /content/posts/featured, /content/posts/search

  • GET /content/authors, /content/authors/{slug}, /content/categories, /content/tags

  • GET /content/docs/tree, /content/docs/{path}, /content/docs/search

  • GET /content/navigation/{location}

  • GET /content/settings

  • GET /content/media

See Content for the full list and the matching write endpoints.

Directory listings

A directory's pages are public, and so are the doors behind them. Both are unauthenticated and tenant-scoped by the request host.

  • GET /content/directory/categories — every category with published listings.

  • GET /content/directory/listings[?category=&city=&page=&page_size=] — the flat list, no category or city segment in the path.

  • GET /content/directory/listings/{listing_slug}[?category=] — one listing.

curl "https://spideriq.ai/api/v1/content/directory/listings?limit=2" \
  -H "X-Content-Domain: publish.spideriq.ai"

A listing slug is unique per category, not per site. Where two categories hold the same slug the flat detail door returns a deterministic first match and names its choice in category_slug — it never fails on the ambiguity. Pass ?category= to pin it.

The nested pages at /{directory_base}/{category}/{city}/{listing} read the same rows. Flat and nested coexist; neither replaces the other.

Data source items

GET /content/data-sources/{source_id}/items serves the rows behind any bindable collection, scoped to the requesting tenant. idap.businesses — the tenant's own business corpus, 45 declared fields — is served here.

curl "https://spideriq.ai/api/v1/content/data-sources/idap.businesses/items?limit=50" \
  -H "X-Content-Domain: publish.spideriq.ai"

Paging past 10,000 rows needs the cursor, not offset. offset is capped at 10,000. Beyond it the door refuses with 422 OFFSET_CAP_EXCEEDED, names the cap, and tells you what to send instead:

{ "error": { "code": "OFFSET_CAP_EXCEEDED",
             "message": "offset=10001 exceeds the maximum of 10000 for 'idap.businesses'.",
             "what_was_expected": { "max_offset": 10000 } } }

Take next_cursor from any response and send it back as after. Send it instead of offset, never alongside. A cursor walk returns the rows that follow, in the same order, with no overlap and no ceiling.

curl "https://spideriq.ai/api/v1/content/data-sources/idap.businesses/items?limit=500&after=<next_cursor>" \
  -H "X-Content-Domain: publish.spideriq.ai"

An unregistered source id returns 404 and points at the registry; a registered but non-servable one returns 422. idap.businesses is servable; idap.countries, idap.cities and idap.streets are registered and not servable, and idap.lead is a singleton that reaches landing-page templates rather than this door.

Marketplace & data

  • GET /content/marketplace/components, /content/marketplace/site-templates, /content/marketplace/bg-videos, /content/marketplace/search — browse the marketplace (see Design & Deploy).

  • GET /content/data-sources — the dynamic-content data sources available for binding, each with its field list and an is_servable flag (posts, authors, categories, directory listings, idap.businesses, and your own collections).

  • GET /content/vayapin/cards — VayaPin location cards by pins or by a country/city/category query (see VayaPin Cards).

VayaPin cards

# Specific pins
curl "https://spideriq.ai/api/v1/content/vayapin/cards?pins=BB:CHAMPERS,BB:TAPAS"
# Or a live query
curl "https://spideriq.ai/api/v1/content/vayapin/cards?country=DK&category=bars&limit=12"

Next steps

Publish