POSTlive

Notify the court of a signed evidence export

Requires the evidence_exporter bearer role and all seven exporter Ed25519 transport-signing headers. This signed mutation does not use Idempotency-Key; it deduplicates by the signed exporter and event identity. When the exporter has an enrolled A-Comm artifact-attestation policy, the receiver also verifies required inline artifact attestations natively and persists the exact verification proof. Transport and artifact keys are separate trust domains.

/api/v2/evidence-exports/notificationsnotifyEvidenceExportV2

Authentication and authority

Send one of the allowed bearer credential roles. Alternatives are OR; credentials named within one alternative are AND.

evidenceExporterBearer

Credential bound to one evidence_exporter resource.

Parameters

NameLocationRequirementSchema
content-digest

SHA-256 of the exact request bytes, formatted as an RFC 9530-style binary content digest. It is the final line of the canonical signature input.

headerRequired{"type":"string","pattern":"^sha-256=:[A-Za-z0-9+/]{43}=:$"}
x-pc-event-id

Stable signed event identity used for deduplication.

headerRequired{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,160}$"}
x-pc-event-timestamp

Canonical UTC ISO 8601 instant (the value must equal new Date(value).toISOString()).

headerRequired{"type":"string","format":"date-time","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"}
x-pc-key-id

Identifier of the Ed25519 verification key.

headerRequired{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,160}$"}
x-pc-schema-version

Signed body schema version; must equal the body schemaVersion.

headerRequired{"type":"string","const":"evidence-export-notification-v1"}
x-pc-signature-version

Signature protocol version. It is validated as a constant; the canonical input is version-defined and does not include this header or the signature itself.

headerRequired{"type":"string","const":"pc-webhook-ed25519-v1"}
x-pc-signature

Ed25519 signature over the documented canonical input.

headerRequired{"type":"string","pattern":"^ed25519=:[A-Za-z0-9+/]{86}==:$"}

Request body

Required request body.

application/json

{
  "$ref": "#/components/schemas/EvidenceExportNotification",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schemaVersion",
    "eventId",
    "eventType",
    "occurredAt",
    "exporterId",
    "specVersion",
    "exportId",
    "exportVersion",
    "bundleHash",
    "contentType",
    "byteLength",
    "downloadUrl",
    "downloadExpiresAt",
    "match"
  ],
  "properties": {
    "schemaVersion": {
      "type": "string",
      "const": "evidence-export-notification-v1"
    },
    "eventId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,160}$"
    },
    "eventType": {
      "type": "string",
      "const": "evidence.bundle.available"
    },
    "occurredAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
    },
    "exporterId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    },
    "specVersion": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    },
    "exportId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    },
    "exportVersion": {
      "type": "integer",
      "minimum": 1
    },
    "supersedes": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "exportId",
        "exportVersion",
        "sha256"
      ],
      "properties": {
        "exportId": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        },
        "exportVersion": {
          "type": "integer",
          "minimum": 1
        },
        "sha256": {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        }
      }
    },
    "bundleHash": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "algorithm",
        "value"
      ],
      "properties": {
        "algorithm": {
          "type": "string",
          "const": "sha256"
        },
        "value": {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        }
      }
    },
    "contentType": {
      "type": "string",
      "const": "application/json"
    },
    "byteLength": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10485760
    },
    "downloadUrl": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048,
      "pattern": "^https://(?![^/?#]*@)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)*[A-Za-z](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?::(?:0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(?:[/?][^#\\s]*)?$",
      "description": "HTTPS URL with a conventional DNS hostname whose final label begins with an ASCII letter, an optional canonical decimal port from 0 through 65535, and no user information or fragment. IP literals and other WHATWG normalization forms are intentionally outside this conservative published schema; runtime URL parsing remains authoritative."
    },
    "downloadExpiresAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
    },
    "match": {
      "type": "object",
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "externalCaseId": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        },
        "transactionId": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        },
        "merchantId": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        },
        "network": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        },
        "transactionHash": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        }
      }
    },
    "retention": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "profileId": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{1,200}$"
        },
        "sourceRetentionUntil": {
          "type": "string",
          "format": "date-time",
          "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
        },
        "sourceLegalHoldActive": {
          "type": "boolean"
        }
      }
    }
  }
}

