Enforcing an Ecosystem as a Verifier
This page explains how to enforce ecosystem constraints — such as those required by EUDI — during verification. Once an ecosystem is enforced, Procivis One automatically validates each proof request and its results against that ecosystem's requirements, and rejects anything that does not comply.
For an overview of how ecosystems operate, see Ecosystem Enforcement Overview.
Prerequisites
The verifying organization must have an ecosystem enabled. See Enabling Ecosystems for instructions.
Enforcing an ecosystem
To enforce an ecosystem on any given verification, use ecosystem during
creation of a proof request.
POST /api/proof-request/v1
{
{{...}}
"ecosystem": "EUDI"
}
A successful call returns 201. Naming an ecosystem makes it binding:
every credential presented against this proof request must resolve as
TRUSTED under that ecosystem for the proof request to reach ACCEPTED.
If the proof request itself cannot be created due to an ecosystem
constraint — for example, EUDI is the ecosystem and you attempt to create
the request with a DID instead of a certificate — the call returns 400
instead, with an ecosystem validation error message.
Omitting ecosystem
If you omit ecosystem from a proof request, the system runs
auto-detection, instead checking every presented credential against every
ecosystem available to your organization. In this mode, failure to validate
against an ecosystem does not block acceptance. The proof request can
still reach ACCEPTED regardless of what those checks find; see
Checking the outcome below for how to read the
results either way.
Checking the outcome
After creating the proof request, call the share endpoint and offer it to
a wallet, then poll GET /api/proof-request/v1/{id} to see what happens.
See Creating a Proof Request and Sharing a Proof Request for more on the issuance flow, and Proof States as a Verifier for the full state reference.
When the presentation is trusted
If the proof request reaches ACCEPTED, and you named an ecosystem, its
checks passed. A result of TRUSTED requires two things: the proof is
internally consistent, and every credential input resolves to the same
ecosystem.
If the proof request reaches ERROR instead, that could be because a
named ecosystem's checks failed, or for a reason unrelated to ecosystems
entirely.
Reading trustInformation
Each presented credential's trustInformation, at
proofInputs[].trustInformation, tells you what was actually found,
whether or not an ecosystem was named:
{
"proofInputs": [
{
{{...}},
"trustInformation": {
"result": "TRUSTED",
"name": "EUDI",
"receivedAt": "2026-09-17T14:19:35.685Z",
"ecosystemErrors": {
"EUDI": { "result": "TRUSTED" },
"OTHER": {
"result": "NOT_TRUSTED",
"error": {
"code": "BR_0486",
"message": "..."
}
}
}
}
}
]
}
ecosystemErrors gives every ecosystem provider that evaluated this
credential and its individual result — most useful when no ecosystem was
named, since a credential can be tried against several providers. result
reflects whichever provider actually validated it and name references
that provider.
Note the naming: entries here use NOT_TRUSTED, while
trustInformation.result itself uses UNTRUSTED,
Why results can be UNKNOWN or UNTRUSTED
Even when every individual credential resolves cleanly, the presentation as a whole can still fail to make sense as trusted:
- Each credential comes back
TRUSTED, but under different ecosystems. - Credentials nominally share an ecosystem type, but resolve to different roots of trust.
There is no single field showing this collective judgment — it is a property of how the individual results relate to each other, which you determine by comparing them.
A single credential's own result can also come back UNKNOWN rather
than TRUSTED or NOT_TRUSTED, if its issuer validly signs a non-PID
credential without their Access Certificate. This is permitted under the
EUDI ARF, but leaves no way to look up validated metadata about that
issuer.
UNTRUSTED at trustInformation.result means the credential was
evaluated against an ecosystem and broke at least one of its constraints.
The error.message explains which constraint was broken.
This resolution is also recorded as an ECOSYSTEMS_RESOLVED history
event on the proof request.
Requiring ecosystem enforcement
Any ecosystem selected for a verifying organization is available for use in verification, but its use is optional. To require every proof request to use an ecosystem, update the verifying organization:
PATCH /api/organisations/v1/{id}
{
"configuration": {
"enforceEcosystemAsVerifier": true
}
}
When this flag is set, every proof request must have an ecosystem assigned.
To force all verifications from this organization to use one and only one
ecosystem, make sure that selectedEcosystems only contains one ecosystem.