Skip to content

Claims and evidence

The Gateway does not store products. It stores claims — a subject, a predicate and an object — and the evidence each claim rests on. What you receive as data is a projection of those claims, assembled for convenience.

{
"status": "found",
"data": { "gtin": "04012345678901", "brand_name": "Example" },
"claims": [
{
"subject": "gtin14:04012345678901",
"predicate": "brand_name",
"object": "Example",
"claim_type": "ASSERTION",
"trust_level": "L3",
"source_ref": "",
"evidence_refs": [""]
}
],
"sources": [{ "id": "", "kind": "publisher_endpoint", "licence_name": "" }]
}
Type Means
FACT Directly observed in a document.
SOURCE A statement about a source itself.
ASSERTION Stated by an identified party.
VALIDATION The outcome of a rule evaluated against a subject.
INFERENCE Derived from other claims.
ESTIMATION Approximated where no direct value exists.
UNKNOWN Recorded absence of a determination.

INFERENCE and ESTIMATION cannot be stored without a method — the database rejects them otherwise. A derived number that cannot say how it was derived is not something this service will serve.

FACT and ASSERTION claims cannot exist without at least one evidence row. This is a database constraint, not a convention in the ingestion code, so it holds regardless of which path wrote the claim.

INFERENCE, ESTIMATION and UNKNOWN are exempt: their backing is the method and the claims they were derived from, not a document.

claims and sources are populated by get_dpp only, on both the REST and MCP surfaces. Every other operation returns them as empty arrays.

An empty claims array therefore does not mean “no evidence exists for this answer” — it means that operation does not project it yet. Do not build a confidence signal on the array’s length.

The per-claim confidence field is likewise never emitted: scoring needs a method that has not been decided, and shipping a placeholder number would be worse than shipping nothing.