{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/buzzdealer-ai/json-schema/buzzdealer-ai-publication-schema.json",
  "title": "Publication",
  "x-generated": "2026-11-03",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/buzzdealer-ai-openapi.json#/components/schemas/Publication",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "id",
    "product_type",
    "name",
    "price_cents",
    "currency"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "product_type": {
      "type": "string",
      "enum": [
        "site",
        "pr_package",
        "bundle",
        "program",
        "service"
      ]
    },
    "name": {
      "type": "string"
    },
    "domain": {
      "type": [
        "string",
        "null"
      ]
    },
    "category": {
      "type": [
        "string",
        "null"
      ]
    },
    "region": {
      "type": [
        "string",
        "null"
      ]
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "price_cents": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Price in US cents"
    },
    "price": {
      "type": [
        "string",
        "null"
      ],
      "description": "Price in US dollars, for display"
    },
    "currency": {
      "const": "USD"
    },
    "ai_score": {
      "type": [
        "integer",
        "null"
      ],
      "description": "AI score (beta), 0 to 100"
    },
    "tier": {
      "type": [
        "string",
        "null"
      ]
    },
    "dr": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100,
      "description": "DR (Ahrefs) of the site's domain. Single sites only; absent when we have no DR"
    },
    "dr_label": {
      "const": "DR (Ahrefs)"
    },
    "dofollow": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "min_word_count": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Sites: the fewest words the site takes (fit check); null when none is recorded"
    },
    "max_word_count": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Sites: the most words the site takes (fit check). Release on livepublicator.com: 800"
    },
    "max_links": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Sites: the most links the site takes (fit check). Release on livepublicator.com: 3"
    },
    "service_notes": {
      "type": [
        "string",
        "null"
      ],
      "description": "Release on livepublicator.com only: what happens to the release. The text is kept and lightly edited for style; a short summary, key facts and an FAQ are added; a person may review it first (usually within 24 hours); English only, 300 to 20,000 characters with the headline, at most 800 words and 3 https links; cover image (image_url) an https JPEG, PNG or WebP of at most 5 MB; no AI-generated images. No writing add-on. Contact details come from the order, else the brand's press contact"
    },
    "add_ons": {
      "type": "object",
      "properties": {
        "writing": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Writing add-on price in US cents, or null when not offered"
        },
        "logo": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Logo add-on price in US cents for this PR package, or null when it has no logo option"
        }
      }
    }
  }
}