---
title: "Audit the provenance of a published URL"
method: GET
path: "/org/content/provenance"
tags: ["Content"]
---

# Audit the provenance of a published URL

`GET /org/content/provenance`

## Request

- Base URL: `https://apiv2.senso.ai/api/v1`
- URL: `https://apiv2.senso.ai/api/v1/org/content/provenance`
- Auth: API key in header `X-API-Key`

Returns a five-stage provenance audit for one published URL: `ingestion` (how the Knowledge Base sources behind the content entered the system), `source` (the exact retrieved chunks and formatted model context, hash-validated), `creation` (the accepted AI generation attempt, hash-validated), `editing` (the Builder workspace version history), and `publication` (every destination record for the published content version, with the publishing actor when one can be attributed). Each stage reports what can be proven from stored evidence and what evidence is missing, and the audit never guesses: absent or ambiguous evidence is reported as such rather than filled in. The URL must match a live publish record's recorded URL exactly (byte-for-byte after trimming surrounding whitespace); when several live records share the URL, the one with the most recent publish/attempt time is audited. Requires the GEO product.

## Query parameters

- `published_url` string, required

## Response `200`

The provenance audit for the resolved published content version.

- ContentProvenanceAuditResponse: A five-stage provenance audit for one published URL. Every stage carries a `status` (how completely stored evidence covers it), an `applicability` (whether the stage is expected for this content's creation path), plain-language `what_can_be_proven` and `missing_evidence` lists, and an `assessment` explaining the classification when one applies.
  - `published_url` string, required: The audited URL, echoed back (trimmed of surrounding whitespace).
  - `content_id` string, uuid, required: The content item the URL resolved to.
  - `content_version_id` string, uuid, required: The exact published content version the URL resolved to.
  - `creation_origin` 'builder_ai_generation' | 'builder_manual' | 'content_engine_ai_generation' | 'manual' | 'api_import' | 'legacy_unknown' | 'unknown': The recorded path that produced the content version. `builder_ai_generation` — AI-generated in Builder; `builder_manual` — manually authored in Builder; `content_engine_ai_generation` — AI-generated by the content engine; `manual` — manually authored outside Builder; `api_import` — imported through the API; `legacy_unknown` — predates origin tracking; `unknown` — the path was not recorded.
  - `overall_status` 'complete' | 'partial' | 'missing', required: The audit's rollup across the applicable stages: `complete` when every applicable stage is complete and no stage's applicability is unknown (also when no stage is applicable); `missing` when every applicable stage is missing; `partial` otherwise.
  - `stages` ContentProvenanceStages, required: The five audit stages, in creation order.
    - `ingestion` ContentProvenanceIngestionStage, required: How the Knowledge Base sources retrieved for the generation entered the system: their recorded ingestion runs, statuses, timestamps, and actor attribution.
      - `status` 'complete' | 'partial' | 'missing', required: How completely stored evidence covers the stage. `complete` — every expected piece of evidence exists and hash-validates; `partial` — some evidence exists but at least one piece is missing, ambiguous, or fails validation (the stage's `missing_evidence` says exactly what); `missing` — no evidence exists for the stage. A stage marked `not_applicable` reports `complete`.
      - `applicability` 'applicable' | 'not_applicable' | 'unknown', required: Whether the stage is expected to have evidence for this content. `applicable` — the stage is part of this content's creation path; `not_applicable` — the stage does not apply (for example, no AI generation stage for manually authored content), so its `status` is `complete` by definition; `unknown` — the recorded creation path is insufficient to determine whether the stage should have evidence, so its `status` is reported as `partial`.
      - `assessment` ContentProvenanceStageAssessment: Why the stage carries its applicability and status, when the audit reached a classification worth explaining (typically for `not_applicable` or `unknown` stages, or when expected evidence is missing).
        - `code` string, required: A stable machine-readable classification (e.g. `ai_generation_not_applicable`, `generation_receipt_expected_but_missing`, `source_retrieval_not_requested`, `builder_lineage_not_applicable`, `creation_origin_unknown`, `legacy_evidence_unavailable`).
        - `creation_origin` 'builder_ai_generation' | 'builder_manual' | 'content_engine_ai_generation' | 'manual' | 'api_import' | 'legacy_unknown' | 'unknown': The recorded path that produced the content version. `builder_ai_generation` — AI-generated in Builder; `builder_manual` — manually authored in Builder; `content_engine_ai_generation` — AI-generated by the content engine; `manual` — manually authored outside Builder; `api_import` — imported through the API; `legacy_unknown` — predates origin tracking; `unknown` — the path was not recorded.
        - `message` string, required: A human-readable explanation of the classification.
      - `source_link_basis` string, required: How the retrieved source versions were linked to this content: `generation_receipt` — from the chunks recorded on the accepted generation receipt; `builder_workspace_message_sources_legacy` — from legacy document-level Builder message sources (weaker: does not prove the exact generation context); `missing` — no link basis exists; `not_applicable` — the stage does not apply.
      - `summary` ContentProvenanceIngestionSummary, required: Aggregate counts over the retrieved source versions and their ingestion evidence.
        - `retrieved_source_version_count` integer, required: How many distinct source content versions the generation retrieved.
        - `source_versions_with_ingestion_run` integer, required: How many of those versions have a recorded ingestion run.
        - `completed_ingestion_run_count` integer, required: How many of those versions have an ingestion run recorded as `complete`.
        - `persisted_chunk_count` integer, required: Total currently persisted chunks across the retrieved source versions.
        - `actor_type_counts` object, required: Source-version counts keyed by the recorded ingestion actor kind (`user`, `api_key`, `system`, `scheduled_job`); sources with no recorded actor are counted under `unattributed`.
        - `human_attributed_source_count` integer, required: Sources whose ingestion is attributed to a specific user.
        - `system_api_or_unattributed_source_count` integer, required: Sources without a specific user attribution.
        - `api_key_attributed_source_count` integer, required: Sources whose original document creation is attributed to a specific API key.
        - `distinct_original_api_key_count` integer, required: How many distinct API keys appear in `source_count_by_api_key`.
        - `source_count_by_api_key` ContentProvenanceAPIKeySourceCount[], required
          - `api_key_id` string, uuid, required
          - `name` string, required
          - `source_count` integer, required
      - `sources` ContentProvenanceIngestionSource[], required: Per-source ingestion evidence, one entry per resolvable retrieved source version.
        - `content_id` string, uuid, required
        - `content_version_id` string, uuid, required
        - `content_version_num` integer, required
        - `content_version_title` string, required
        - `content_version_created_at` string, date-time, required
        - `ingestion_run_id` string, uuid: The recorded ingestion run for this version, when one exists.
        - `ingestion_status` string: The ingestion run's recorded status (e.g. `complete`).
        - `source_strategy_id` string: The extraction strategy the ingestion run used.
        - `actor_type` string: The kind of actor recorded on the ingestion run (`user`, `api_key`, `system`, or `scheduled_job`); absent when no actor was recorded.
        - `ingestion_created_at` string, date-time
        - `ingestion_updated_at` string, date-time
        - `ingestion_completed_at` string, date-time
        - `persisted_chunk_count` integer, required: Chunks currently persisted for this version.
        - `original_api_key_candidate_count` integer, required: How many distinct API keys are recorded as candidate creators of the original document. Attribution is reported in `original_api_key` only when this is exactly 1.
        - `actor_user` ContentProvenanceActorUser: The user attributed to the action, resolved from stored evidence.
          - `user_id` string, uuid, required
          - `display_name` string, required: The user's given and family name; falls back to the email address, and may be empty when neither is recorded.
          - `email` string
        - `original_api_key` ContentProvenanceOriginalAPIKey: The organization API key that created the original Knowledge Base document behind a retrieved source. Attribution is reported only when exactly one candidate key is recorded as the document's creator — an ambiguous attribution is never guessed (the stage's `missing_evidence` reports the ambiguity instead).
          - `id` string, uuid, required
          - `organization_id` string, uuid, required
          - `name` string, required
          - `created_at` string, date-time, required
          - `updated_at` string, date-time, required
          - `expires_at` string, date-time, nullable, required
          - `revoked_at` string, date-time, nullable, required
          - `last_used_at` string, date-time, nullable, required
          - `attribution_scope` string, required: What the key is attributed with — `original_content_creation`: the key created the original document, which does not attribute later versions or ingestion runs to it.
          - `attribution_basis` string, required: An identifier for the stored evidence chain the attribution was resolved from.
      - `what_can_be_proven` string[], required
      - `missing_evidence` string[], required
    - `source` ContentProvenanceSourceStage, required: The exact source material supplied to the generation: the stored retrieval chunks and the formatted model context, validated against the receipt's SHA-256 hashes.
      - `status` 'complete' | 'partial' | 'missing', required: How completely stored evidence covers the stage. `complete` — every expected piece of evidence exists and hash-validates; `partial` — some evidence exists but at least one piece is missing, ambiguous, or fails validation (the stage's `missing_evidence` says exactly what); `missing` — no evidence exists for the stage. A stage marked `not_applicable` reports `complete`.
      - `applicability` 'applicable' | 'not_applicable' | 'unknown', required: Whether the stage is expected to have evidence for this content. `applicable` — the stage is part of this content's creation path; `not_applicable` — the stage does not apply (for example, no AI generation stage for manually authored content), so its `status` is `complete` by definition; `unknown` — the recorded creation path is insufficient to determine whether the stage should have evidence, so its `status` is reported as `partial`.
      - `assessment` ContentProvenanceStageAssessment: Why the stage carries its applicability and status, when the audit reached a classification worth explaining (typically for `not_applicable` or `unknown` stages, or when expected evidence is missing).
        - `code` string, required: A stable machine-readable classification (e.g. `ai_generation_not_applicable`, `generation_receipt_expected_but_missing`, `source_retrieval_not_requested`, `builder_lineage_not_applicable`, `creation_origin_unknown`, `legacy_evidence_unavailable`).
        - `creation_origin` 'builder_ai_generation' | 'builder_manual' | 'content_engine_ai_generation' | 'manual' | 'api_import' | 'legacy_unknown' | 'unknown': The recorded path that produced the content version. `builder_ai_generation` — AI-generated in Builder; `builder_manual` — manually authored in Builder; `content_engine_ai_generation` — AI-generated by the content engine; `manual` — manually authored outside Builder; `api_import` — imported through the API; `legacy_unknown` — predates origin tracking; `unknown` — the path was not recorded.
        - `message` string, required: A human-readable explanation of the classification.
      - `receipt_id` string, uuid: The accepted generation receipt the evidence comes from; absent when no receipt exists.
      - `source_retrieval_status` string: The receipt's recorded retrieval outcome — `not_requested`, `completed`, or `failed`; absent when no receipt exists.
      - `source_retrievals` unknown, required
      - `formatted_context` string, required: The exact formatted context string handed to the model; empty when no receipt exists.
      - `formatted_context_sha256` string: The receipt's SHA-256 of the formatted context; absent when no receipt exists.
      - `what_can_be_proven` string[], required
      - `missing_evidence` string[], required
    - `creation` ContentProvenanceCreationStage, required: The accepted AI generation attempt: who or what triggered it, the model used, the captured request, and hash validation of the request and generated output against the stored target version. Fields sourced from the receipt are absent when no accepted receipt exists.
      - `status` 'complete' | 'partial' | 'missing', required: How completely stored evidence covers the stage. `complete` — every expected piece of evidence exists and hash-validates; `partial` — some evidence exists but at least one piece is missing, ambiguous, or fails validation (the stage's `missing_evidence` says exactly what); `missing` — no evidence exists for the stage. A stage marked `not_applicable` reports `complete`.
      - `applicability` 'applicable' | 'not_applicable' | 'unknown', required: Whether the stage is expected to have evidence for this content. `applicable` — the stage is part of this content's creation path; `not_applicable` — the stage does not apply (for example, no AI generation stage for manually authored content), so its `status` is `complete` by definition; `unknown` — the recorded creation path is insufficient to determine whether the stage should have evidence, so its `status` is reported as `partial`.
      - `assessment` ContentProvenanceStageAssessment: Why the stage carries its applicability and status, when the audit reached a classification worth explaining (typically for `not_applicable` or `unknown` stages, or when expected evidence is missing).
        - `code` string, required: A stable machine-readable classification (e.g. `ai_generation_not_applicable`, `generation_receipt_expected_but_missing`, `source_retrieval_not_requested`, `builder_lineage_not_applicable`, `creation_origin_unknown`, `legacy_evidence_unavailable`).
        - `creation_origin` 'builder_ai_generation' | 'builder_manual' | 'content_engine_ai_generation' | 'manual' | 'api_import' | 'legacy_unknown' | 'unknown': The recorded path that produced the content version. `builder_ai_generation` — AI-generated in Builder; `builder_manual` — manually authored in Builder; `content_engine_ai_generation` — AI-generated by the content engine; `manual` — manually authored outside Builder; `api_import` — imported through the API; `legacy_unknown` — predates origin tracking; `unknown` — the path was not recorded.
        - `message` string, required: A human-readable explanation of the classification.
      - `receipt_id` string, uuid
      - `actor_user_id` string, uuid: The user who triggered the generation, when one is recorded.
      - `actor_type` string: The kind of actor that triggered the generation (`user`, `api`, `scheduled`, or `system`).
      - `trigger_source` string: The flow that recorded the accepted generation (e.g. `org_content_generation`, `ad_hoc_content_generation`, `builder_v2_draft_document`).
      - `accepted_attempt_number` integer: Which generation attempt was accepted (1-based).
      - `model_provider` string
      - `model_name` string
      - `generation_request` unknown, required
      - `generation_request_sha256` string: The receipt's SHA-256 of the canonicalized request payload.
      - `generated_output_sha256` string: The receipt's SHA-256 of the generated output.
      - `generated_workspace_version_id` string, uuid: The Builder workspace version the generation produced, when it targeted a workspace.
      - `generated_content_version_id` string, uuid: The content version the generation produced, when it targeted content directly.
      - `started_at` string, date-time
      - `completed_at` string, date-time
      - `what_can_be_proven` string[], required
      - `missing_evidence` string[], required
    - `editing` ContentProvenanceEditingStage, required: The Builder workspace lineage linking the published content version to its exact editing history.
      - `status` 'complete' | 'partial' | 'missing', required: How completely stored evidence covers the stage. `complete` — every expected piece of evidence exists and hash-validates; `partial` — some evidence exists but at least one piece is missing, ambiguous, or fails validation (the stage's `missing_evidence` says exactly what); `missing` — no evidence exists for the stage. A stage marked `not_applicable` reports `complete`.
      - `applicability` 'applicable' | 'not_applicable' | 'unknown', required: Whether the stage is expected to have evidence for this content. `applicable` — the stage is part of this content's creation path; `not_applicable` — the stage does not apply (for example, no AI generation stage for manually authored content), so its `status` is `complete` by definition; `unknown` — the recorded creation path is insufficient to determine whether the stage should have evidence, so its `status` is reported as `partial`.
      - `assessment` ContentProvenanceStageAssessment: Why the stage carries its applicability and status, when the audit reached a classification worth explaining (typically for `not_applicable` or `unknown` stages, or when expected evidence is missing).
        - `code` string, required: A stable machine-readable classification (e.g. `ai_generation_not_applicable`, `generation_receipt_expected_but_missing`, `source_retrieval_not_requested`, `builder_lineage_not_applicable`, `creation_origin_unknown`, `legacy_evidence_unavailable`).
        - `creation_origin` 'builder_ai_generation' | 'builder_manual' | 'content_engine_ai_generation' | 'manual' | 'api_import' | 'legacy_unknown' | 'unknown': The recorded path that produced the content version. `builder_ai_generation` — AI-generated in Builder; `builder_manual` — manually authored in Builder; `content_engine_ai_generation` — AI-generated by the content engine; `manual` — manually authored outside Builder; `api_import` — imported through the API; `legacy_unknown` — predates origin tracking; `unknown` — the path was not recorded.
        - `message` string, required: A human-readable explanation of the classification.
      - `workspace_id` string, uuid: The Builder workspace the published version came from, when one is linked.
      - `published_from_workspace_version_id` string, uuid: The exact workspace version saved as the published content version, when recorded.
      - `saved_as_content_version_id` string, uuid, required: The published content version the editing history resolves to.
      - `versions` ContentProvenanceEditingVersion[], required: The workspace version history across the content's lineage, ordered by sequence within each workspace (versions of different workspaces interleave by creation time).
        - `workspace_version_id` string, uuid, required
        - `parent_workspace_version_id` string, uuid
        - `source_content_version_id` string, uuid: The content version this workspace version was loaded from, when it started from saved content.
        - `source` string, required: What produced the workspace version (e.g. `initial`, `manual_autosave`, `ai_draft`, `ai_refine`, `rollback`).
        - `created_by_user_id` string, uuid
        - `created_at` string, date-time, required
        - `markdown_sha256` string, required: SHA-256 of the workspace version's stored markdown.
      - `what_can_be_proven` string[], required
      - `missing_evidence` string[], required
    - `publication` ContentProvenancePublicationStage, required: Every destination record tied to the published content version, and the human publishing actor when a matching published status-change audit event exists (an actor is never guessed).
      - `status` 'complete' | 'partial' | 'missing', required: How completely stored evidence covers the stage. `complete` — every expected piece of evidence exists and hash-validates; `partial` — some evidence exists but at least one piece is missing, ambiguous, or fails validation (the stage's `missing_evidence` says exactly what); `missing` — no evidence exists for the stage. A stage marked `not_applicable` reports `complete`.
      - `applicability` 'applicable' | 'not_applicable' | 'unknown', required: Whether the stage is expected to have evidence for this content. `applicable` — the stage is part of this content's creation path; `not_applicable` — the stage does not apply (for example, no AI generation stage for manually authored content), so its `status` is `complete` by definition; `unknown` — the recorded creation path is insufficient to determine whether the stage should have evidence, so its `status` is reported as `partial`.
      - `assessment` ContentProvenanceStageAssessment: Why the stage carries its applicability and status, when the audit reached a classification worth explaining (typically for `not_applicable` or `unknown` stages, or when expected evidence is missing).
        - `code` string, required: A stable machine-readable classification (e.g. `ai_generation_not_applicable`, `generation_receipt_expected_but_missing`, `source_retrieval_not_requested`, `builder_lineage_not_applicable`, `creation_origin_unknown`, `legacy_evidence_unavailable`).
        - `creation_origin` 'builder_ai_generation' | 'builder_manual' | 'content_engine_ai_generation' | 'manual' | 'api_import' | 'legacy_unknown' | 'unknown': The recorded path that produced the content version. `builder_ai_generation` — AI-generated in Builder; `builder_manual` — manually authored in Builder; `content_engine_ai_generation` — AI-generated by the content engine; `manual` — manually authored outside Builder; `api_import` — imported through the API; `legacy_unknown` — predates origin tracking; `unknown` — the path was not recorded.
        - `message` string, required: A human-readable explanation of the classification.
      - `published_content_version_id` string, uuid, required
      - `records` ContentProvenancePublicationEvidence[], required: All destination records for the content version — including the record that resolved the audited URL — ordered by publish/attempt time.
        - `publish_record_id` string, uuid, required
        - `publisher_id` string, uuid
        - `publisher_name` string
        - `publisher_type` string: The destination's publisher kind: `citeables`, or `manual` for content you published yourself and recorded via manual publish.
        - `state` 'pending' | 'publishing' | 'live' | 'failed' | 'unpublishing' | 'unpublished' | 'stale', required: The publish record's state.
        - `external_content_id` string
        - `external_url` string: The recorded published URL, when one exists.
        - `published_at` string, date-time
        - `last_attempt_at` string, date-time
      - `publishing_actor` object, nullable, required: The user attributed with publishing, resolved from the closest published status-change audit event; `null` when no matching event exists.
        - `user_id` string, uuid, required
        - `display_name` string, required: The user's given and family name; falls back to the email address, and may be empty when neither is recorded.
        - `email` string
        - `audit_event_at` string, date-time: When the correlated audit event was recorded.
        - `attribution_basis` string, required: An identifier for the stored evidence the attribution was resolved from.
      - `what_can_be_proven` string[], required
      - `missing_evidence` string[], required

## Other responses

- `400`: The request was malformed — a bad path/query parameter or an invalid value.
- `401`: Missing or invalid credentials — supply a valid org API key in the `X-API-Key` header.
- `403`: The API key is authenticated but not permitted to access this resource.
- `404`: The requested resource does not exist or is not visible to this key.

---

[API](https://skmtc.dev/senso/apis/senso-org-api.md) - [All operations](https://skmtc.dev/senso/apis/senso-org-api/llms.txt) - [OpenAPI document](https://skmtc.dev/senso/apis/senso-org-api/revisions/d789b4fcbe84?raw)
