placementapi-com · Schema

Site

The one place everything about a publisher is assembled. Use it for compare_domain and any 'tell me about this site' question rather than stitching offers together.

CompanyAISEOMarketingBacklinksAutomationTechnology

Properties

Name Type Description
configured boolean
found boolean
site object
verification object
restricted object
graph object Common Crawl web graph, root sites only (null fields on subdomains).
survival object
link_history objectnull The decay curve behind survival: our placements checked at each checkpoint and how many were live then. Same three-order floor.
outcomes objectnull Observed after placements on this publisher across every buyer; null under three distinct buyers. Observed, never caused.
placement_score object
demand object
supplier_count integer Distinct suppliers carrying the domain — why a price spread exists — without saying who.
spread_usd_minor integernull
listings array Cheapest first.
metrics array Vendor claims and independent readings side by side, never merged.
View JSON Schema on GitHub

JSON Schema

placementapi-com-site-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/placementapi-com/json-schema/placementapi-com-site-schema.json",
  "title": "Site",
  "description": "The one place everything about a publisher is assembled. Use it for compare_domain and any 'tell me about this site' question rather than stitching offers together.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/placementapi-com-openapi.json#/components/schemas/Site",
  "type": "object",
  "properties": {
    "configured": {
      "type": "boolean"
    },
    "found": {
      "type": "boolean",
      "const": true
    },
    "site": {
      "type": "object",
      "properties": {
        "site_id": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "domain_hidden": {
          "type": "boolean"
        },
        "categories": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "language": {
          "type": [
            "string",
            "null"
          ]
        },
        "country": {
          "type": [
            "string",
            "null"
          ]
        },
        "subdomain_of": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "verification": {
      "type": "object",
      "properties": {
        "flag": {
          "$ref": "#/$defs/Verification"
        },
        "reasons": {
          "$ref": "#/$defs/QualityReasons"
        }
      }
    },
    "restricted": {
      "$ref": "#/$defs/Restricted"
    },
    "graph": {
      "type": "object",
      "description": "Common Crawl web graph, root sites only (null fields on subdomains).",
      "properties": {
        "outbound_external": {
          "type": [
            "integer",
            "null"
          ]
        },
        "inbound_domains": {
          "type": [
            "integer",
            "null"
          ]
        },
        "cc_pagerank": {
          "type": [
            "number",
            "null"
          ]
        },
        "cc_harmonic": {
          "type": [
            "number",
            "null"
          ]
        },
        "leader_links": {
          "$ref": "#/$defs/LeaderLinks"
        }
      }
    },
    "survival": {
      "$ref": "#/$defs/Survival"
    },
    "link_history": {
      "type": [
        "object",
        "null"
      ],
      "description": "The decay curve behind survival: our placements checked at each checkpoint and how many were live then. Same three-order floor.",
      "properties": {
        "orders": {
          "type": "integer"
        },
        "by_checkpoint": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "checkpoint": {
                "type": "string"
              },
              "checked": {
                "type": "integer"
              },
              "live": {
                "type": "integer"
              }
            }
          }
        },
        "first_check_at": {
          "type": "string"
        },
        "last_check_at": {
          "type": "string"
        }
      }
    },
    "outcomes": {
      "type": [
        "object",
        "null"
      ],
      "description": "Observed after placements on this publisher across every buyer; null under three distinct buyers. Observed, never caused."
    },
    "placement_score": {
      "$ref": "#/$defs/PlacementScore"
    },
    "demand": {
      "$ref": "#/$defs/Demand"
    },
    "supplier_count": {
      "type": "integer",
      "description": "Distinct suppliers carrying the domain — why a price spread exists — without saying who."
    },
    "spread_usd_minor": {
      "type": [
        "integer",
        "null"
      ]
    },
    "listings": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/SiteListing"
      },
      "description": "Cheapest first."
    },
    "metrics": {
      "type": "array",
      "description": "Vendor claims and independent readings side by side, never merged.",
      "items": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string"
          },
          "rank": {
            "type": [
              "number",
              "null"
            ]
          },
          "traffic": {
            "type": [
              "number",
              "null"
            ]
          },
          "referring_domains": {
            "type": [
              "integer",
              "null"
            ]
          },
          "spam_score": {
            "type": [
              "number",
              "null"
            ]
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "fetched_at": {
            "type": "string"
          }
        }
      }
    }
  },
  "$defs": {
    "Demand": {
      "type": [
        "object",
        "null"
      ],
      "description": "Observed demand: distinct buyers who bought the domain in twelve months and the niches they bought for. Null under the three-buyer floor. Nothing about any one buyer is ever here.",
      "properties": {
        "buyers_12m": {
          "type": "integer"
        },
        "purchases_12m": {
          "type": "integer"
        },
        "niches": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "topic": {
                "type": "string"
              },
              "buyers": {
                "type": "integer"
              }
            }
          }
        }
      }
    },
    "LeaderLinks": {
      "type": [
        "object",
        "null"
      ],
      "description": "Common Crawl web graph, root sites only (null on subdomains): how many of a topic's top-ranking sites the domain links to, keyed by topic.",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "linked": {
            "type": "integer"
          },
          "of": {
            "type": "integer"
          }
        }
      }
    },
    "MarketReference": {
      "type": [
        "object",
        "null"
      ],
      "description": "The median ASK of comparable placements (same type, inventory mode and claimed-DR decade), not a clearing price — say 'market reference', never 'fair value'. own_asks is the spread of asks across suppliers for this exact domain and type, as counts and credits only. ask_history is null under 14 days of observations. Null on a thin band.",
      "properties": {
        "reference_credits": {
          "type": "integer"
        },
        "method": {
          "type": "string",
          "const": "band_median_v1"
        },
        "comparables_n": {
          "type": "integer"
        },
        "vs_reference_pct": {
          "type": "number",
          "description": "This price against the reference, in percent; negative is cheaper."
        },
        "assessment": {
          "type": "string",
          "enum": [
            "under",
            "at",
            "over"
          ],
          "description": "±15% band around the reference."
        },
        "own_asks": {
          "type": "object",
          "properties": {
            "listings": {
              "type": "integer"
            },
            "suppliers": {
              "type": "integer"
            },
            "lowest": {
              "type": "integer"
            },
            "median": {
              "type": "integer"
            },
            "highest": {
              "type": "integer"
            }
          }
        },
        "ask_history": {
          "type": [
            "object",
            "null"
          ],
          "properties": {
            "first_seen_at": {
              "type": "string",
              "format": "date-time"
            },
            "days_observed": {
              "type": "integer"
            },
            "first_credits": {
              "type": "integer"
            },
            "change_pct": {
              "type": "number"
            }
          }
        }
      }
    },
    "PlacementScore": {
      "type": [
        "object",
        "null"
      ],
      "description": "Placement Score v1: { score 0-100, version, confidence high|medium|low, components each 0-100 or null, capped }. Weights (authority 25 / visibility 25 / quality 30 / graph 10 / survival 10) are stated, not fitted; unmeasured components drop out and the rest re-weight; a suspect publisher never scores above 40. Derived from the fields beside it, so it can be checked. Does NOT include observed effectiveness, relevance to your brief, or supplier reliability. Quote the components, not just the number.",
      "properties": {
        "score": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100
        },
        "version": {
          "type": "string"
        },
        "confidence": {
          "type": "string",
          "enum": [
            "high",
            "medium",
            "low"
          ],
          "description": "Share of the weight that had a measurement behind it."
        },
        "components": {
          "type": "object",
          "properties": {
            "authority": {
              "type": [
                "number",
                "null"
              ]
            },
            "visibility": {
              "type": [
                "number",
                "null"
              ]
            },
            "quality": {
              "type": [
                "number",
                "null"
              ]
            },
            "graph": {
              "type": [
                "number",
                "null"
              ]
            },
            "survival": {
              "type": [
                "number",
                "null"
              ]
            }
          }
        },
        "capped": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "suspect",
            null
          ]
        }
      }
    },
    "PlacementType": {
      "type": "string",
      "enum": [
        "guest_post",
        "niche_edit",
        "link_insert",
        "homepage_link",
        "media_placement"
      ]
    },
    "QualityReasons": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Which rules made verification read suspect: high_authority_no_traffic, high_authority_no_keywords, spam_score, subdomain_without_own_footprint, saturated_outbound. Empty when not suspect."
    },
    "Restricted": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "gambling / adult / piracy when the site is one, from the domain name and a short topic list. Such rows appear only when asked for (include_restricted, or a topic/accepts naming the vertical)."
    },
    "SiteListing": {
      "type": "object",
      "properties": {
        "offer_id": {
          "type": "string"
        },
        "supplier": {
          "type": "string",
          "description": "A per-response ordinal (A, B, C…) so you can see that listings come from different suppliers, without identifying them."
        },
        "placement_type": {
          "$ref": "#/$defs/PlacementType"
        },
        "price": {
          "type": "object",
          "properties": {
            "credits": {
              "type": [
                "integer",
                "null"
              ]
            },
            "usd_minor": {
              "type": [
                "integer",
                "null"
              ]
            },
            "currency": {
              "type": "string",
              "const": "USD"
            }
          }
        },
        "comparable": {
          "type": "boolean",
          "description": "False when the listing has no USD-normalised price."
        },
        "market_reference": {
          "$ref": "#/$defs/MarketReference"
        },
        "observed_at": {
          "type": "string"
        },
        "age_hours": {
          "type": "number"
        },
        "stale": {
          "type": "boolean"
        },
        "stale_after_hours": {
          "type": "integer"
        }
      }
    },
    "Survival": {
      "type": [
        "object",
        "null"
      ],
      "description": "What happened to the placements WE bought on this publisher. Our crawler re-checks every delivered link at 0/7/30/60/90/180/365 days. Null under three orders.",
      "properties": {
        "orders": {
          "type": "integer"
        },
        "checks": {
          "type": "integer"
        },
        "live_share": {
          "type": "number"
        },
        "live_90d_share": {
          "type": [
            "number",
            "null"
          ]
        },
        "median_days_to_missing": {
          "type": [
            "number",
            "null"
          ]
        },
        "dofollow_share": {
          "type": [
            "number",
            "null"
          ]
        },
        "noindex_share": {
          "type": [
            "number",
            "null"
          ]
        },
        "updated_at": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "Verification": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "ok",
        "suspect",
        "unverified",
        null
      ],
      "description": "Our independent verdict on the claimed authority; no supplier publishes it. 'suspect' = high link authority with little or no organic search presence, which is what a link farm looks like — do not plan around suspect domains. 'ok' = measured, and search presence matches the rating. 'unverified' = not measured yet, which is not a pass."
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/placementapi-com-site"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.