{
  "openapi": "3.1.0",
  "info": {
    "title": "The Profound Agency — publisher catalogue",
    "version": "1.0.0",
    "summary": "Read-only access to ~1,700 paid editorial placements.",
    "description": "Search and read The Profound Agency's publisher network: price, Domain Authority, Domain Rating, turnaround, region, Google indexing and sponsored-disclosure status for every publication we can place an article in.\n\nThis describes the read surface only. Ordering, quoting and campaign briefs are on the Model Context Protocol server at https://theprofound.agency/api/mcp/, documented at https://theprofound.agency/mcp/ — JSON-RPC cannot be expressed in OpenAPI, which is why it is not listed here.\n\nNo authentication. No account. The same data is published on the open web at /product/<slug>/; this is that data in one call.\n\nAn agent cannot buy anything through any interface we operate. Ordering returns a payment link a human has to open.",
    "contact": {
      "name": "The Profound Agency",
      "email": "theprofoundagency@gmail.com",
      "url": "https://theprofound.agency/"
    },
    "license": {
      "name": "Catalogue data may be quoted with attribution",
      "url": "https://theprofound.agency/ai.txt"
    }
  },
  "servers": [
    { "url": "https://theprofound.agency", "description": "Production" }
  ],
  "externalDocs": {
    "description": "Guidance for agents acting on this site",
    "url": "https://theprofound.agency/agents.md"
  },
  "paths": {
    "/api/catalog/search/": {
      "get": {
        "operationId": "searchPlacements",
        "summary": "Search placements",
        "description": "Search the publisher network. Every filter is optional; with none the whole catalogue is paged. Returns the highest Domain Authority first unless sorted otherwise.",
        "parameters": [
          { "name": "q", "in": "query", "description": "Free text matched against publication name, domain and categories.", "schema": { "type": "string" } },
          { "name": "category", "in": "query", "description": "Match any of these categories. Repeat the parameter for more than one.", "schema": { "type": "array", "items": { "type": "string" } }, "style": "form", "explode": true },
          { "name": "minPrice", "in": "query", "description": "Minimum price in USD.", "schema": { "type": "number" } },
          { "name": "maxPrice", "in": "query", "description": "Maximum price in USD.", "schema": { "type": "number" } },
          { "name": "minDomainAuthority", "in": "query", "description": "Minimum Moz Domain Authority, 0-100.", "schema": { "type": "number" } },
          { "name": "minDomainRating", "in": "query", "description": "Minimum Ahrefs Domain Rating, 0-100.", "schema": { "type": "number" } },
          { "name": "maxTurnaroundDays", "in": "query", "description": "Longest acceptable turnaround in days. Measured from final draft approval, not from purchase.", "schema": { "type": "number" } },
          { "name": "region", "in": "query", "description": "Substring match on the outlet's primary region.", "schema": { "type": "string" } },
          { "name": "googleIndexed", "in": "query", "description": "Only outlets recorded as indexed by Google.", "schema": { "type": "boolean" } },
          { "name": "llmReady", "in": "query", "description": "Only outlets flagged as readable by AI crawlers.", "schema": { "type": "boolean" } },
          { "name": "sort", "in": "query", "schema": { "type": "string", "enum": ["price_asc", "price_desc", "da_desc", "dr_desc", "turnaround_asc"] } },
          { "name": "limit", "in": "query", "description": "Results per page, 1-100. Defaults to 20.", "schema": { "type": "integer", "minimum": 1, "maximum": 100 } },
          { "name": "offset", "in": "query", "description": "Result offset, for paging.", "schema": { "type": "integer", "minimum": 0 } }
        ],
        "responses": {
          "200": {
            "description": "A page of matches.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["total", "offset", "limit", "results"],
                  "properties": {
                    "total": { "type": "integer", "description": "Matches before paging." },
                    "offset": { "type": "integer" },
                    "limit": { "type": "integer" },
                    "results": { "type": "array", "items": { "$ref": "#/components/schemas/Placement" } }
                  }
                }
              }
            }
          },
          "500": { "$ref": "#/components/responses/Error" }
        }
      }
    },
    "/api/catalog/placements/{id}/": {
      "get": {
        "operationId": "getPlacement",
        "summary": "Get one placement",
        "description": "Full detail for one publication by its id, which is the slug in its page URL: /product/<id>/.",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "description": "Placement id, e.g. \"hood-critic\".", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": {
            "description": "The publication.",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Placement" } } }
          },
          "404": { "$ref": "#/components/responses/Error" }
        }
      }
    },
    "/api/catalog/categories/": {
      "get": {
        "operationId": "listCategories",
        "summary": "List categories",
        "description": "Every category in the network with how many publications carry it. Use it to pick valid values for the category filter.",
        "responses": {
          "200": {
            "description": "Categories with counts.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "categories": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "category": { "type": "string" },
                          "count": { "type": "integer" }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "Error": {
        "description": "Something went wrong, described in plain language.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": { "error": { "type": "string" } }
            }
          }
        }
      }
    },
    "schemas": {
      "Placement": {
        "type": "object",
        "description": "One publication we can place a paid editorial article in.",
        "required": ["id", "publication", "url"],
        "properties": {
          "id": { "type": "string", "description": "Stable slug, also the segment in the page URL." },
          "publication": { "type": "string", "description": "The outlet's name." },
          "url": { "type": "string", "format": "uri", "description": "The publication's page on theprofound.agency." },
          "website": { "type": "string", "description": "The outlet's own domain." },
          "price": { "type": "number", "description": "Price in USD, before the processing fee added at checkout." },
          "domainAuthority": { "type": "number", "description": "Moz Domain Authority, 0-100." },
          "domainRating": { "type": "number", "description": "Ahrefs Domain Rating, 0-100." },
          "turnaroundDays": { "type": "number", "description": "Upper end of the quoted range, in days from final draft approval." },
          "region": { "type": "string", "description": "Primary region the outlet serves." },
          "categories": { "type": "array", "items": { "type": "string" } },
          "googleIndexed": { "type": "boolean" },
          "llmReady": { "type": "boolean", "description": "Recorded as readable by AI crawlers." },
          "disclosure": { "type": "string", "description": "Sponsored, Discrete or Not sponsored — how the outlet labels a paid article." },
          "exampleLink": { "type": "string", "format": "uri", "description": "A published article on the outlet, where one is listed." }
        }
      }
    }
  }
}
