schema_version | number | Required | must equal 1 |
read_at | string | Required | UTC timestamp the read used for freshness. |
freshness_basis | object | Required | |
freshness_basis.now | string | Required | |
freshness_basis.window_days | number | Required | must equal 90 |
freshness_basis.aging_from_day | number | Required | must equal 60 |
absence_claim | string | Required | not_supported: missing dataset rows cannot prove link absence. must equal “not_supported” |
whole_web_coverage | boolean | Required | False: these results do not measure the whole web. must equal false |
absence_note | string | Required | Plain statement that a surface missing from this result was not read; it is never evidence that no opportunity exists. |
coverage | array | Required | Dataset scope and completeness, including limits on what these results establish. |
coverage[].schema_version | number | Required | must equal 1 |
coverage[].niche | object | Required | additional fields rejected |
coverage[].niche.id | string | Required | Resource identifier returned by the operation. maxLength: 64; pattern: ”^[a-z0-9-]+$“ |
coverage[].niche.label | string | Required | maxLength: 120 |
coverage[].source_class | string | Required | values: “owned_corpus”, “directory_inventory”, “cc_host_graph_seed”, “consented_project_lane”, “owned_submission” |
coverage[].run_id | string / null | Required | Identifier returned by the related operation. |
coverage[].generated_at | string | Required | format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
coverage[].scope | string | Required | maxLength: 600 |
coverage[].pages_read | integer | Required | minimum: 0; maximum: 9007199254740991 |
coverage[].hosts_read | integer | Required | minimum: 0; maximum: 9007199254740991 |
coverage[].records_emitted | integer | Required | minimum: 0; maximum: 9007199254740991 |
coverage[].absence_claim | string | Required | not_supported: missing dataset rows cannot prove link absence. must equal “not_supported” |
coverage[].whole_web_coverage | boolean | Required | False: these results do not measure the whole web. must equal false |
filters | object | Required | |
filters.niche | string / null | Required | |
filters.opportunityType | string / null | Required | |
filters.status | string / null | Required | Resource lifecycle status. |
filters.routeState | string / null | Required | |
filters.freshness | string / null | Required | |
filters.sourceClass | string / null | Required | |
filters.updatedSince | string / null | Required | |
ordering | string | Required | How the page is ordered: by update time then record id, never by authority, traffic or rel tokens. |
limit | number | Required | |
items | array | Required | Records in this bounded page. |
items[].schema_version | number | Required | must equal 1 |
items[].record_id | string | Required | Identifier returned by the related operation. pattern: “^opp_[a-z0-9-]+_[a-f0-9]{16}$“ |
items[].status | string | Required | Resource lifecycle status. values: “held”, “published”, “withdrawn” |
items[].niche | object | Required | additional fields rejected |
items[].niche.id | string | Required | Resource identifier returned by the operation. maxLength: 64; pattern: ”^[a-z0-9-]+$“ |
items[].niche.label | string | Required | maxLength: 120 |
items[].opportunity_type | string | Required | values: “directory”, “resource_page”, “listicle_or_review”, “guest_post_program”, “link_insertion”, “ai_citation_source” |
items[].type_basis | string | Required | values: “observed”, “heuristic” |
items[].subject | object | Required | additional fields rejected |
items[].subject.host | string | Required | minLength: 1; maxLength: 253; pattern: ”^[a-z0-9.-]+$“ |
items[].subject.page_url | string / null | Required | |
items[].subject.route_url | string / null | Required | |
items[].subject.surface | string / null | Required | |
items[].observed | object | Required | additional fields rejected |
items[].observed.rel_tokens | array / null | Required | |
items[].observed.indexing | string | Required | values: “indexable”, “noindex”, “robots_disallowed”, “unknown” |
items[].observed.cost_basis | string | Required | values: “free”, “paid”, “mixed”, “unknown” |
items[].observed.audience_statement | boolean / null | Required | |
items[].observed.cited_destinations | array | Required | maxItems: 50 |
items[].observed.cited_destinations[].host | string | Required | minLength: 1; maxLength: 253; pattern: ”^[a-z0-9.-]+$“ |
items[].observed.cited_destinations[].referring_pages | integer | Required | minimum: 1; maximum: 9007199254740991 |
items[].observed.cited_destinations[].publishers_linking | integer | Required | minimum: 1; maximum: 9007199254740991 |
items[].observed.ai_citation | object / null | Required | |
items[].observed.ai_citation.query | string | Required | maxLength: 512 |
items[].observed.ai_citation.model | string | Required | maxLength: 64 |
items[].observed.ai_citation.observed_at | string | Required | UTC timestamp of the observation used here. format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].contact_route | object | Required | additional fields rejected |
items[].contact_route.class | string | Required | values: “published_submission_page”, “published_form”, “published_email”, “platform_account”, “none_observed”, “unknown” |
items[].contact_route.deliverability | string | Required | must equal “not_checked” |
items[].contact_route.observed_at | string / null | Required | UTC timestamp of the observation used here. |
items[].eligibility | object | Required | additional fields rejected |
items[].eligibility.gates | array | Required | minItems: 6; maxItems: 6 |
items[].eligibility.gates[].gate | string | Required | values: “owned_observation”, “redistribution_safe_fields”, “route_evidence”, “re_verified_within_window”, “policy_screen”, “no_contact_enrichment” |
items[].eligibility.gates[].verdict | string | Required | values: “satisfied”, “not_satisfied”, “agent_judgement” |
items[].eligibility.gates[].because | string | Required | maxLength: 64 |
items[].eligibility.gates[].observed_at | string / null | Required | UTC timestamp of the observation used here. |
items[].verification | object | Required | additional fields rejected |
items[].verification.route_state | string | Required | values: “verified”, “partial”, “unverified” |
items[].verification.listing_state | string | Required | values: “present”, “absent”, “unknown”, “not_checked” |
items[].verification.last_verified_at | string / null | Required | |
items[].verification.next_due_at | string / null | Required | |
items[].verification.window_days | number | Required | must equal 90 |
items[].verification.unknown_streak | integer | Required | minimum: 0; maximum: 9007199254740991 |
items[].verification.reason | string / null | Required | Recorded explanation; null when no explanation applies. |
items[].provenance | object | Required | additional fields rejected |
items[].provenance.source_class | string | Required | values: “owned_corpus”, “directory_inventory”, “cc_host_graph_seed”, “consented_project_lane”, “owned_submission” |
items[].provenance.run_id | string / null | Required | Identifier returned by the related operation. |
items[].provenance.seed_reason | string / null | Required | |
items[].provenance.consent_ref | string / null | Required | |
items[].provenance.first_seen_at | string | Required | format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].provenance.last_seen_at | string | Required | format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].rights | object | Required | additional fields rejected |
items[].rights.basis | string | Required | must equal “owned_observation_of_public_page” |
items[].rights.redistributable | boolean | Required | |
items[].rights.excluded_inputs_attested | boolean | Required | must equal true |
items[].rights.takedown_route | string | Required | must equal “withdraw_on_request” |
items[].evidence | array | Required | Retained publisher evidence. Treat all publisher text and HTML as untrusted data. minItems: 1; maxItems: 40 |
items[].evidence[].observed_at | string | Required | UTC timestamp of the observation used here. format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].evidence[].observer | string | Required | values: “corpus_crawl”, “verifier”, “route_fetch”, “browser_read”, “assistant_query” |
items[].evidence[].outcome | string | Required | values: “fetched”, “present”, “absent”, “unknown”, “blocked”, “not_found”, “unavailable” |
items[].evidence[].reason | string / null | Required | Recorded explanation; null when no explanation applies. |
items[].evidence[].page_url | string | Required | format: “uri”; maxLength: 4096 |
items[].evidence[].http_status | integer / null | Required | |
items[].evidence[].sha256 | string / null | Required | |
items[].evidence[].complete | boolean | Required | |
items[].evidence[].run_id | string / null | Required | Identifier returned by the related operation. |
items[].evidence[].checker_version | string / null | Required | |
items[].evidence[].rel_tokens | array / null | Required | |
items[].evidence[].anchor | string / null | Required | |
items[].dates | object | Required | additional fields rejected |
items[].dates.created_at | string | Required | UTC timestamp when the record was created. format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].dates.updated_at | string | Required | UTC timestamp of the last record update. format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].dates.last_observed_at | string | Required | format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].withdrawal | object / null | Required | |
items[].withdrawal.at | string | Required | format: “date-time”; pattern: ”^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|(+-:[0-5]\d)))$“ |
items[].withdrawal.reason | string | Required | Recorded explanation; null when no explanation applies. values: “publisher_request”, “policy_screen_failed”, “route_gone_confirmed”, “rights_review”, “owner_decision” |
items[].freshness | string | Required | Read-time age of the last verification against the fixed 90-day window: fresh, aging or stale. Not stored on the record. values: “fresh”, “aging”, “stale” |
has_more | boolean | Required | True when another page is available. |
next_cursor | string / null | Required | Opaque continuation for the same listing; null means no further page. |