Responses

200

Duplicate event; the original receipt facts are returned with duplicate status.

application/json

{
  "$ref": "#/components/schemas/EvidenceIngestReceiptEnvelope",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "requestId"
  ],
  "properties": {
    "data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "receipt"
      ],
      "properties": {
        "receipt": {
          "$ref": "#/components/schemas/EvidenceIngestReceipt",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "schemaVersion",
            "id",
            "partnerId",
            "exporterId",
            "eventId",
            "exportId",
            "exportVersion",
            "bundleHash",
            "status",
            "receivedAt",
            "verificationStatus"
          ],
          "properties": {
            "schemaVersion": {
              "type": "string",
              "const": "evidence-ingest-receipt-v1"
            },
            "id": {
              "type": "string"
            },
            "partnerId": {
              "type": "string"
            },
            "exporterId": {
              "type": "string"
            },
            "eventId": {
              "type": "string"
            },
            "exportId": {
              "type": "string"
            },
            "exportVersion": {
              "type": "integer",
              "minimum": 1
            },
            "bundleHash": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            },
            "status": {
              "type": "string",
              "enum": [
                "accepted",
                "quarantined",
                "rejected",
                "duplicate"
              ]
            },
            "receivedAt": {
              "type": "string",
              "format": "date-time"
            },
            "verificationStatus": {
              "type": "string",
              "enum": [
                "passed",
                "passed_with_warnings",
                "failed",
                "not_run"
              ]
            },
            "exportRecordId": {
              "type": "string"
            },
            "detailCode": {
              "type": "string",
              "description": "New bundle validation failures use bundle_parse_failed. Historical receipts may contain invalid_notification; they remain unchanged on reads and replay.",
              "enum": [
                "invalid_notification",
                "unregistered_origin",
                "download_expired",
                "invalid_supersession",
                "retention_profile_unavailable",
                "download_failed",
                "download_origin_blocked",
                "download_redirect_refused",
                "download_oversized",
                "content_type_mismatch",
                "byte_length_mismatch",
                "digest_mismatch",
                "bundle_parse_failed",
                "unsupported_case_match",
                "incomplete_case_match",
                "ambiguous_case_match",
                "attestation_missing",
                "attestation_malformed",
                "attestation_coverage_invalid",
                "attestation_key_unknown",
                "attestation_key_unusable",
                "attestation_digest_mismatch",
                "attestation_context_mismatch",
                "attestation_time_invalid",
                "attestation_signature_invalid"
              ]
            },
            "validationError": {
              "type": "object",
              "additionalProperties": false,
              "description": "Optional parser-authored diagnostic for a bundle validation failure. Field paths refer to the outer evidence-bundle-v1 envelope, with $ denoting its root. Contains no rejected values; absent on historical receipts and unrelated failure types.",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {},
                "message": {}
              }
            },
            "verificationProfile": {
              "type": "string",
              "const": "acomm-attestation-ed25519-v1"
            },
            "attestationsVerified": {
              "type": "integer",
              "minimum": 1
            },
            "attestationTrustBasis": {
              "type": "string",
              "enum": [
                "synthetic_same_channel",
                "authenticated_out_of_band"
              ]
            }
          }
        }
      }
    },
    "requestId": {
      "type": "string"
    }
  }
}
202

New evidence notification processed.

application/json

