\1

Publisher API Documentation

Multi-Format Content Delivery for AI Systems, Crawlers & Licensing

Version 1.0 | Dr. Paul Farrow | November 2025

πŸ“˜ Overview

This API provides content in multiple industry-standard formats designed for modern publishers, AI systems, search engines, and licensing platforms.

🌐 HTML Articles

Semantic HTML with Schema.org, OpenGraph, and AI permission metadata

πŸ“° RSS & Atom

RSS 2.0 and Atom 1.0 feeds with category and tag filtering

πŸ—ΊοΈ Sitemaps

XML sitemaps for articles, categories, and tags

πŸ”Œ REST API

JSON API with pagination, filtering, and search

🎯 GraphQL

Flexible queries with GraphiQL interface

πŸ€– MCP Protocol

Model Context Protocol adapter for LLMs

🌐 NLWeb Format

Natural Language Web structured summaries

πŸ“¦ Bulk Export

JSON, NDJSON, and XML archive exports

πŸš€ Quick Start

Base URL

https://drpaulfarrow.com/publisher

Example Requests

# Get all articles
curl https://drpaulfarrow.com/publisher/api/v1/articles

# Get single article
curl https://drpaulfarrow.com/publisher/api/v1/articles/privacy-first-advertising

# RSS feed
curl https://drpaulfarrow.com/publisher/rss.xml

# MCP query
curl -X POST https://drpaulfarrow.com/publisher/mcp \
  -H "Content-Type: application/json" \
  -d '{"tool":"get_article","parameters":{"slug":"privacy-first-advertising"}}'

πŸ“„ HTML Articles

GET /articles/{article-id}

Returns a fully-formed HTML article page with comprehensive metadata.

Included Metadata

AI Permission Tags

<meta name="ai-training" content="allow" />
<meta name="ai-inference" content="allow" />
<meta name="ai-commercial" content="allow" />

πŸ“° RSS Feeds

Global Feed

GET /rss.xml

Returns last 50 articles across all categories.

Category Feed

GET /rss/{category}.xml

Example: /rss/privacy.xml

Tag Feed

GET /rss/tag/{tag}.xml

Example: /rss/tag/ai.xml

Available Categories

privacy | neuroscience | adtech | ai | career

πŸ—ΊοΈ XML Sitemaps

GET /sitemap.xml

Sitemap index linking to all sub-sitemaps.

GET /sitemaps/articles.xml

All article URLs with last modified dates.

GET /sitemaps/categories.xml

Category listing pages.

GET /sitemaps/tags.xml

Tag listing pages.

πŸ”Œ REST API

List Articles

GET /api/v1/articles

Query Parameters

Parameter Type Description
category string Filter by category
tag string Filter by tag
limit integer Items per page (default: 20)
cursor integer Pagination offset (default: 0)

Example Response

{
  "data": [
    {
      "id": "privacy-first-advertising",
      "title": "The Future of Privacy-First Advertising",
      "author": "Dr. Paul Farrow",
      "published_at": "2025-01-15T10:00:00Z",
      "category": "privacy",
      "tags": ["privacy", "advertising"],
      "excerpt": "...",
      "canonical_url": "https://drpaulfarrow.com/publisher/privacy-first-advertising",
      "allow_ai_training": true,
      "allow_ai_inference": true
    }
  ],
  "pagination": {
    "cursor": 20,
    "hasMore": false,
    "total": 10
  }
}

Get Single Article

GET /api/v1/articles/{id}

Returns complete article including HTML and plaintext content.

Other Endpoints

GET /api/v1/categories
GET /api/v1/tags
GET /api/v1/licensing

🎯 GraphQL API

POST /graphql

Interactive GraphiQL interface available at /graphql

Example Query

query {
  articles(category: "privacy", limit: 5) {
    id
    title
    author
    published_at
    excerpt
    tags
    allow_ai_training
  }
  
  categories
  tags
}

Search Query

query {
  search(query: "artificial intelligence") {
    id
    title
    excerpt
    canonical_url
  }
}

πŸ€– MCP (Model Context Protocol)

POST /mcp

Exposes publisher content to LLMs via standardized MCP tools.

Available Tools

Tool Parameters Description
list_articles none Get all articles with metadata
get_article slug Get single article by ID
search_articles query Search articles by text
get_categories none List all categories
get_tags none List all tags

Example Request

{
  "tool": "get_article",
  "parameters": {
    "slug": "privacy-first-advertising"
  }
}

Example Response

{
  "tool": "get_article",
  "result": { /* full article object */ },
  "timestamp": "2025-11-17T12:00:00Z",
  "rights": {
    "licensing_endpoint": "https://drpaulfarrow.com/publisher/api/v1/licensing",
    "attribution_required": true
  }
}

🌐 NLWeb Format

GET /nlweb/articles/{slug}

Natural Language Web format (v0.83+) with structured metadata for AI consumption.

Response Structure

πŸ“¦ Archive Export

JSON Export

GET /export/json

Complete archive in JSON format with metadata.

NDJSON Export

GET /export/ndjson

Newline-delimited JSON, one article per line.

XML Export

GET /export/xml

Complete archive in XML format.

πŸ”’ Access Control

Robots.txt

GET /robots.txt

Configures crawler access for different user agents including AI bots.

Rate Limiting

API endpoints are rate-limited to 100 requests per 15 minutes per IP address.

⚠️ Rate Limit Response: If exceeded, you'll receive a 429 status with the message: "Too many requests from this IP, please try again later."

CORS

CORS is enabled for all origins to facilitate testing and integration.

πŸ“Š Content Model

All articles follow a unified content model:

{
  "id": "string (unique slug)",
  "title": "string",
  "subtitle": "string (optional)",
  "author": "string",
  "published_at": "ISO 8601 datetime",
  "updated_at": "ISO 8601 datetime",
  "category": "string",
  "tags": ["array of strings"],
  "excerpt": "string (short description)",
  "content_html": "string (HTML)",
  "content_plaintext": "string (plain text)",
  "cover_image_url": "string (optional)",
  "canonical_url": "string (full URL)",
  "rights_licensing": "string",
  "allow_ai_crawl": "boolean",
  "allow_ai_training": "boolean",
  "allow_ai_inference": "boolean",
  "licensing_endpoint": "string (URL)"
}

πŸ“ž Contact & Licensing

For licensing inquiries, commercial use, or technical support:

Attribution

When using content from this API, please provide proper attribution:

Farrow, P. (2025). [Article Title]. Retrieved from https://drpaulfarrow.com/publisher/[article-id]