{
  "$ref": "#/components/schemas/EvidenceIngestReceiptEnvelope",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "requestId"
  ],
  "properties": {
    "data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "receipt"
      ],
      "properties": {
        "receipt": {
          "$ref": "#/components/schemas/EvidenceIngestReceipt",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "schemaVersion",
            "id",
            "partnerId",
            "exporterId",
            "eventId",
            "exportId",
            "exportVersion",
            "bundleHash",
            "status",
            "receivedAt",
            "verificationStatus"
          ],
          "properties": {
            "schemaVersion": {
              "type": "string",
              "const": "evidence-ingest-receipt-v1"
            },
            "id": {
              "type": "string"
            },
            "partnerId": {
              "type": "string"
            },
            "exporterId": {
              "type": "string"
            },
            "eventId": {
              "type": "string"
            },
            "exportId": {
              "type": "string"
            },
            "exportVersion": {
              "type": "integer",
              "minimum": 1
            },
            "bundleHash": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            },
            "status": {
              "type": "string",
              "enum": [
                "accepted",
                "quarantined",
                "rejected",
                "duplicate"
              ]
            },
            "receivedAt": {
              "type": "string",
              "format": "date-time"
            },
            "verificationStatus": {
              "type": "string",
              "enum": [
                "passed",
                "passed_with_warnings",
                "failed",
                "not_run"
              ]
            },
            "exportRecordId": {
              "type": "string"
            },
            "detailCode": {
              "type": "string",
              "description": "New bundle validation failures use bundle_parse_failed. Historical receipts may contain invalid_notification; they remain unchanged on reads and replay.",
              "enum": [
                "invalid_notification",
                "unregistered_origin",
                "download_expired",
                "invalid_supersession",
                "retention_profile_unavailable",
                "download_failed",
                "download_origin_blocked",
                "download_redirect_refused",
                "download_oversized",
                "content_type_mismatch",
                "byte_length_mismatch",
                "digest_mismatch",
                "bundle_parse_failed",
                "unsupported_case_match",
                "incomplete_case_match",
                "ambiguous_case_match",
                "attestation_missing",
                "attestation_malformed",
                "attestation_coverage_invalid",
                "attestation_key_unknown",
                "attestation_key_unusable",
                "attestation_digest_mismatch",
                "attestation_context_mismatch",
                "attestation_time_invalid",
                "attestation_signature_invalid"
              ]
            },
            "validationError": {
              "type": "object",
              "additionalProperties": false,
              "description": "Optional parser-authored diagnostic for a bundle validation failure. Field paths refer to the outer evidence-bundle-v1 envelope, with $ denoting its root. Contains no rejected values; absent on historical receipts and unrelated failure types.",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {},
                "message": {}
              }
            },
            "verificationProfile": {
              "type": "string",
              "const": "acomm-attestation-ed25519-v1"
            },
            "attestationsVerified": {
              "type": "integer",
              "minimum": 1
            },
            "attestationTrustBasis": {
              "type": "string",
              "enum": [
                "synthetic_same_channel",
                "authenticated_out_of_band"
              ]
            }
          }
        }
      }
    },
    "requestId": {
      "type": "string"
    }
  }
}
409

The event/export identity conflicted, or the authenticated exporter attestation policy changed during ingest. No receipt, export record, or blob is committed on a policy-fence conflict.

application/problem+json

{
  "$ref": "#/components/schemas/Problem",
  "type": "object",
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail",
    "requestId"
  ],
  "properties": {
    "type": {
      "type": "string",
      "format": "uri"
    },
    "title": {
      "type": "string"
    },
    "status": {
      "type": "integer"
    },
    "code": {
      "type": "string"
    },
    "detail": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  }
}
default

Request rejected. Pre-ingest authentication or authorization failures return no evidence receipt or export record.

application/problem+json

{
  "$ref": "#/components/schemas/Problem",
  "type": "object",
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail",
    "requestId"
  ],
  "properties": {
    "type": {
      "type": "string",
      "format": "uri"
    },
    "title": {
      "type": "string"
    },
    "status": {
      "type": "integer"
    },
    "code": {
      "type": "string"
    },
    "detail": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  }
}

Example response

Successful response

{
  "data": {
    "receipt": {
      "schemaVersion": "evidence-ingest-receipt-v1",
      "id": "id_test",
      "partnerId": "partner_test_123",
      "exporterId": "exporterId_test",
      "eventId": "event_test_123",
      "exportId": "exportId_test",
      "exportVersion": 1,
      "bundleHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "status": "accepted",
      "receivedAt": "2026-08-09T12:00:00.000Z",
      "verificationStatus": "passed"
    }
  },
  "requestId": "requestId_test"
}

Usage notes

  • Responses reflect the current authoritative resource state.
  • The request is accepted only when its credential, authority, case state, and resource preconditions are satisfied.