{"openapi":"3.0.0","paths":{"/v1/organizations/{id}":{"get":{"description":"Returns the organization identified by `id`. Restricted to members of that organization. Super admins may read any organization.","operationId":"AuthOrganizationController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Organization retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOrganizationDto_Output"}}}},"403":{"description":"Forbidden — caller is not a member of the target organization and is not a super admin","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Get an organization by id","tags":["Organizations"],"x-mcp-name":"get_organization","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"patch":{"description":"Update mutable fields and settings of the **active** organization (the path `id` must match the requesting org). Requires the `settings:update` permission. This endpoint cannot edit a different organization, even with super admin access. `preferredCurrency` is write-once: it can be set while null and re-sent unchanged, but never changed afterwards — sending `null` leaves it untouched.","operationId":"AuthOrganizationController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationDto"}}}},"responses":{"200":{"description":"Organization updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOrganizationDto_Output"}}}},"400":{"description":"Validation error on the request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"403":{"description":"Forbidden — caller targets a different organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"The display currency is already set to another value","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Update an organization","tags":["Organizations"],"x-mcp-name":"update_organization","x-mcp-output-schema":true,"x-mcp-type":"Tool"}},"/v1/legal/documents":{"get":{"operationId":"LegalController_getDocuments_v1","parameters":[{"name":"audience","required":true,"in":"query","description":"Billing identity the documents apply to. Only `company` returns documents: the consumer offer is not open, so `individual` answers with an empty list","schema":{"enum":["company","individual"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalDocumentListDto"}}}}},"summary":"List current legal documents for an audience","tags":["Legal"]}},"/v1/legal/signup-intent":{"post":{"operationId":"LegalController_setSignupIntent_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupIntentDto"}}}},"responses":{"204":{"description":""}},"summary":"Store the legal acceptances of a Google sign-up in a short-lived signed cookie","tags":["Legal"]}},"/v1/legal/me":{"get":{"operationId":"LegalController_me_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalMeDto"}}}}},"summary":"Resolved audience and still-missing required legal documents for the caller","tags":["Legal"]}},"/v1/legal/acceptances":{"post":{"operationId":"LegalController_accept_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalAcceptancesDto"}}}},"responses":{"204":{"description":""}},"summary":"Record the caller acceptance of one or more legal documents","tags":["Legal"]}},"/v1/accounts":{"get":{"description":"List all accounts for the current organization's selected application, returning blockchain addresses, loyalty balances, and pagination metadata.","operationId":"AccountAdminController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["network"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]}},"required":["field","operator","value"],"title":"network"},{"type":"object","properties":{"field":{"type":"string","enum":["address"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"address"},{"type":"object","properties":{"field":{"type":"string","enum":["user.name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"user.name"},{"type":"object","properties":{"field":{"type":"string","enum":["user.email"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"user.email"},{"type":"object","properties":{"field":{"type":"string","enum":["user.phoneNumber"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"user.phoneNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["dpp.passportCount"]},"operator":{"type":"string","enum":["eq","gt","gte","lt","lte"]},"value":{"type":"number"}},"required":["field","operator","value"],"title":"dpp.passportCount"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["network"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]}},"required":["field","operator","value"],"title":"network"},{"type":"object","properties":{"field":{"type":"string","enum":["address"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"address"},{"type":"object","properties":{"field":{"type":"string","enum":["user.name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"user.name"},{"type":"object","properties":{"field":{"type":"string","enum":["user.email"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"user.email"},{"type":"object","properties":{"field":{"type":"string","enum":["user.phoneNumber"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"user.phoneNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["dpp.passportCount"]},"operator":{"type":"string","enum":["eq","gt","gte","lt","lte"]},"value":{"type":"number"}},"required":["field","operator","value"],"title":"dpp.passportCount"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","address","loyalty.optimisticBalance","loyalty.visits","dpp.passportCount","dpp.lastActivityAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of application accounts retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAccountDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List accounts","tags":["Accounts"]}},"/v1/accounts/{id}":{"get":{"description":"Fetch a specific account in the current organization to inspect its blockchain address, owning user, and loyalty configuration.","operationId":"AccountAdminController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the account","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Account retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get an account","tags":["Accounts"]},"patch":{"description":"Update mutable account properties—primarily loyalty settings—while keeping the blockchain address and network unchanged.","operationId":"AccountAdminController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the account","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Fields to update on the account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAccountDto"}}}},"responses":{"200":{"description":"Updated account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Update an account","tags":["Accounts"]},"delete":{"description":"Delete an account for the current organization and clean up related signer keys and cached client shares.","operationId":"AccountAdminController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the account to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Account deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDto"}}}},"502":{"description":"Bad gateway when contacting signer service"}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Delete an account","tags":["Accounts"]}},"/v1/account-assignments":{"get":{"description":"List pending account assignments for the selected application within the current organization, including filters and pagination support.","operationId":"AccountAssignmentAdminController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}},{"name":"network","required":false,"in":"query","description":"Optional network filter to retrieve account assignments for a specific blockchain network","schema":{"enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"type":"string"}}],"responses":{"200":{"description":"List of application account assignments retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAccountAssignmentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List account assignments","tags":["Accounts"]},"post":{"description":"Register a pending loyalty benefit for an identity so it is applied automatically at account creation; supports optional upsert to avoid duplicates.","operationId":"AccountAssignmentAdminController_create_v1","parameters":[],"requestBody":{"required":true,"description":"Payload to create a pending assignment. Provide either `email` or `phoneNumber` (or both). `optimisticBalance` may be a number or a string and represents points to be awarded once the account is created. Optionally provide `rewardTier` to assign a tier instead of (or in addition to) points.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccountAssignmentDto"}}}},"responses":{"201":{"description":"Account assignment created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountAssignmentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create an account assignment","tags":["Accounts"]}},"/v1/account-assignments/{id}":{"get":{"description":"Fetch a specific account assignment to review the targeted identity and the pending loyalty reward that will apply when the account is created.","operationId":"AccountAssignmentAdminController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the account","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Account assignment retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountAssignmentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get an account assignment","tags":["Accounts"]},"patch":{"description":"Modify a pending account assignment—adjusting points or reward tier—while leaving the target identity and application unchanged.","operationId":"AccountAssignmentAdminController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the account assignment","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Fields to update on the account assignment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAccountAssignmentDto"}}}},"responses":{"200":{"description":"Updated account assignment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountAssignmentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Update an account assignment","tags":["Accounts"]},"delete":{"description":"Remove a pending account assignment so no automatic loyalty benefit is applied for that identity.","operationId":"AccountAssignmentAdminController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the account assignment to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Account assignment deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountAssignmentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Delete an account assignment","tags":["Accounts"]}},"/v1/loyalty/campaigns":{"get":{"description":"List wallet marketing campaigns of the application, with pagination, status filtering and sorting.","operationId":"CampaignAdminController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["draft","scheduled","sending","sent","finished"],"description":"Filter by campaign lifecycle status. draft and scheduled are the primary management states; sent and finished are analytics states."}},"required":["field","operator","value"],"title":"status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["draft","scheduled","sending","sent","finished"],"description":"Filter by campaign lifecycle status. draft and scheduled are the primary management states; sent and finished are analytics states."}},"required":["field","operator","value"],"title":"status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","name","sendAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Campaigns retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCampaignDto"}}}}},"security":[{"api_key":[]}],"summary":"List campaigns","tags":["Loyalty"]},"post":{"description":"Create a wallet marketing campaign for the application. The campaign starts as a draft; targeting and message content can be refined before it is sent. The content (headline + body) is optional while drafting; its presence is validated at send time, not at draft creation, so a draft may carry no content. Scheduling (sendAt) is server-managed and handled by a dedicated future endpoint — it is not accepted here.","operationId":"CampaignAdminController_post_v1","parameters":[],"requestBody":{"required":true,"description":"Campaign creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignDto"}}}},"responses":{"201":{"description":"Campaign created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}}},"security":[{"api_key":[]}],"summary":"Create a campaign","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}":{"get":{"description":"Fetch a single wallet marketing campaign, including its targeting, message content, schedule and lifecycle status. The isStranded and scheduleJobLost flags reflect the live BullMQ job state (this endpoint only, at most one Redis read): isStranded when a sending campaign has no worker draining it, scheduleJobLost when a past-due scheduled campaign lost its delayed trigger (auto-recovered hourly). They may differ briefly from the list view, which never computes them.","operationId":"CampaignAdminController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Campaign retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a campaign","tags":["Loyalty"]},"patch":{"description":"Update a draft campaign — name, description, channels, targeting or content. Only draft campaigns can be modified. The message content is optional while drafting; its presence is validated at send time, not here.","operationId":"CampaignAdminController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Campaign update data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignDto"}}}},"responses":{"200":{"description":"Campaign updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}},"409":{"description":"Campaign is not a draft and cannot be modified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Update a campaign","tags":["Loyalty"]},"delete":{"description":"Delete a draft campaign. Only draft campaigns can be deleted; sent campaigns are kept for history.","operationId":"CampaignAdminController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Campaign deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}},"409":{"description":"Campaign is not a draft and cannot be deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete a campaign","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}/stats":{"get":{"description":"Aggregated outcome of a campaign once it has started sending: a per-status delivery tally (sent, failed, excluded by frequency cap or opt-out) and a revenue-free conversion proxy (recipients notified, recipients who then visited within the conversion window, and the resulting rate). Computed live from the per-recipient deliveries and visits, so the figures keep moving until the conversion window closes; the campaign is then transitioned to finished by an hourly sweeper (so up to ~1h after the window ends). All zero for a campaign that has not started sending.","operationId":"CampaignAdminController_getStats_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Campaign stats computed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignStatsDto"}}}}},"security":[{"api_key":[]}],"summary":"Get campaign stats","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}/deliveries/export":{"get":{"description":"Export the per-recipient delivery outcomes of a campaign as CSV, one row per (account, channel): the loyalty account id, the Zelty customer id when the application has that integration (blank otherwise — this is the join key for cross-referencing Zelty sales exports by customer), the channel, the delivery status, the exclusion reason when filtered out, the mapped error code when failed, and the send timestamp. A campaign with no deliveries yet (draft, or an empty audience) yields a header-only CSV. For a campaign still sending, the export reflects only the deliveries recorded so far. Capped at the first 50,000 deliveries (ordered by creation time) to bound memory; larger campaigns are truncated to that many rows.","operationId":"CampaignAdminController_exportDeliveries_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"CSV file generated successfully"}},"security":[{"api_key":[]}],"summary":"Export campaign deliveries as CSV","tags":["Loyalty"]}},"/v1/loyalty/campaigns/audience-preview":{"post":{"description":"Estimate the reach of a targeting filter before a campaign is created or sent. Returns how many opted-in customers match the filter, how many are reachable right now, and how many are temporarily withheld by the per-card notification cap (with the time the whole audience frees up). This is a wizard estimate: the authoritative per-recipient consent and cap checks run again at send time. A POST (not GET) because the targeting filter is a structured body, but it has no side effects.","operationId":"CampaignAdminController_previewAudience_v1","parameters":[],"requestBody":{"required":true,"description":"Targeting filter to preview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiencePreviewRequestDto"}}}},"responses":{"200":{"description":"Audience preview computed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiencePreviewDto"}}}},"400":{"description":"Invalid targeting filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Preview a campaign audience","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}/send":{"post":{"description":"Trigger the immediate send of a draft campaign. The campaign is validated (draft status, message content present), its targeted-audience size is frozen, it transitions to sending, and the deliveries are dispatched asynchronously. Returns 202 with the campaign already in sending — per-recipient consent and frequency-cap checks then run in the background, recording each outcome. An empty audience is accepted and simply finishes immediately. Sending is irreversible.","operationId":"CampaignAdminController_send_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"description":"Campaign accepted for sending","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}},"400":{"description":"Campaign message content is missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"Campaign is not a draft and cannot be sent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Send a campaign","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}/resume":{"post":{"description":"Resume a campaign stuck in sending after its send job failed terminally or vanished (no worker draining it). Re-enqueues the idempotent send job: recipients already delivered are skipped and any re-push stays bounded by the per-card frequency cap. Returns 202 with the campaign still in sending — the deliveries resume in the background. Allowed only when the campaign is genuinely stranded (sending with a failed/absent job); a send still in progress is rejected.","operationId":"CampaignAdminController_resume_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"description":"Campaign accepted for resuming","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}},"409":{"description":"Campaign is not stranded and cannot be resumed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Resume a stranded campaign","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}/schedule":{"post":{"description":"Schedule a draft campaign for a future send. The campaign is validated (draft status, message content present), transitions to scheduled, and a delayed job fires at sendAt to start the send automatically. Returns 202 with the campaign in scheduled. A past or present sendAt is accepted and triggers an immediate send (flagged by scheduledImmediately on the response). The schedule can be cancelled back to draft with POST /:id/cancel before it fires.","operationId":"CampaignAdminController_schedule_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Scheduled send time","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleCampaignDto"}}}},"responses":{"202":{"description":"Campaign accepted for scheduling","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}},"400":{"description":"Invalid sendAt, or campaign message content is missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"Campaign is not a draft and cannot be scheduled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Schedule a campaign","tags":["Loyalty"]}},"/v1/loyalty/campaigns/{id}/cancel":{"post":{"description":"Cancel a scheduled campaign before its delayed job fires, removing the trigger and returning the campaign to draft (its sendAt is cleared). Allowed only when the campaign is scheduled; a draft, sending, sent or finished campaign is rejected. Synchronous: returns 200 with the campaign already back in draft.","operationId":"CampaignAdminController_cancel_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Campaign schedule cancelled, back to draft","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDto"}}}},"409":{"description":"Campaign is not scheduled and cannot be cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Cancel a scheduled campaign","tags":["Loyalty"]}},"/v1/loyalty/account/{id}/mint":{"post":{"description":"Mint on-chain loyalty points for the specified account and update its optimistic balance for manual reward adjustments.","operationId":"LoyaltyAccountAdminController_mint_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Account UUID","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyAccountMintDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyAccountMintResponseDto"}}}}},"security":[{"api_key":[]}],"summary":"Mint points","tags":["Loyalty"]}},"/v1/loyalty/orders":{"get":{"description":"Retrieve order history for a loyalty account wallet. Organization members can only access wallets from their organization. An order_transaction may be transiently omitted from the response if the indexer has not yet hydrated its underlying asset transfer.","operationId":"LoyaltyOrderAdminController_getOrders_v1","parameters":[{"name":"walletId","required":true,"in":"query","description":"Wallet address to query orders for","schema":{"minLength":1,"type":"string"}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","price"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page (max 5000 for client-side pagination).","schema":{"minimum":1,"maximum":5000,"default":10,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLoyaltyOrderDto"}}}}},"security":[{"api_key":[]}],"summary":"List loyalty orders","tags":["Loyalty"]}},"/v1/loyalty/reward-tiers":{"get":{"description":"List loyalty reward tiers configured for the application, with pagination and sorting by required visits.","operationId":"LoyaltyRewardTierAdminController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","requiredVisits"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Loyalty reward tiers retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLoyaltyRewardTierDto"}}}}},"security":[{"api_key":[]}],"summary":"List reward tiers","tags":["Loyalty"]},"post":{"description":"Create a loyalty reward tier for the application, enforcing a unique visit threshold and defining the accrual ratio.","operationId":"LoyaltyRewardTierAdminController_post_v1","parameters":[],"requestBody":{"required":true,"description":"Loyalty reward tier creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLoyaltyRewardTierDto"}}}},"responses":{"201":{"description":"Loyalty reward tier created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyRewardTierDto"}}}}},"security":[{"api_key":[]}],"summary":"Create a reward tier","tags":["Loyalty"]}},"/v1/loyalty/reward-tiers/{id}":{"get":{"description":"Fetch details of a specific loyalty reward tier, including visit thresholds, accrual ratio, and branding.","operationId":"LoyaltyRewardTierAdminController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Loyalty reward tier ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Loyalty reward tier retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyRewardTierDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a reward tier","tags":["Loyalty"]},"patch":{"description":"Update loyalty reward tier properties—such as name, accrual ratio, or imagery—while maintaining uniqueness constraints.","operationId":"LoyaltyRewardTierAdminController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Loyalty reward tier ID","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Loyalty reward tier update data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLoyaltyRewardTierDto"}}}},"responses":{"200":{"description":"Loyalty reward tier updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyRewardTierDto"}}}},"400":{"description":"Invalid input data or cannot modify default tier"}},"security":[{"api_key":[]}],"summary":"Update a reward tier","tags":["Loyalty"]},"delete":{"description":"Delete a loyalty reward tier so it no longer participates in customer tier evaluation.","operationId":"LoyaltyRewardTierAdminController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Loyalty reward tier ID","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Loyalty reward tier deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyRewardTierDto"}}}},"400":{"description":"Cannot delete default reward tier"}},"security":[{"api_key":[]}],"summary":"Delete a reward tier","tags":["Loyalty"]}},"/v1/loyalty/consent-logs/users/{userId}":{"get":{"description":"Append-only GDPR proof-of-consent trail (art. 7.1) of every marketing opt-in/opt-out decision of one loyalty customer, newest first. Each entry records the decision, when it happened, and the channel it came through. Scoped to the caller's organization: the customer must have a loyalty account under it, otherwise 404.","operationId":"MarketingConsentAdminController_getForUser_v1","parameters":[{"name":"userId","required":true,"in":"path","description":"Customer (AuthUser) whose consent history is requested","schema":{"format":"uuid","type":"string"}},{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","occurredAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Consent history retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedConsentLogDto"}}}},"401":{"description":"Unauthenticated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"List a customer marketing-consent history","tags":["Loyalty"]}},"/v1/loyalty/zelty/settings":{"get":{"description":"Retrieve the organization's Zelty integration settings, provisioning defaults if none exist.","operationId":"ZeltySettingsAdminController_get_v1","parameters":[],"responses":{"200":{"description":"No settings found for organization\n\nZelty settings retrieved successfully","schema":{"type":"null"},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZeltySettingsDto"}}}}},"security":[{"api_key":[]}],"summary":"Get Zelty settings","tags":["Integrations"]},"patch":{"description":"Create or update the Zelty integration settings for the organization and refresh configured webhooks.","operationId":"ZeltySettingsAdminController_patch_v1","parameters":[],"requestBody":{"required":true,"description":"Zelty settings data to update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateZeltySettingsDto"}}}},"responses":{"200":{"description":"Zelty settings updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZeltySettingsDto"}}}}},"security":[{"api_key":[]}],"summary":"Update Zelty settings","tags":["Integrations"]}},"/v1/quotas/usage":{"get":{"description":"Retrieve monthly quota usage data for the current organization. Useful for building usage trend charts.","operationId":"QuotaUsageController_getUsage_v1","parameters":[{"name":"months","required":false,"in":"query","description":"Number of months to retrieve (default: 6)","schema":{"minimum":1,"maximum":24,"default":6,"type":"number"}},{"name":"organizationId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}}],"responses":{"200":{"description":"Quota usage history retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaUsageListDto_Output"}}}}},"summary":"Get quota usage history for the active organization","tags":["Quotas"],"x-mcp-name":"get_quota_usage","x-mcp-output-schema":true,"x-mcp-type":"Resource"}},"/v1/quotas/transactions":{"get":{"operationId":"TransactionQuotaController_get_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionQuotaDto"}}}}},"summary":"Get the monthly agent wallet transaction quota of the organization","tags":["Quotas"],"x-mcp-name":"get_transaction_quota","x-mcp-type":"Resource"},"patch":{"description":"Sets what happens when the monthly transaction quota is reached and who receives the alert emails.\n- `422 TRANSACTION_QUOTA_OVERAGE_NOT_ALLOWED`: billing mode requested on a plan that does not allow transaction overage\n- `422 TRANSACTION_QUOTA_RECIPIENT_NOT_MEMBER`: a recipient is not a member of the organization","operationId":"TransactionQuotaController_patch_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransactionQuotaDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionQuotaDto"}}}}},"summary":"Update the transaction quota settings of the organization","tags":["Quotas"],"x-mcp-name":"update_transaction_quota","x-mcp-type":"Tool"}},"/v1/dpp/certification-key":{"get":{"description":"Retrieve the active certification key for the organization, including its registration status from database records.","operationId":"DppCertificationKeyController_getCertificationKey_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificationKeyResponseDto"}}}}},"summary":"Get certification key with registration status","tags":["DPP"]}},"/v1/dpp/certification-key/history":{"get":{"description":"Retrieve all certification keys for the organization, including rotated and revoked keys.","operationId":"DppCertificationKeyController_getCertificationKeyHistory_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificationKeyHistoryResponseDto"}}}}},"summary":"Get certification key history","tags":["DPP"]}},"/v1/dpp/certification-key/did-web-config":{"get":{"description":"Returns the tenant-configured `did:web` domain and the DID Document to publish at `https://{domain}/.well-known/did.json`. The document is derived from the active certification key — regenerate it after every rotation.","operationId":"DppCertificationKeyController_getDidWebConfig_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DidWebConfigResponseDto"}}}}},"summary":"Get self-hosted DID Web configuration","tags":["DPP"]},"put":{"description":"Configure the bare host on which the tenant publishes `.well-known/did.json`. Pass `domain: null` to disable self-hosted DID Web (VCs fall back to `did:key`). Returns the updated DID Document for the integrator to copy-paste onto their domain.","operationId":"DppCertificationKeyController_setDidWebDomain_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetDidWebDomainDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DidWebConfigResponseDto"}}}}},"summary":"Set or clear the self-hosted DID Web domain","tags":["DPP"]}},"/v1/dpp/certification-key/did-web-config/verify":{"post":{"description":"Fetches `https://{domain}/.well-known/did.json` server-side and checks it matches the active certification key. Always responds with HTTP 200 and a discriminated body — even on network or mismatch failures — so the admin UI can render a clear OK / KO state. Also refreshes the persisted `lastCheck` snapshot returned by GET did-web-config (audited for that reason; permission stays `read` — the snapshot is derived health state, not configuration). Returns 400 only when the tenant has no domain configured.","operationId":"DppCertificationKeyController_verifyDidWebConfig_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyDidWebConfigResponseDto"}}}}},"summary":"Verify the published DID Document on the tenant domain","tags":["DPP"]}},"/v1/dpp/certification-key/rotate":{"post":{"description":"Generate a new certification key and queue on-chain rotation jobs for all registered networks. Old certificates remain valid.","operationId":"DppCertificationKeyController_rotateCertificationKey_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateCertificationKeyResponseDto"}}}}},"summary":"Rotate certification key","tags":["DPP"]}},"/v1/dpp/opt-in-forms":{"post":{"description":"Pins an opt-in form screenshot to IPFS and returns its content-addressed reference. The returned `uri` is stored as the reserved `opt_in_form` field in a passport `data` object so it is certified alongside the rest of the certificate.","operationId":"DppOptInFormController_upload_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptInFormUploadDto"}}}},"responses":{"201":{"description":"Image pinned to IPFS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptInFormUploadResponseDto"}}}}},"security":[{"api_key":[]}],"summary":"Upload an opt-in form screenshot to IPFS","tags":["DPP"]}},"/v1/dpp/passports":{"get":{"description":"Retrieve a paginated list of DPP passports for the authenticated organization. Supports filtering by product ID.","operationId":"DppPassportController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Passports retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDppPassportDto"}}}}},"security":[{"api_key":[]}],"summary":"List passports","tags":["DPP"]},"post":{"description":"Create a new DPP passport for the authenticated organization. The application must belong to the organization.","operationId":"DppPassportController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDppPassportDto"}}}},"responses":{"201":{"description":"Passport created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppPassportDto"}}}},"409":{"description":"A passport with the same reference already exists in this application"}},"security":[{"api_key":[]}],"summary":"Create a passport","tags":["DPP"]}},"/v1/dpp/passports/{id}":{"get":{"description":"Retrieve a single DPP passport by its unique identifier. This endpoint is public and does not require authentication.","operationId":"DppPassportController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the passport","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Passport retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppPassportDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a passport","tags":["DPP"]},"patch":{"description":"Update an existing DPP passport by its ID. Only passports belonging to the authenticated organization can be updated.","operationId":"DppPassportController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDppPassportDto"}}}},"responses":{"200":{"description":"Passport updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppPassportDto"}}}},"409":{"description":"A passport with the same reference already exists in this application"}},"security":[{"api_key":[]}],"summary":"Update a passport","tags":["DPP"]},"delete":{"description":"Delete a DPP passport by its ID. Only passports belonging to the authenticated organization can be deleted.","operationId":"DppPassportController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Passport deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppPassportDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete a passport","tags":["DPP"]}},"/v1/dpp/passports/{id}/vc.jsonld":{"get":{"description":"Returns the signed W3C Verifiable Credential (UNTP Digital Product Passport) as JSON-LD, served from the copy persisted at certification (also pinned to IPFS, which is read back as fallback) — or, for a self-hosted certificate, read on the fly from the issuer-provided `certificateUri` (never stored server-side). Public: a third-party verifier resolves the issuer `did:web` and checks the signature without contacting Keyban. Returns 404 when the passport is not visible to the caller (anonymously it must be `published` or `claimed`), and 200 with an unsigned minimal credential while it is not certified yet. Returns 503 when no persisted copy exists and the IPFS gateway is unreachable, or when the self-hosted certificate cannot be retrieved (e.g. deleted by the issuer). CORS-open for browser verifiers.","operationId":"DppPassportController_getVc_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the passport","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Signed Verifiable Credential (JSON-LD)","content":{"application/ld+json":{"schema":{"type":"object"}}}},"503":{"description":"No persisted copy and the IPFS gateway is unreachable (`DPP_VC_IPFS_UNAVAILABLE`), or the self-hosted certificate could not be retrieved (`DPP_VC_SELF_HOSTED_UNAVAILABLE`)"}},"security":[{"api_key":[]}],"summary":"Download the passport Verifiable Credential","tags":["DPP"]}},"/v1/dpp/passports/{id}/magic-token":{"get":{"description":"Generate a magic token that can be used to claim a DPP passport without requiring email validation.","operationId":"DppPassportController_getMagicToken_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the passport","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Magic token generated successfully"}},"security":[{"api_key":[]}],"summary":"Get passport magic token","tags":["DPP"]}},"/v1/dpp/passports/{id}/qr-code":{"get":{"description":"Generate a QR code encoding the public passport URL. Returns the image as a binary attachment. The passport must be published or claimed (409 otherwise).","operationId":"DppPassportController_getQrCode_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the passport","schema":{"format":"uuid","type":"string"}},{"name":"format","required":false,"in":"query","description":"Output format of the QR code image. Defaults to png.","schema":{"enum":["png","svg"],"type":"string"}}],"responses":{"200":{"description":"QR code generated successfully","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/svg+xml":{"schema":{"type":"string"}}}},"409":{"description":"Passport is not published — no QR code can be generated"}},"security":[{"api_key":[]}],"summary":"Download passport QR code","tags":["DPP"]}},"/v1/dpp/passports/build-vc":{"post":{"description":"Builds and signs the exact W3C Verifiable Credential the platform would otherwise upload to IPFS for the given passport content — without persisting or anchoring anything. The issuer hosts the returned credential at their own https URL and passes it back as `certificateUri` on create/update, enabling a deletable (self-hosted) certificate. Send the SAME `product`/`data`/`certifiedPaths` you will send to create, so the on-chain content hash matches the hosted credential. Signed with the active certification key of the organization.","operationId":"DppPassportController_buildVc_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDppPassportDto"}}}},"responses":{"200":{"description":"Signed Verifiable Credential (JSON-LD)","content":{"application/ld+json":{"schema":{"type":"object"}}}},"422":{"description":"The passport content has nothing to certify"}},"security":[{"api_key":[]}],"summary":"Build a signed Verifiable Credential (self-hosted certificate)","tags":["DPP"]}},"/v1/dpp/passports/publish":{"post":{"description":"Start publishing the DPP passports matching the filter, cascading publication to their batches and items.\n\nThe call returns as soon as the job is accepted: passports are still `draft` at that point and turn `published` as the job progresses. Poll the passports, or the job referenced by `jobId`, to observe completion.\n\nOn applications with the Trust feature, published models carrying a product web page are enrolled for AI-visibility tracking right after publication, without delaying it.","operationId":"DppPassportController_publish_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}},{"name":"skipCertification","required":false,"in":"query","description":"When true, publish without enqueuing certification jobs. Defaults to false.","schema":{"type":"boolean"}}],"responses":{"202":{"description":"Publication job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishDppPassportsResultDto"}}}}},"security":[{"api_key":[]}],"summary":"Publish DPP passports","tags":["DPP"]}},"/v1/dpp/passports/certify":{"post":{"description":"Start certifying the DPP passports matching the filter, cascading certification to their batches and items.\n\nThe call returns as soon as the job is accepted; certification happens afterwards. Poll the passports, or the job referenced by `jobId`, to observe completion.","operationId":"DppPassportController_certify_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"202":{"description":"Certification job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertifyDppPassportsResultDto"}}}}},"security":[{"api_key":[]}],"summary":"Certify DPP passports","tags":["DPP"]}},"/v1/dpp/passports/delete":{"post":{"description":"Start deleting every DPP passport of the organization matching the filter.\n\nThe call returns as soon as the job is accepted; passports disappear as the job progresses. Poll the job referenced by `jobId` to observe completion.\n\nUnlike publish and certify, deletion does **not** cascade: only the passports the filter matches are removed, never the batches or items attached to a matched model.\n\nOnly `draft` passports are deleted. A published passport has a public URL and possibly an on-chain anchor, and `draft` → `published` is one-way, so it is never removed.\n\nPassports coming from a read-only source are never deleted either. Both cases are reported in `skippedCount` instead of failing the call.","operationId":"DppPassportController_deleteMany_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"202":{"description":"Deletion job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteDppPassportsResultDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete DPP passports","tags":["DPP"]}},"/v1/dpp/shopify/shops":{"get":{"description":"Retrieve all Shopify shops linked to the current organization with pagination and filtering options.","operationId":"ShopifyShopAdminController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedShopifyShopDto"}}}}},"summary":"List Shopify shops","tags":["Integrations"]},"post":{"description":"Register a Shopify shop for an application. The domain must be unique across all applications.","operationId":"ShopifyShopAdminController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShopifyShopDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopifyShopDto"}}}},"400":{"description":"Invalid Shopify shop domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"Shop domain is already linked to another application","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"summary":"Create a Shopify shop","tags":["Integrations"]}},"/v1/dpp/shopify/shops/{id}":{"get":{"description":"Retrieve a specific Shopify shop by its UUID, including associated OAuth sessions.","operationId":"ShopifyShopAdminController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopifyShopDto"}}}}},"summary":"Get a Shopify shop","tags":["Integrations"]},"delete":{"description":"Remove a Shopify shop integration from the organization.","operationId":"ShopifyShopAdminController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopifyShopDto"}}}}},"summary":"Delete a Shopify shop","tags":["Integrations"]}},"/v1/imports":{"get":{"description":"List all import jobs for the authenticated organization, filterable by application and entity name.","operationId":"ImportController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["batch","entity"]}},"required":["field","operator","value"],"title":"name"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["parent"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"parent"},{"type":"object","properties":{"field":{"type":"string","enum":["data.applicationId"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"data.applicationId"},{"type":"object","properties":{"field":{"type":"string","enum":["data.entityName"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"data.entityName"},{"type":"object","properties":{"field":{"type":"string","enum":["data.source"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["upload","shopify","scheduled"]}},"required":["field","operator","value"],"title":"data.source"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["batch","entity"]}},"required":["field","operator","value"],"title":"name"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["parent"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"parent"},{"type":"object","properties":{"field":{"type":"string","enum":["data.applicationId"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"data.applicationId"},{"type":"object","properties":{"field":{"type":"string","enum":["data.entityName"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"data.entityName"},{"type":"object","properties":{"field":{"type":"string","enum":["data.source"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["upload","shopify","scheduled"]}},"required":["field","operator","value"],"title":"data.source"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":""}},"summary":"List import jobs","tags":["Import"]},"post":{"description":"Upload a JSON array of entities to import in bulk for the given application.\n\nThe body schema depends on the `entityName` query parameter. Currently only `DppPassport` is supported, whose items follow `CreateDppPassportDto`.\n\nThe passport granularity is carried by `product.idGranularity`:\n- `model` — product model level (shared template across a whole reference).\n- `batch` — production batch level (series, dated run); set `product.modelNumber` to link to the parent model.\n- `item` — individual serialized article level; set `product.batchNumber` / `product.itemNumber` to link and identify the unit.\n\nWhen the optional `mapperId` query parameter is set, the body is instead a JSON array of **foreign-schema** source objects: each item is transformed into a passport via the mapper rules (replace semantics) before validation, so it need not match `CreateDppPassportDto` directly.\n\nThe optional `network` query parameter sets the blockchain network for every imported passport (it is not part of the body / mapper output). When omitted it defaults to `BaseMainnet`.","operationId":"ImportController_post_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateImportJobDto"}}}},"responses":{"400":{"description":"Invalid import request: a CSV body without a `mapperId` (a CSV import requires a mapper), a mapper whose rows do not match the detected body format (a JSON-oriented mapper used against a CSV body, or vice versa), a missing request body (no CSV stream / no buffered JSON body), a streamed CSV body exceeding the 256 MB upload cap, or — **CSV only** — a synchronous enqueue exceeding the temporary 1,000-row cap. A JSON body exceeding the same cap does not produce this 400: the violation happens in the background enqueue and only surfaces afterwards, on the job's `initError` field or over the progress SSE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"summary":"Start a bulk import","tags":["Import"]}},"/v1/imports/{id}":{"get":{"description":"Get details of a specific import job by its ID.","operationId":"ImportController_getJob_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get an import job","tags":["Import"]}},"/v1/imports/{id}/progress":{"get":{"description":"Subscribe to real-time progress updates for a specific import job via Server-Sent Events.","operationId":"ImportController_progress_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Stream import job progress","tags":["Import"]}},"/v1/import/mappers":{"get":{"description":"Retrieve a paginated list of mappers for the authenticated organization. Supports filtering by application and name.","operationId":"ImportMapperController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"name"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["file","url"]}},"required":["field","operator","value"],"title":"type"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"name"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["file","url"]}},"required":["field","operator","value"],"title":"type"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","name","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Mappers retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedImportMapperDto"}}}}},"security":[{"api_key":[]}],"summary":"List mappers","tags":["Import"]},"post":{"description":"Create a new mapper attached to an application. The mapper name must be unique within the application.","operationId":"ImportMapperController_post_v1","parameters":[],"requestBody":{"required":true,"description":"ImportMapper creation data","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"201":{"description":"ImportMapper created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMapperDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"A mapper with the same name already exists in this application","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Create a mapper","tags":["Import"]}},"/v1/import/mappers/running":{"get":{"description":"Report which mappers of the organization have a run still importing, and the import job carrying it. A mapper is listed while its batch job is queued, executing, or waiting on rows still being processed. The state is read from the queue itself, not from the import history, so a history row left behind by a worker restart never shows up here. These are exactly the mappers for which `POST /v1/import/mappers/:id/run` answers 409.","operationId":"ImportMapperController_running_v1","parameters":[{"name":"application","required":false,"in":"query","description":"Restrict the report to the mappers of this application. Omit to cover every application of the organization.","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}}],"responses":{"200":{"description":"Mappers currently importing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunningImportsDto"}}}}},"security":[{"api_key":[]}],"summary":"List the mappers currently importing","tags":["Import"]}},"/v1/import/mappers/suggest-mapping":{"post":{"description":"Propose a `source -> destination` correspondence for each destination an\nAI model recognizes in the submitted sample profile, to pre-fill the mapper\nbuilder for review. Destinations it does not recognize are simply omitted.\n\nThe sample file is **not** sent: the caller parses it locally and submits only\na profile of its source fields (identifier, one example value, and for CSV the\naggregates measured over the scanned rows). The destination fields are derived\nserver-side from the passport-creation schema, so they cannot drift from what\nthe import accepts.\n\nThe answer is filtered against the submitted sources and the generated\ndestinations, so it can only ever reference fields that exist. It stays a\nsuggestion: nothing is persisted, and the import itself remains deterministic.\n\nNever fails on the model's account: if it is unreachable or answers unusably,\ncorrespondences come from a deterministic lexical matcher instead and\n`degraded` is set.\n\n**Read `confidence` before applying a correspondence.** The list reports every\ndestination that was recognized, including the ones judged unfit to pre-fill:\n`high` and `review` are meant to be applied (`review` asks for a second look),\nwhile `low` must be offered rather than filled in — its values would fail\npassport validation on every row. `evidence` says *why*, and `origin` says who\nproposed it; anything other than `llm` was produced without a model call.","operationId":"ImportMapperController_suggestMapping_v1","parameters":[],"requestBody":{"required":true,"description":"Sample source profile to suggest a mapping for","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Suggested correspondences","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMappingSuggestionDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Suggest mapper correspondences for a sample","tags":["Import"]}},"/v1/import/mappers/{id}":{"get":{"description":"Retrieve a single mapper by its unique identifier.","operationId":"ImportMapperController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the mapper","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"ImportMapper retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMapperDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a mapper","tags":["Import"]},"patch":{"description":"Update a mapper. When `rows` is provided, the full list is replaced atomically (existing rows are removed and recreated in the given order).","operationId":"ImportMapperController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"ImportMapper ID","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"ImportMapper update data","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"ImportMapper updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMapperDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"A mapper with the same name already exists in this application","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Update a mapper","tags":["Import"]},"delete":{"description":"Delete a mapper by ID. All associated rows are removed.","operationId":"ImportMapperController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the mapper to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"ImportMapper deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMapperDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete a mapper","tags":["Import"]}},"/v1/import/mappers/{id}/run":{"post":{"description":"Trigger an immediate fetch-and-import of a scheduled (`url`) mapper, without waiting for its next scheduled occurrence and without altering the schedule. The run executes asynchronously through the exact same pipeline as a scheduled occurrence and shows up in the import history with `source = scheduled`; the response names its import job so it can be followed right away (`GET /v1/imports/:importId`). Two runs of the same mapper never overlap: while one is still importing the endpoint answers 409 (`IMPORT_RUN_IN_PROGRESS`).","operationId":"ImportMapperController_run_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the scheduled mapper to run","schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"description":"Run enqueued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMapperRunDto"}}}},"400":{"description":"The mapper is not a scheduled (url) mapper","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"A run of this mapper is still importing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Run a scheduled mapper now","tags":["Import"]}},"/v1/llm/chat/completions":{"post":{"description":"Send messages to an LLM and receive a completion. Requires authenticated user with active organization. Usage is tracked for auditing and future quota enforcement.\n\n**Message Roles:**\n- `system`: Defines the AI's behavior and constraints (e.g., \"You are a helpful coding assistant\"). Place at the beginning of the conversation. Only one system message is supported (Gemini limitation).\n- `user`: Represents the human's questions or requests. Can appear multiple times in the conversation.\n- `assistant`: Represents the AI's previous responses. Used to maintain conversation history and context.\n\n**Example conversation flow:**\n```json\n{\n  \"messages\": [\n    {\"role\": \"system\", \"content\": \"You are a helpful assistant that responds in French.\"},\n    {\"role\": \"user\", \"content\": \"What is the capital of France?\"},\n    {\"role\": \"assistant\", \"content\": \"La capitale de la France est Paris.\"},\n    {\"role\": \"user\", \"content\": \"What is its population?\"}\n  ]\n}\n```\n\nThe AI will remember the conversation context and respond about Paris's population.","operationId":"LlmController_chatCompletion_v1","parameters":[],"requestBody":{"required":true,"description":"Chat completion request with provider, model, and messages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequestDto"}}}},"responses":{"200":{"description":"Chat completion generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionResponseDto"}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"403":{"description":"No active organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Generate chat completion","tags":["LLM"]}},"/v1/llm/providers":{"get":{"description":"Get a list of all supported LLM providers (GOOGLE, ANTHROPIC, OPENAI, etc.)","operationId":"LlmController_listProviders_v1","parameters":[],"responses":{"200":{"description":"List of available providers","content":{"application/json":{"schema":{"type":"object","properties":{"providers":{"type":"array","items":{"type":"string","enum":["GOOGLE"]}}}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List providers","tags":["LLM"]}},"/v1/llm/providers/{provider}/models":{"get":{"description":"Get a list of all models supported by a specific LLM provider","operationId":"LlmController_listModels_v1","parameters":[{"name":"provider","required":true,"in":"path","description":"The LLM provider (e.g., GOOGLE)","schema":{"enum":["GOOGLE"],"type":"string"}}],"responses":{"200":{"description":"List of available models","content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string"},"models":{"type":"array","items":{"type":"string"}}}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List models for a provider","tags":["LLM"]}},"/v1/events":{"get":{"description":"Paginated audit/quota events scoped to the caller organization. For `dppPassport` events, `passport` carries the full DPP passport (same shape as `/v1/dpp/passports`); for other subjects the field is absent.","operationId":"EventController_list_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["subject"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["application","dppPassport","wallet"]}},"required":["field","operator","value"],"title":"subject"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["create","update","delete","publish","claim","scan","transfer"]}},"required":["field","operator","value"],"title":"type"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"passport.id"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"passport.product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"passport.product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.product.itemNumber"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"passport.product.itemNumber"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["subject"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["application","dppPassport","wallet"]}},"required":["field","operator","value"],"title":"subject"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["create","update","delete","publish","claim","scan","transfer"]}},"required":["field","operator","value"],"title":"type"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"passport.id"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"passport.product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"passport.product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["passport.product.itemNumber"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"passport.product.itemNumber"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Events retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventListDto"}}}}},"summary":"List events for the active organization","tags":["Events"],"x-mcp-name":"list_events","x-mcp-type":"Resource"}},"/v1/invest/funds":{"get":{"description":"List all investment funds for the current organization.","operationId":"InvestFundController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["ACTIVE","DRAFT","CLOSED"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"name"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["ACTIVE","DRAFT","CLOSED"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"name"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","name","shares","status","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of investment funds retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestFundDto"}}}}},"security":[{"api_key":[]}],"summary":"List investment funds","tags":["Invest"]},"post":{"description":"Create a new investment fund for the application.","operationId":"InvestFundController_post_v1","parameters":[],"requestBody":{"required":true,"description":"Investment fund creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvestFundDto"}}}},"responses":{"201":{"description":"Investment fund created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestFundDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Create an investment fund","tags":["Invest"]}},"/v1/invest/funds/{id}":{"get":{"description":"Fetch a specific investment fund by ID.","operationId":"InvestFundController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Investment fund retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestFundDto"}}}}},"security":[{"api_key":[]}],"summary":"Get an investment fund","tags":["Invest"]},"patch":{"description":"Update investment fund properties such as name, NAV, or status.","operationId":"InvestFundController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Investment fund ID","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Investment fund update data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInvestFundDto"}}}},"responses":{"200":{"description":"Investment fund updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestFundDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Update an investment fund","tags":["Invest"]},"delete":{"description":"Delete an investment fund by ID.","operationId":"InvestFundController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the investment fund to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Investment fund deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestFundDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete an investment fund","tags":["Invest"]}},"/v1/invest/investor/funds":{"get":{"description":"List all active investment funds for the current application.","operationId":"InvestFundInvestorController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"name"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq","contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"name"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","name","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of active investment funds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestFundDto"}}}}},"security":[{"bearer":[]}],"summary":"List active investment funds","tags":["Invest"]}},"/v1/invest/investor/funds/{fundId}/holding":{"get":{"description":"Return the shares held by the current investor in the given fund, plus the effective lockup end date. Shares default to 0 when the investor has no holding. The investor-level lockup overrides the fund-level lockup; null is returned when no active lockup applies.","operationId":"InvestFundInvestorController_getMyHolding_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Investor's holding retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyInvestHoldingDto"}}}}},"security":[{"bearer":[]}],"summary":"Get the current investor's holding for a fund","tags":["Invest"]}},"/v1/invest/investor/funds/{fundId}/nav":{"get":{"description":"List NAV records for an active fund of the current investor's application.","operationId":"InvestFundInvestorController_listNav_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["value"]},"operator":{"type":"string","enum":["eq","gt","lt","gte","lte"]},"value":{"type":"number"}},"required":["field","operator","value"],"title":"value"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["value"]},"operator":{"type":"string","enum":["eq","gt","lt","gte","lte"]},"value":{"type":"number"}},"required":["field","operator","value"],"title":"value"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","date","value","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of NAV records retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestNavDto"}}}}},"security":[{"bearer":[]}],"summary":"List NAV history for a fund","tags":["Invest"]}},"/v1/invest/funds/{fundId}/holdings":{"get":{"description":"List all holdings for a specific investment fund.","operationId":"InvestHoldingController_getAll_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["identity.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"identity.id"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["identity.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"identity.id"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","shares","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of holdings retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestHoldingDto"}}}}},"security":[{"api_key":[]}],"summary":"List holdings","tags":["Invest"]}},"/v1/invest/funds/{fundId}/holdings/{id}":{"get":{"description":"Fetch a specific holding record by ID.","operationId":"InvestHoldingController_getOne_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the holding record","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Holding retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestHoldingDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a holding","tags":["Invest"]}},"/v1/invest/funds/{fundId}/holdings/distribute":{"post":{"description":"Distribute shares from the fund to an investor. Creates or increments a holding and records an INITIAL_DISTRIBUTION transaction. Fails if the total distributed shares would exceed the fund capacity.","operationId":"InvestHoldingController_distribute_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Distribution data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributeSharesDto"}}}},"responses":{"201":{"description":"Shares distributed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestTransactionDto"}}}},"400":{"description":"Not enough shares available in the fund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Distribute shares to an investor","tags":["Invest"]}},"/v1/invest/funds/{fundId}/holdings/redeem":{"post":{"description":"Buy back shares from an investor. Reduces their holding and records a BUY_BACK transaction. Fails if the investor does not hold enough shares or if a lockup period is active (fund-level or investor-level).","operationId":"InvestHoldingController_redeem_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Redemption data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemSharesDto"}}}},"responses":{"201":{"description":"Shares redeemed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestTransactionDto"}}}},"400":{"description":"Lockup period active or investor does not hold enough shares","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Redeem shares from an investor","tags":["Invest"]}},"/v1/invest/identities/me":{"get":{"description":"Retrieve the invest identity associated with the current SDK account.","operationId":"InvestIdentityController_getMe_v1","parameters":[],"responses":{"200":{"description":"Invest identity retrieved successfully"}},"summary":"Get current user invest identity","tags":["Invest"]}},"/v1/invest/identities":{"get":{"description":"List all invest identities for the current organization.","operationId":"InvestIdentityController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["account.application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"account.application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["firstName"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"firstName"},{"type":"object","properties":{"field":{"type":"string","enum":["lastName"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"lastName"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["account.application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"account.application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["firstName"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"firstName"},{"type":"object","properties":{"field":{"type":"string","enum":["lastName"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"lastName"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","firstName","lastName","status","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of invest identities retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestIdentityDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List invest identities","tags":["Invest"]},"post":{"description":"Create a new invest identity for the current SDK account.","operationId":"InvestIdentityController_create_v1","parameters":[],"requestBody":{"required":true,"description":"Invest identity creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvestIdentityDto"}}}},"responses":{"201":{"description":"Invest identity created successfully"},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"Invest identity already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"summary":"Create an invest identity","tags":["Invest"]}},"/v1/invest/identities/counts":{"get":{"description":"Return invest identity counts grouped by KYC status for the given application, in a single query.","operationId":"InvestIdentityController_getCounts_v1","parameters":[{"name":"applicationId","required":true,"in":"query","description":"Application UUID to scope counts to","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Counts retrieved successfully"}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Count invest identities by KYC status","tags":["Invest"]}},"/v1/invest/identities/{id}":{"get":{"description":"Fetch a specific invest identity by ID.","operationId":"InvestIdentityController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the invest identity","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Invest identity retrieved successfully"}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get an invest identity","tags":["Invest"]},"patch":{"description":"Update an invest identity. Restricted to accounts belonging to the organization.","operationId":"InvestIdentityController_update_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the invest identity","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Fields to update on the invest identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInvestIdentityDto"}}}},"responses":{"200":{"description":"Invest identity updated successfully"}},"security":[{"bearer":[]}],"summary":"Update an invest identity","tags":["Invest"]}},"/v1/invest/funds/{fundId}/lockups":{"get":{"description":"List all custom lockup periods for a specific investment fund.","operationId":"InvestLockupController_getAll_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["identity.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"identity.id"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["identity.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"identity.id"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","endDate","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of lockup records retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestLockupDto"}}}}},"security":[{"api_key":[]}],"summary":"List lockups","tags":["Invest"]},"post":{"description":"Create a custom lockup period for an investor in this fund.","operationId":"InvestLockupController_post_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Lockup creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvestLockupDto"}}}},"responses":{"201":{"description":"Lockup record created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestLockupDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Create a lockup record","tags":["Invest"]}},"/v1/invest/funds/{fundId}/lockups/{id}":{"get":{"description":"Fetch a specific lockup record by ID.","operationId":"InvestLockupController_getOne_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the lockup record","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Lockup record retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestLockupDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a lockup record","tags":["Invest"]},"patch":{"description":"Update the end date of a custom lockup period.","operationId":"InvestLockupController_patch_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the lockup record","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Lockup update data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInvestLockupDto"}}}},"responses":{"200":{"description":"Lockup record updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestLockupDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Update a lockup record","tags":["Invest"]},"delete":{"description":"Delete a custom lockup period by ID.","operationId":"InvestLockupController_delete_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the lockup record to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Lockup record deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestLockupDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete a lockup record","tags":["Invest"]}},"/v1/invest/funds/{fundId}/nav":{"get":{"description":"List all NAV records for a specific investment fund.","operationId":"InvestNavController_getAll_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["value"]},"operator":{"type":"string","enum":["eq","gt","lt","gte","lte"]},"value":{"type":"number"}},"required":["field","operator","value"],"title":"value"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["value"]},"operator":{"type":"string","enum":["eq","gt","lt","gte","lte"]},"value":{"type":"number"}},"required":["field","operator","value"],"title":"value"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","date","value","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of NAV records retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestNavDto"}}}}},"security":[{"api_key":[]}],"summary":"List NAV history","tags":["Invest"]},"post":{"description":"Create a new NAV record for the investment fund.","operationId":"InvestNavController_post_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"NAV creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvestNavDto"}}}},"responses":{"201":{"description":"NAV record created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestNavDto"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Create a NAV record","tags":["Invest"]}},"/v1/invest/funds/{fundId}/nav/{id}":{"get":{"description":"Fetch a specific NAV record by ID.","operationId":"InvestNavController_getOne_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the NAV record","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"NAV record retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestNavDto"}}}}},"security":[{"api_key":[]}],"summary":"Get a NAV record","tags":["Invest"]},"delete":{"description":"Delete a NAV record by ID.","operationId":"InvestNavController_delete_v1","parameters":[{"name":"fundId","required":true,"in":"path","description":"The unique identifier of the investment fund","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the NAV record to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"NAV record deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestNavDto"}}}},"400":{"description":"Cannot delete the oldest NAV record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Delete a NAV record","tags":["Invest"]}},"/v1/invest/offers":{"get":{"description":"List all secondary market offers. Use fund.id filter to scope by fund.","operationId":"InvestOfferController_getAll_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["fund.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"fund.id"},{"type":"object","properties":{"field":{"type":"string","enum":["identity.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"identity.id"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["BUY","SELL"]}},"required":["field","operator","value"],"title":"type"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["fund.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"fund.id"},{"type":"object","properties":{"field":{"type":"string","enum":["identity.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"identity.id"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["BUY","SELL"]}},"required":["field","operator","value"],"title":"type"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","price","shares","type","expiresAt","createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of offers retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestOfferDto"}}}}},"security":[{"bearer":[]}],"summary":"List secondary market offers","tags":["Invest"]},"post":{"description":"Create a buy or sell offer on the secondary market. For sell offers, lockup periods and share balance are verified.","operationId":"InvestOfferController_post_v1","parameters":[],"requestBody":{"required":true,"description":"Offer creation data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvestOfferDto"}}}},"responses":{"201":{"description":"Offer created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestOfferDto"}}}},"400":{"description":"Invalid input data or business rule violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Create a secondary market offer","tags":["Invest"]}},"/v1/invest/offers/{id}":{"get":{"description":"Fetch a specific secondary market offer by ID.","operationId":"InvestOfferController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the offer","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Offer retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestOfferDto"}}}}},"security":[{"bearer":[]}],"summary":"Get a secondary market offer","tags":["Invest"]},"patch":{"description":"Update the number of shares or unit price of an offer.","operationId":"InvestOfferController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the offer","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Offer update data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInvestOfferDto"}}}},"responses":{"200":{"description":"Offer updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestOfferDto"}}}},"400":{"description":"Invalid input data or business rule violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Update a secondary market offer","tags":["Invest"]},"delete":{"description":"Permanently delete a secondary market offer.","operationId":"InvestOfferController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the offer to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Offer deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestOfferDto"}}}}},"security":[{"bearer":[]}],"summary":"Delete a secondary market offer","tags":["Invest"]}},"/v1/invest/investor/transactions":{"get":{"description":"List transactions where the current investor is either the buyer or the seller. Sorted by createdAt desc by default.","operationId":"InvestTransactionInvestorController_getMine_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["fund.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"fund.id"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["INITIAL_DISTRIBUTION","BUY_BACK","SECONDARY_MARKET"]}},"required":["field","operator","value"],"title":"type"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["PENDING","VALIDATED","REJECTED"]}},"required":["field","operator","value"],"title":"status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["fund.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"fund.id"},{"type":"object","properties":{"field":{"type":"string","enum":["type"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["INITIAL_DISTRIBUTION","BUY_BACK","SECONDARY_MARKET"]}},"required":["field","operator","value"],"title":"type"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["PENDING","VALIDATED","REJECTED"]}},"required":["field","operator","value"],"title":"status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt","createdAt","shares","price"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of transactions retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedInvestTransactionDto"}}}}},"security":[{"bearer":[]}],"summary":"List the current investor's transactions","tags":["Invest"]}},"/v1/agent-wallets":{"get":{"description":"List agent wallets for the current organization.","operationId":"AgentWalletController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["label"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"label"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["deploying","ready","active","failed"]}},"required":["field","operator","value"],"title":"status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["label"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"label"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["deploying","ready","active","failed"]}},"required":["field","operator","value"],"title":"status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of agent wallets retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAgentWalletDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List agent wallets","tags":["Agent Wallets"],"x-mcp-name":"list_wallets","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"post":{"description":"Create a new agent wallet for an application in the current organization.","operationId":"AgentWalletController_create_v1","parameters":[],"requestBody":{"required":true,"description":"Agent wallet data to create","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentWalletDto"}}}},"responses":{"201":{"description":"Agent wallet created successfully. The first signer is provisioned by the deploy consumer; once it transitions to \"ready\", its apiKey and invitation secret are available via GET /agent-wallets/:id/signers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletDto_Output"}}}},"422":{"description":"Owner is not a member of the organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create an agent wallet","tags":["Agent Wallets"],"x-mcp-name":"create_wallet","x-mcp-output-schema":true,"x-mcp-type":"Tool"}},"/v1/agent-wallets/intents":{"get":{"description":"List policy intents across all agent wallets of an application, for human review (pending approvals and history). Narrow to one agent wallet with `walletId`; a wallet outside the application returns an empty page.","operationId":"AgentWalletController_listIntents_v1","parameters":[{"name":"applicationId","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"walletId","required":false,"in":"query","description":"Only the intents of this agent wallet. A wallet outside the application returns an empty page.","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},{"name":"state","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["pending_human_approval","approved","declined","abandoned","consumed","expired","failed"]}}},{"name":"currentPage","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"Paginated list of intents with their owning wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAgentWalletIntentDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List agent wallet intents","tags":["Agent Wallets"],"x-mcp-name":"list_wallet_payments","x-mcp-output-schema":true,"x-mcp-type":"Resource"}},"/v1/agent-wallets/sponsor-grant":{"get":{"description":"The organization's welcome offer: Keyban pays the first x402 payments of the wallet that earned it (`walletId` / `walletAddress`, the organization's first Base agent wallet) until the amount is spent or the offer expires. `null` when the organization never received one.","operationId":"AgentWalletController_sponsorGrant_v1","parameters":[{"name":"applicationId","required":true,"in":"query","description":"Application whose organization offer is read","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}}],"responses":{"200":{"description":"Welcome offer, or `null` when the organization has none","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorGrantDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Read the Keyban welcome offer","tags":["Agent Wallets"],"x-mcp-name":"get_wallet_welcome_offer","x-mcp-output-schema":true,"x-mcp-type":"Resource"}},"/v1/agent-wallets/{id}":{"get":{"description":"Fetch a specific agent wallet by ID.","operationId":"AgentWalletController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Agent wallet retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get an agent wallet","tags":["Agent Wallets"],"x-mcp-name":"get_wallet","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"patch":{"description":"Update the label of an agent wallet.","operationId":"AgentWalletController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the agent wallet to update","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Agent wallet data to update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgentWalletDto"}}}},"responses":{"200":{"description":"Agent wallet updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Update an agent wallet","tags":["Agent Wallets"],"x-mcp-name":"update_wallet","x-mcp-output-schema":true,"x-mcp-type":"Tool"},"delete":{"description":"Delete an agent wallet.","operationId":"AgentWalletController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the agent wallet to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Agent wallet deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Delete an agent wallet","tags":["Agent Wallets"],"x-mcp-name":"delete_wallet","x-mcp-output-schema":true,"x-mcp-type":"Tool"}},"/v1/agent-wallets/{walletId}/follower-keys":{"post":{"description":"Creates an organization-scoped API key restricted to `agentWallet: ['read']`, bound to this wallet via metadata. Hand the returned key to a regular HTTP script to follow the wallet read-only (budget consumption + payment history) — e.g. GET /v1/agent-wallets/expenses/stats and /expenses/transactions. The plaintext `key` is returned ONCE and never again; store it now.","operationId":"AgentWalletFollowerKeyController_create_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The agent wallet the follower key is allowed to read.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFollowerKeyRequestDto"}}}},"responses":{"201":{"description":"Follower key created. `key` is shown only in this response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowerKeyDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Mint a read-only follower API key for an agent wallet","tags":["Agent Wallets"],"x-mcp-name":"create_wallet_follower_key","x-mcp-output-schema":true,"x-mcp-type":"Tool"}},"/v1/agent-wallets/expenses/stats":{"get":{"description":"Spend summary across an application's agent wallets: the current calendar month, or the rolling window starting at `since`. Only the canonical USDC contract is counted; other assets are listed in `excludedAssets`.","operationId":"AgentWalletExpensesController_stats_v1","parameters":[{"name":"applicationId","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"ownerId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"since","required":false,"in":"query","description":"Start of a rolling window ending now (RFC 3339), at most 366 days back. Omit for the current calendar month (UTC).","schema":{"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))$","example":"2026-08-30T00:00:00.000Z","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletExpenseStatsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Agent wallet expense stats","tags":["Agent Wallets"]}},"/v1/agent-wallets/expenses/daily":{"get":{"description":"Average daily spend per agent wallet over the last 7 days — falling back to 30 when the 7-day window is empty — plus the day-by-day series when `agentId` narrows the query to a single wallet. Consumers divide their own balance by this rate to obtain a runway; the API never returns one.","operationId":"AgentWalletExpensesController_daily_v1","parameters":[{"name":"applicationId","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"ownerId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"days","required":false,"in":"query","description":"Length of the returned series, in days ending today (UTC). Ignored for the per-wallet rates, which always use their own 7/30-day windows.","schema":{"minimum":7,"maximum":90,"default":30,"example":30,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletDailySpendDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Agent wallet daily spend","tags":["Agent Wallets"]}},"/v1/agent-wallets/expenses/daily-rates":{"get":{"description":"Average daily spend of every deployed agent wallet of the organization, all applications and networks together, over the last 7 days — falling back to 30 when the 7-day window is empty. Feeds the treasury fleet runway.","operationId":"AgentWalletExpensesController_dailyRates_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletDailyRatesDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Agent wallet daily rates across the organization","tags":["Agent Wallets"]}},"/v1/agent-wallets/expenses/destinations":{"get":{"description":"Distinct x402 destination hosts paid by an application's agent wallets, for the Expenses destination filter.","operationId":"AgentWalletExpensesController_destinations_v1","parameters":[{"name":"applicationId","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"ownerId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseDestinationsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Agent wallet expense destinations","tags":["Agent Wallets"]}},"/v1/agent-wallets/expenses/transactions":{"get":{"description":"Canonical USDC transfers across an application's agent wallets, newest first. Any other asset, native coin included, is left out: an airdropped lookalike token never shows up in the history. A payment Keyban covered from its welcome offer leaves the Keyban sponsor wallet and is listed with `sponsored: true`. The welcome offer itself is listed once at its grant date as a `sponsor-grant` row, with no amount and left out of the totals, on the offer network and only when neither `direction` nor `destination` narrows the list.","operationId":"AgentWalletExpensesController_transactions_v1","parameters":[{"name":"applicationId","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"ownerId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"destination","required":false,"in":"query","description":"Filter to outgoing payments whose x402 destination host matches this value (the seller host, e.g. \"api.shop.example.com\"). Resolved to the set of on-chain recipient addresses of matching consumed intents. Omit for all destinations.","schema":{"minLength":1,"maxLength":255,"example":"api.shop.example.com","type":"string"}},{"name":"direction","required":false,"in":"query","description":"Restrict to outgoing payments (\"out\") or incoming funds (\"in\"). Omit for both.","schema":{"example":"out","type":"string","enum":["out","in"]}},{"name":"currentPage","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAggregatedTransactionDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Aggregated agent wallet transactions","tags":["Agent Wallets"]}},"/v1/agent-wallets/expenses/transactions/export":{"get":{"description":"Canonical USDC transfers across an application's agent wallets within a required date range (inclusive days), honouring the agent/owner/destination filters. One row per transfer, plus an information row without amount for the Keyban welcome offer when it was granted in the range (no destination filter). Capped: a range matching more than 50,000 transfers is refused (narrow the range) rather than truncated.","operationId":"AgentWalletExpensesController_exportTransactions_v1","parameters":[{"name":"applicationId","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"ownerId","required":false,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"destination","required":false,"in":"query","description":"Same x402 destination-host filter as the transactions list.","schema":{"minLength":1,"maxLength":255,"example":"api.shop.example.com","type":"string"}},{"name":"from","required":true,"in":"query","description":"Inclusive start of the export window (YYYY-MM-DD, UTC). Required — exports are always bounded to keep them small.","schema":{"format":"date","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])))$","example":"2026-07-01","type":"string"}},{"name":"to","required":true,"in":"query","description":"Inclusive end of the export window (YYYY-MM-DD, UTC). Must be on or after `from`. The whole `to` day is included.","schema":{"format":"date","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])))$","example":"2026-07-31","type":"string"}}],"responses":{"200":{"description":"CSV file generated successfully"},"400":{"description":"Range too large, or from after to","content":{"text/csv":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Export agent wallet transactions as CSV","tags":["Agent Wallets"]}},"/v1/agent-wallets/{walletId}/signers":{"get":{"description":"List all signers attached to the given agent wallet.","operationId":"SignerController_get_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"List of signers retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SignerDto"}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List signers of an agent wallet","tags":["Agent Wallet Signers"],"x-mcp-cli-only":true,"x-mcp-name":"list_wallet_signers","x-mcp-type":"Resource"},"post":{"description":"Create a new signer attached to an agent wallet.","operationId":"SignerController_create_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Signer data to create","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSignerDto"}}}},"responses":{"201":{"description":"Signer created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignerDto"}}}},"409":{"description":"Signer cannot be added while the wallet is deploying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create a signer","tags":["Agent Wallet Signers"]}},"/v1/agent-wallets/{walletId}/signers/{id}":{"get":{"description":"Fetch a specific signer of an agent wallet by ID.","operationId":"SignerController_getOne_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the signer","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Signer retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignerDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get a signer","tags":["Agent Wallet Signers"],"x-mcp-cli-only":true,"x-mcp-name":"get_wallet_signer","x-mcp-type":"Resource"},"patch":{"description":"Update the name of a signer.","operationId":"SignerController_patch_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the signer","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Signer data to update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSignerDto"}}}},"responses":{"200":{"description":"Signer updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignerDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Update a signer","tags":["Agent Wallet Signers"]},"delete":{"description":"Mark the signer as deleting and enqueue a job to remove it asynchronously.","operationId":"SignerController_delete_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the signer","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Signer marked as deleting","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignerDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Delete a signer","tags":["Agent Wallet Signers"]}},"/v1/agent-wallets/{walletId}/signers/{id}/mcpb":{"get":{"description":"Download a self-contained, drag-and-drop installable Claude Desktop bundle (.mcpb) for the signer, with the wallet's credentials pre-filled.","operationId":"SignerController_downloadMcpb_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the agent wallet","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","description":"The unique identifier of the signer","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Personalized .mcpb bundle"},"409":{"description":"Signer credentials are not provisioned yet","content":{"application/octet-stream":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"500":{"description":"MCP bundle template unavailable","content":{"application/octet-stream":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Download the signer MCP bundle (.mcpb)","tags":["Agent Wallet Signers"]}},"/v1/agent-wallets/{walletId}/signers/{id}/regenerate":{"post":{"description":"Rotates the on-chain pending commitment to a fresh ECDSA address. Allowed only while the signer is `Ready` (commitment unconsumed).","operationId":"SignerRegenerateController_regenerate_v1","parameters":[{"name":"walletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"description":"Regenerate enqueued. Poll GET /agent-wallets/:walletId/signers/:id/regenerate/:jobId for completion.","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"}}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Regenerate a signer invitation","tags":["Agent Wallet Signers"]}},"/v1/agent-wallets/{walletId}/signers/{id}/regenerate/{jobId}":{"get":{"operationId":"SignerRegenerateController_getJob_v1","parameters":[{"name":"walletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"id","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","enum":["pending","broadcasting","confirmed","failed"]},"error":{"type":"string","nullable":true}}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get the state of a regenerate job","tags":["Agent Wallet Signers"]}},"/v1/agent-wallets/register-signer":{"post":{"description":"Called by the agent (via MCP) after FROST DKG. Enqueues a job that broadcasts SchnorrAccount.registerSigner(frostBytes, signature) to consume the on-chain commitment and add the agent as a signer. The signature must be made by the corresponding KEYBAN_INVITE_KEY over keccak256(abi.encode(chainId, walletAddress, frostBytes)). Returns immediately with a jobId — poll GET /agent-wallets/register-signer/:jobId for status. A registration is attempted up to 3 times (2 retries, exponential backoff from 2 s); one the contract rejects for good (malformed signature or signer already registered) fails without retry.","operationId":"SignerRegisterController_register_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequestDto"}}}},"responses":{"202":{"description":"Job enqueued. Poll GET /agent-wallets/register-signer/:jobId for completion.","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"}}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Submit a FROST signer for on-chain registration","tags":["Agent Wallet Signers"]}},"/v1/agent-wallets/register-signer/{jobId}":{"get":{"description":"Polled by the agent to follow up on the registration. Returns the BullMQ job state mapped to a domain state (pending/broadcasting/confirmed/failed/unknown). `pending` also covers the wait between two attempts; `failed` is final. On `confirmed`, includes the on-chain transaction hash, empty when another job registered the signer. On `failed`, includes the error message.","operationId":"SignerRegisterController_getJob_v1","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Current job state.","content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","enum":["pending","broadcasting","confirmed","failed","unknown"]},"txHash":{"type":"string","nullable":true},"error":{"type":"string","nullable":true}}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get the state of a register-signer job","tags":["Agent Wallet Signers"]}},"/v1/billing/feature-labels":{"get":{"description":"Returns the display label of every plan feature and of every value code, in the requested language.\n\nSurfaces rendering the pricing comparison table read identifiers from `/v1/billing/plans` and their wording here, so the same words are served to every surface.\n\nThe language comes from the `locale` query parameter when present, otherwise from the request cascade (user preference, organization default, `Accept-Language`), otherwise `en-US`.\n\nThe dictionary is complete: it covers features no plan carries an entitlement for, which the table still renders as \"custom\" or \"not available\".","operationId":"FeatureLabelsController_getLabels_v1","parameters":[{"name":"locale","required":false,"in":"query","schema":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT"]}}],"responses":{"200":{"description":"Labels listed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureLabelsResponseDto"}}}}},"summary":"Display labels for plan features and their values","tags":["Billing"]}},"/v1/billing/plans":{"get":{"description":"Returns the list of active subscription plans available for onboarding.\n\n`description` is served in the requested language: the `locale` query parameter when present, otherwise the request cascade (user preference, organization default, `Accept-Language`), otherwise `en-US`. `name` comes from the Chargebee item (`external_name`) and carries no vertical prefix.\n\nFeature wording is not included: read `GET /v1/billing/feature-labels` for the label, type and unit of every `features[].id`.","operationId":"PlansController_listPlans_v1","parameters":[{"name":"locale","required":false,"in":"query","schema":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT"]}}],"responses":{"200":{"description":"Plans listed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPlansResponseDto"}}}}},"summary":"List available Chargebee plans","tags":["Billing"]}},"/v1/billing/plans/change-request":{"post":{"description":"Sends an email to the sales team with the plan change request details.","operationId":"PlansController_submitChangePlanRequest_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanRequestDto"}}}},"responses":{"200":{"description":"Request submitted successfully"}},"security":[{"bearer":[]}],"summary":"Submit a plan change request","tags":["Billing"]}},"/v1/billing/portal-session":{"post":{"description":"Creates a Chargebee self-service portal session for the current organization. Returns a URL to redirect the user to.","operationId":"PortalController_createPortalSession_v1","parameters":[],"responses":{"200":{"description":"Portal session URL returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalSessionResponseDto"}}}},"400":{"description":"Organization has no Chargebee customer ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Create Chargebee portal session","tags":["Billing"]}},"/v1/billing/upgrade/checkout":{"post":{"description":"Creates a Chargebee hosted page that changes the organization's existing subscription to a paid plan of the same vertical. Refuses any target that is not a strict upgrade — a downgrade, a cross-vertical plan, or Enterprise. An organization that signed up to the free Agent Wallet trial must also send its billing identity in `customer`: it is written to Chargebee, then the trial ends on the hosted page (or a new subscription is opened if the trial subscription is already cancelled).","operationId":"UpgradeController_createUpgradeCheckout_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeCheckoutRequestDto"}}}},"responses":{"200":{"description":"Upgrade checkout URL returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeCheckoutResponseDto"}}}},"400":{"description":"Organization has no active Chargebee subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"Not an upgrade of the current plan (BILLING_UPGRADE_NOT_ALLOWED), billing identity missing for the first paid plan of a trial organization (BILLING_UPGRADE_IDENTITY_REQUIRED), identity inconsistent, or company closed (ONBOARDING_COMPANY_CLOSED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Create a self-serve upgrade checkout","tags":["Billing"]}},"/v1/billing/upgrade/complete":{"post":{"description":"Reconciles the subscription change after the Chargebee hosted page redirects back, and returns the plan now active. Idempotent — calling it twice for the same hosted page yields the same result.","operationId":"UpgradeController_completeUpgrade_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeCompleteRequestDto"}}}},"responses":{"200":{"description":"Upgrade applied, plan now active on the subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeCompleteResponseDto"}}}},"400":{"description":"Checkout not completed, or no Chargebee customer linked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"403":{"description":"Hosted page does not belong to this organization's customer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Complete a self-serve upgrade","tags":["Billing"]}},"/v1/multisig-wallets":{"get":{"description":"List the organization multisig wallets (admin treasuries), one per network at most. Each entry carries two caller-relative flags: `mayEnroll`, which answers \"can **you**, the caller, enrol a key here?\", and `awaitingMySignature`, which answers \"does a transfer here wait for **your** signature?\" — both always `false` for an API key.","operationId":"MultisigWalletController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["network"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]}},"required":["field","operator","value"],"title":"network"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["awaiting_signer","deploying","active","failed"]}},"required":["field","operator","value"],"title":"status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["network"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]}},"required":["field","operator","value"],"title":"network"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["awaiting_signer","deploying","active","failed"]}},"required":["field","operator","value"],"title":"status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of multisig wallets retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMultisigWalletDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List multisig wallets","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"post":{"description":"Create the organization multisig wallet for a network, with the number of signatures a transfer will require (M of N). Nothing is deployed on-chain yet: the account is created once M signers have bound a key from the signer app and been validated — its address and threshold are fixed at that point. Available from the Agent Wallet Growth plan, or on a grant by Keyban.","operationId":"MultisigWalletController_create_v1","parameters":[],"requestBody":{"required":true,"description":"Multisig wallet data to create","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMultisigWalletDto"}}}},"responses":{"201":{"description":"Multisig wallet created, awaiting its signers. The creator is invited to enrol on it as part of the same transaction (enrolment is invitation-only), without a mail to themselves. Any `invitedEmails` are processed after the wallet exists and never affect this status: a rejected address or a mail outage still returns the treasury.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigWalletDto_Output"}}}},"403":{"description":"Session-authenticated user required (`MULTISIG_WALLET_SESSION_REQUIRED`), the plan does not include the treasury (Agent Wallet Growth and above) and Keyban granted none (`QUOTA_FEATURE_RESTRICTED`), or the network is not allowed for the organization (`QUOTA_NETWORK_RESTRICTED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The organization already has a multisig wallet on this network — including a `failed` one, which keeps the slot until deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create a multisig wallet","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/holdings-history":{"get":{"description":"Daily snapshots of the USDC held by each treasury and by the agent wallets of the same network, captured once a day (00:10 UTC). Feeds the treasury dashboard curve. Defaults to the last 90 days. Not exposed as an MCP tool: this is an admin dashboard aggregate, with no agent use case. Returns `{ snapshots }` rather than the paginated `{ data, total }` shape, since the window is bounded to 366 days.","operationId":"MultisigWalletController_getHoldingsHistory_v1","parameters":[{"name":"from","required":false,"in":"query","description":"Inclusive first day (YYYY-MM-DD, UTC). Default: 90 days before `to`.","schema":{"format":"date","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])))$","example":"2026-06-05","type":"string"}},{"name":"to","required":false,"in":"query","description":"Inclusive last day (YYYY-MM-DD, UTC). Default: today.","schema":{"format":"date","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])))$","example":"2026-09-03","type":"string"}}],"responses":{"200":{"description":"Snapshots ordered by day then network","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigHoldingsHistoryDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Daily holdings history of the organization","tags":["Multisig Wallets"]}},"/v1/multisig-wallets/movements":{"get":{"description":"Transfers out of every organization treasury (any status, approvers included) and incoming USDC, newest first, over the last `days` days (default 90). `walletId` narrows to one treasury. Not exposed as an MCP tool: admin dashboard aggregate. Returns `{ movements, truncated, failedNetworks }`, bounded by the window. Incoming rows are USDC received on chain, labelled `card` when the transaction is an onramp delivery, `agent` when sent by an agent wallet of the organization, `external` otherwise. Capped at 500 outgoing transfers and 500 incoming per treasury, newest first: `truncated` is true when a cap was hit and older movements of the window are missing. `failedNetworks` lists the networks whose indexer could not be read, whose incoming movements are then missing.","operationId":"MultisigWalletController_getMovements_v1","parameters":[{"name":"walletId","required":false,"in":"query","description":"Restrict to one treasury","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}},{"name":"days","required":false,"in":"query","description":"Window ending now","schema":{"minimum":1,"maximum":366,"default":90,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreasuryMovementsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Treasury movements of the organization","tags":["Multisig Wallets"]}},"/v1/multisig-wallets/{id}":{"get":{"description":"Fetch a specific multisig wallet by ID. Its `mayEnroll` and `awaitingMySignature` flags are relative to the caller, not to the treasury: they say whether **this** session user may enrol a signing key here, and whether a transfer is waiting for their signature.","operationId":"MultisigWalletController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Multisig wallet retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigWalletDto_Output"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get a multisig wallet","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"delete":{"description":"Delete a multisig wallet that was never deployed on-chain. Once the deployment started, the wallet cannot be deleted.","operationId":"MultisigWalletController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"The unique identifier of the multisig wallet to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Multisig wallet deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigWalletDto_Output"}}}},"409":{"description":"The wallet is (being) deployed on-chain and cannot be deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Delete a multisig wallet","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/signers":{"get":{"description":"List the organization members enrolled as signers of the wallet with their enrollment status. The address of an enrollment still awaiting validation is withheld: the SAS a validator types derives from it, so serving it would replace the comparison with the candidate's phone.","operationId":"MultisigSignerController_get_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"List of signers retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMultisigSignerDto_Output"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List multisig wallet signers","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"post":{"description":"Enroll the authenticated admin as a signer, with either the address of a secp256k1 key or the P-256 public key of a passkey their signer app just created. Nothing happens on-chain yet: the enrollment waits for a peer validation (`requested` → `validated`), except for the wallet creator, who is validated on the spot since no peer can vouch for the first signer. Reaching the threshold in `validated` signers triggers the deployment; on an already-deployed wallet, a validation queues an operator `addSigners` instead. The address is withheld from reads until the enrollment is validated.","operationId":"MultisigSignerController_create_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollMultisigSignerDto"}}}},"responses":{"202":{"description":"Enrollment recorded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerDto_Output"}}}},"400":{"description":"Malformed body, or not exactly one of `address` (EOA) and `publicKey` (passkey) was provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"403":{"description":"Session-authenticated user required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The admin or the key is already enrolled on this wallet, or the network has no WebAuthn verifier for a passkey enrollment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"The submitted address is the treasury itself, or the public key is not a valid P-256 point","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Bind a signing key to a multisig wallet","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/signers/{signerId}/challenge":{"post":{"description":"Draw a fresh validator nonce for a pending enrollment — the second half of the SAS input. Only a signer already on the wallet can challenge. The candidate app reads the returned nonce to display its 4-digit code; a new challenge drops any earlier reveal so a stale nonce can never validate.","operationId":"MultisigSignerController_challenge_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"signerId","required":true,"in":"path","description":"The enrollment to challenge","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Challenge opened","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeMultisigSignerDto_Output"}}}},"403":{"description":"Caller is not a signer of this wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet or enrollment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The enrollment is not awaiting validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Open the validation ceremony for a signer enrollment","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/signers/{signerId}/reveal":{"post":{"description":"The candidate reveals the nonce it committed to at enrollment. Accepted only during a live challenge, only on the candidate’s own row, and only if it reproduces the commitment. Once revealed, the 4-digit code is derivable and the validator can confirm it.","operationId":"MultisigSignerController_reveal_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"signerId","required":true,"in":"path","description":"The caller’s own enrollment","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealMultisigSignerDto"}}}},"responses":{"200":{"description":"Nonce revealed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerDto_Output"}}}},"404":{"description":"Multisig wallet or enrollment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"No live challenge, or the enrollment is not awaiting validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"The revealed nonce does not match the commitment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Reveal the enrollment nonce","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/signers/{signerId}/validation":{"post":{"description":"Confirm a pending enrollment with the 4-digit code read off the\ncandidate's phone. Only a signer already on the wallet can validate, and\nthe enrollment must have been challenged and revealed first.\n\nWhat this catches: a candidate identity substituted between the two\nphones, and plain human error — the API withholds the identity of a\n`requested` enrollment precisely so the code cannot be read off a screen\ninstead of the other phone, and the engagement–reveal keeps the short\ncode from being ground: a wrong code **burns** the enrollment.\nWhat it does **not** catch: a signer who is themselves the attacker. One\nvalidation admits a key, so a single compromised signer can grow the set\nwith keys they control. Raising the admission quorum and notifying every\nsigner on each validation are tracked as hardening.","operationId":"MultisigSignerController_validate_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"signerId","required":true,"in":"path","description":"The enrollment to validate","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateMultisigSignerDto"}}}},"responses":{"200":{"description":"Enrollment validated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerDto_Output"}}}},"403":{"description":"Caller is not a signer of this wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet or enrollment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The enrollment is not awaiting validation, or was not challenged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"Wrong code — the enrollment is burned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Validate a signer enrollment","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/signers/{signerId}/retry":{"post":{"description":"Replay the on-chain `addSigners` of a signer whose add failed for good — a broadcast that never landed, most often. The key itself is unchanged: the phone keeps it, only the on-chain registration is replayed, so the operation is safe to repeat.","operationId":"MultisigSignerController_retry_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"signerId","required":true,"in":"path","description":"The failed signer to add again","schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"description":"On-chain add queued again","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerDto_Output"}}}},"404":{"description":"Multisig wallet or signer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The signer has not failed, or the wallet is not deployed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Retry a failed signer add","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/signers/{signerId}":{"delete":{"description":"Drop an enrollment still awaiting validation — a mistyped address, or a key the admin re-minted. A validated or active signer cannot be dropped this way: its key is (or is about to be) in the on-chain signer set, which needs a revocation.","operationId":"MultisigSignerController_delete_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"signerId","required":true,"in":"path","description":"The enrollment to cancel","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Enrollment cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerDto_Output"}}}},"404":{"description":"Multisig wallet or enrollment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The enrollment is already validated or active","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Cancel a signer enrollment","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/intents":{"post":{"description":"Create a lot of 1 to 20 USDC transfers from the organization treasury,\nand open the signing window. Each leg names EITHER an agent wallet of\nthe organization OR a contact of this treasury address book — never a\nraw address. The lot is ONE signing subject: a single signature per\nsigner covers every leg, and execution is atomic — every leg lands or\nnone does. Nothing moves yet: the lot broadcasts once the wallet\nthreshold of signatures is collected from the signer apps.\n\nThe server owns every calldata — each leg is rebuilt from its validated\ndestination and amount — so this endpoint can only ever move USDC to an\nagent wallet of the caller organization or a contact of this treasury,\nnever an arbitrary address. The response carries the structured\npre-image (`transfers`, `relayNonce`, `relayHash`): a signer app **must**\nrecompute the hash locally from those fields — the leg order is part of\nit — and refuse to sign on a mismatch, so a tampered server cannot get\nsomething else signed. Each leg also carries `destinationLabel`,\n`destinationKind` and `destinationFirstUse`, resolved from the frozen\naddress at read time for display only, and the lot carries `fiat`, an\nindicative rate in the organization display currency: all of them are\noutside the signed pre-image and must never enter that computation.\n\nOne live lot per treasury: the signatures are bound to a single account\nnonce, so a second concurrent intent could never both execute. A previous\nintent whose outcome is undetermined (`unknown`) must be reconciled\nfirst. The creation is also refused when the treasury balance visibly\ncannot cover the lot total.","operationId":"MultisigIntentController_create_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet to debit","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMultisigIntentDto"}}}},"responses":{"201":{"description":"Transfer awaiting signatures","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigIntentDto_Output"}}}},"403":{"description":"Session-authenticated user required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"A transfer is already awaiting signatures or unresolved, the treasury is not active, or no known USDC on this network","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"Invalid transfer destination, or the lot exceeds the treasury's USDC balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Open a treasury transfer lot for signature","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"get":{"description":"Transfer history of the treasury, most recent first: what is awaiting signatures, what executed, and what failed or expired. Reading also repairs the live transfer, exactly as the detail endpoint does: an `unknown` one is reconciled against the chain, a `broadcasting` one with no relay behind it is queued again.","operationId":"MultisigIntentController_get_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"List of transfers retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMultisigIntentDto_Output"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List treasury transfers","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/intents/{intentId}":{"get":{"description":"Full state of one transfer, including the signing pre-image and how many signatures it has collected. Reading also repairs: an `unknown` transfer is reconciled against the chain, and one left `broadcasting` with no relay behind it is queued again — so polling this endpoint, or the list, is what frees the treasury's transfer slot.","operationId":"MultisigIntentController_getOne_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"intentId","required":true,"in":"path","description":"The transfer to read","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Transfer retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigIntentDto_Output"}}}},"404":{"description":"Multisig wallet or transfer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get a treasury transfer","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"delete":{"description":"Drop a transfer still collecting signatures and purge the signatures already collected. Once the threshold is reached the relay owns it and cancelling is refused — a complete envelope stays valid on chain until the account nonce moves.","operationId":"MultisigIntentController_delete_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"intentId","required":true,"in":"path","description":"The transfer to cancel","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Transfer cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigIntentDto_Output"}}}},"404":{"description":"Multisig wallet or transfer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"The transfer no longer collects signatures","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Cancel a treasury transfer","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/intents/{intentId}/approvals":{"post":{"description":"Add the calling signer’s signature over the transfer `relayHash`, in\nthe form the enrolled key produces. An `eoa` signer submits a 65-byte\nsecp256k1 signature over the **raw** hash (`sign({ hash })`, never an\nEIP-191 personal_sign digest — the account recovers with\n`ECDSA.tryRecover` on the hash itself). A `webauthn` signer submits the\nabi-encoded passkey assertion whose clientDataJSON challenge is\n`base64url(relayHash)`, verified server-side exactly as the on-chain\nverifier will. The signer must be `active` — validated but not yet on\nchain is not enough, the account would reject it.\n\nThe signature that completes the threshold hands the transfer to the\nrelay; from then on it can no longer be cancelled.","operationId":"MultisigIntentController_approve_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"intentId","required":true,"in":"path","description":"The transfer to sign","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveMultisigIntentDto"}}}},"responses":{"202":{"description":"Signature recorded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigIntentDto_Output"}}}},"403":{"description":"Caller is not an active signer of this treasury","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet or transfer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"Already signed, or the transfer no longer collects signatures","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"The signature does not come from the caller’s signing key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Sign a treasury transfer","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/invitations":{"get":{"description":"List the organization members asked to enrol a signing key on the wallet. Consumed invitations are listed too, with their `consumedAt` set: they are the trace of who was asked and answered, and the client decides whether to show them.","operationId":"MultisigInvitationController_get_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"List of invitations retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMultisigSignerInvitationDto_Output"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List multisig wallet signer invitations","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"post":{"description":"Ask an organization member to hold one of the treasury signing keys, and email them about it. The invitation is a request, not a credential: it grants nothing, and the invitee still enrols under their own session and still gets validated out of band by a peer. Only an existing `admin` or `owner` can be invited — anyone else has no session to enrol with, so their invitation could never be honoured.","operationId":"MultisigInvitationController_create_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteMultisigSignerDto"}}}},"responses":{"201":{"description":"Invitation recorded, and emailed to the member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerInvitationDto_Output"}}}},"400":{"description":"The email matches no `admin` or `owner` of the organization — invite them to the organization first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"403":{"description":"Session-authenticated user required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"That member already has a pending invitation, or is already a signer of this treasury","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Invite a member to enrol a signing key","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/invitations/{invitationId}":{"delete":{"description":"Drop an invitation — a wrong recipient, or a colleague who will not hold a key after all. Nothing on-chain depends on it, and the member keeps whatever they already enrolled: withdrawing an invitation never removes a signer, which needs a revocation.","operationId":"MultisigInvitationController_delete_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"invitationId","required":true,"in":"path","description":"The invitation to withdraw","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Invitation withdrawn","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigSignerInvitationDto_Output"}}}},"404":{"description":"Multisig wallet or invitation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Withdraw a signer invitation","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/contacts":{"get":{"description":"List the named destinations this treasury can transfer to. Archived contacts are left out: they can no longer receive anything, and only exist to keep naming the transfers they already received.","operationId":"MultisigContactController_get_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"List of contacts retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMultisigContactDto_Output"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List treasury contacts","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"post":{"description":"Name a destination so the treasury can transfer to it. Reserved to a signer holding an active key here: naming an address is the durable trust decision, where a transfer is only a proposal that the signature threshold still gates. The address is stored lowercase, and a mixed-case input has its EIP-55 checksum verified — a hand-retyped address fails it. It cannot be changed afterwards: archive the contact and add a new one, which is what puts \"never used\" back in front of the signers.","operationId":"MultisigContactController_create_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMultisigContactDto"}}}},"responses":{"201":{"description":"Contact added","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigContactDto_Output"}}}},"403":{"description":"Session-authenticated signer of this treasury required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"Multisig wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"A live contact already holds this address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"Malformed address, failed checksum, zero address, or the treasury own address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Add a treasury contact","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/multisig-wallets/{walletId}/contacts/{contactId}":{"patch":{"description":"Change the name of a destination. The ADDRESS is immutable by design: redirecting a name that signers have come to trust is the very attack the address book exists against. Archive the contact and add a new one.","operationId":"MultisigContactController_patch_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"contactId","required":true,"in":"path","description":"The unique identifier of the contact","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameMultisigContactDto"}}}},"responses":{"200":{"description":"Contact renamed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigContactDto_Output"}}}},"403":{"description":"Session-authenticated signer of this treasury required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"No live contact with this id on this treasury","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Rename a treasury contact","tags":["Multisig Wallets"],"x-mcp-output-schema":true},"delete":{"description":"Retire a destination. The contact stops being a possible target and leaves the transfer form, but is kept: it is what still names the transfers it already received in the history. Its address becomes free to be named again.","operationId":"MultisigContactController_delete_v1","parameters":[{"name":"walletId","required":true,"in":"path","description":"The unique identifier of the multisig wallet","schema":{"format":"uuid","type":"string"}},{"name":"contactId","required":true,"in":"path","description":"The unique identifier of the contact","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Contact archived","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultisigContactDto_Output"}}}},"403":{"description":"Session-authenticated signer of this treasury required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"No live contact with this id on this treasury","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Archive a treasury contact","tags":["Multisig Wallets"],"x-mcp-output-schema":true}},"/v1/push-tokens":{"post":{"description":"Bind the Expo push token of the calling device to the authenticated user. Idempotent on the token: re-registering refreshes `lastSeenAt` and re-binds it to the caller, so a phone changing hands never keeps notifying its previous owner's account.","operationId":"PushTokenController_register_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPushTokenDto"}}}},"responses":{"201":{"description":"Device registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushTokenDto"}}}},"403":{"description":"Session-authenticated user required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Register this device for push notifications","tags":["Push"]}},"/v1/push-tokens/{token}":{"delete":{"description":"Drop a push token at sign-out. Scoped to the calling user: nobody can unregister another user's device.","operationId":"PushTokenController_unregister_v1","parameters":[{"name":"token","required":true,"in":"path","description":"The Expo push token to drop","schema":{"type":"string"}}],"responses":{"200":{"description":"Device unregistered"},"403":{"description":"Session-authenticated user required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"bearer":[]}],"summary":"Unregister this device","tags":["Push"]}},"/v1/exchange-rate/convert":{"get":{"description":"Quotes the given on-chain amount in the requested fiat currency via the rate oracle. Used to show wallet balances in the application preferred currency. The value is returned in reference sub-units (centi-units of the currency).","operationId":"ExchangeRateController_convert_v1","parameters":[{"name":"asset","required":true,"in":"query","description":"On-chain asset to convert.","schema":{"type":"string","enum":["USDC","ETH"]}},{"name":"amount","required":true,"in":"query","description":"Raw amount to convert, in the asset base units (USDC: 6 decimals, ETH: 18). Passed as a string to preserve bigint precision.","schema":{"maxLength":78,"pattern":"^\\d+$","type":"string"}},{"name":"currency","required":true,"in":"query","description":"Target fiat currency (ISO 4217).","schema":{"type":"string","enum":["EUR","USD","JPY"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRateConversionDto_Output"}}}},"400":{"description":"Invalid query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"503":{"description":"No recent enough exchange rate could be obtained.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Convert an on-chain amount to a fiat currency","tags":["Exchange Rate"],"x-mcp-name":"convert_amount_to_fiat","x-mcp-output-schema":true,"x-mcp-type":"Resource"}},"/v1/applications":{"get":{"description":"List applications owned by the current organization, returning pagination metadata to help choose the right application before managing collections or loyalty settings.","operationId":"ApplicationController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of applications retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedApplicationDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List applications","tags":["Applications"],"x-mcp-name":"list_applications","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"post":{"description":"Create a new application under the current organization to group related resources and integrations.","operationId":"ApplicationController_create_v1","parameters":[],"requestBody":{"required":true,"description":"Application data to create","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationDto"}}}},"responses":{"201":{"description":"Application created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create an application","tags":["Applications"],"x-mcp-name":"create_application","x-mcp-output-schema":true,"x-mcp-type":"Tool"}},"/v1/applications/{appId}":{"get":{"description":"Fetch a specific application by ID to inspect its configuration or attach downstream resources.","operationId":"ApplicationController_getOne_v1","parameters":[{"name":"appId","required":true,"in":"path","description":"The unique identifier of the application","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Application retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDto_Output"}}}}},"security":[{"api_key":[]}],"summary":"Get an application","tags":["Applications"],"x-mcp-name":"get_application","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"patch":{"description":"Update mutable application settings—such as metadata or domains—for the current organization.","operationId":"ApplicationController_patch_v1","parameters":[{"name":"appId","required":true,"in":"path","description":"The unique identifier of the application to update","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Application data to update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApplicationDto"}}}},"responses":{"200":{"description":"Application updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDto_Output"}}}},"409":{"description":"The declared network contradicts the agent wallets already deployed for this application (one network per application).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"422":{"description":"A write-once field was changed: `network` can only go from unset to a value, never from one value to another.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Update an application","tags":["Applications"],"x-mcp-name":"update_application","x-mcp-output-schema":true,"x-mcp-type":"Tool"},"delete":{"description":"Remove an application owned by the current organization and clean up associated loyalty resources.","operationId":"ApplicationController_delete_v1","parameters":[{"name":"appId","required":true,"in":"path","description":"The unique identifier of the application to delete","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Application deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Delete an application","tags":["Applications"],"x-mcp-name":"delete_application","x-mcp-output-schema":true,"x-mcp-type":"Tool"}},"/v1/admin/metrics/loyalty":{"get":{"description":"Retrieve loyalty program metrics including points in circulation, active accounts, visits, tier distribution, and digital wallet pass installation (Google and Apple). Platform admins see all organizations; organization members see only their organization.","operationId":"MetricsController_getLoyaltyMetrics_v1","parameters":[{"name":"startDate","required":false,"in":"query","description":"Start date of the metrics period (inclusive, format: YYYY-MM-DD). Defaults to 30 days before endDate if omitted.","schema":{"format":"date","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])))$","example":"2026-01-01","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date of the metrics period (inclusive, format: YYYY-MM-DD). Defaults to today if omitted.","schema":{"format":"date","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])))$","example":"2026-01-31","type":"string"}},{"name":"applicationId","required":false,"in":"query","description":"Optional application UUID to scope metrics to a single application","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}}],"responses":{"200":{"description":"Loyalty metrics retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LoyaltyMetricsByOrgDto"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Metrics access denied"}},"summary":"Get Loyalty metrics","tags":["Metrics"]}},"/v1/admin/metrics/dpp":{"get":{"description":"Retrieve Digital Product Passport metrics including products by status, minted passports, and retrieval rates. Platform admins see all organizations; organization members see only their organization.","operationId":"MetricsController_getDppMetrics_v1","parameters":[{"name":"startDate","required":false,"in":"query","description":"Start date of the metrics period (inclusive, format: YYYY-MM-DD). Defaults to 30 days before endDate if omitted.","schema":{"format":"date","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])))$","example":"2026-01-01","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date of the metrics period (inclusive, format: YYYY-MM-DD). Defaults to today if omitted.","schema":{"format":"date","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])))$","example":"2026-01-31","type":"string"}},{"name":"applicationId","required":false,"in":"query","description":"Optional application UUID to scope metrics to a single application","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}}],"responses":{"200":{"description":"DPP metrics retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DppMetricsByOrgDto"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Metrics access denied"}},"summary":"Get DPP metrics","tags":["Metrics"]}},"/v1/admin/metrics/trust":{"get":{"description":"Retrieve aggregated AI-visibility audit results for the tracked products of an application: current per-axis scores, movement since each product's baseline audit, and a weekly history. Backed by the persisted weekly audit snapshots — no live scraping happens on this call.","operationId":"MetricsController_getTrustMetrics_v1","parameters":[{"name":"startDate","required":false,"in":"query","description":"Start date of the metrics period (inclusive, format: YYYY-MM-DD). Defaults to 30 days before endDate if omitted.","schema":{"format":"date","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])))$","example":"2026-01-01","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date of the metrics period (inclusive, format: YYYY-MM-DD). Defaults to today if omitted.","schema":{"format":"date","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])))$","example":"2026-01-31","type":"string"}},{"name":"applicationId","required":false,"in":"query","description":"Optional application UUID to scope metrics to a single application","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","type":"string"}}],"responses":{"200":{"description":"Trust metrics retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustMetricsDto"}}}},"400":{"description":"applicationId is missing"},"401":{"description":"Unauthorized"},"403":{"description":"Metrics access denied"}},"summary":"Get AI-visibility trust metrics for an application","tags":["Metrics"]}},"/v1/points-of-sale":{"get":{"description":"Retrieve paginated points of sale for the current organization with filtering support.","operationId":"PointOfSaleAdminController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":"List of points of sale retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPointOfSaleDto"}}}}},"summary":"List points of sale","tags":["Loyalty"]},"post":{"description":"Create a new point of sale for the organization, providing location and configuration data.","operationId":"PointOfSaleAdminController_post_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePointOfSaleDto"}}}},"responses":{"201":{"description":"Point of sale created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointOfSaleDto"}}}}},"summary":"Create a point of sale","tags":["Loyalty"]}},"/v1/points-of-sale/{id}":{"get":{"description":"Fetch details for a specific point of sale owned by the organization.","operationId":"PointOfSaleAdminController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Point of sale retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointOfSaleDto"}}}}},"summary":"Get a point of sale","tags":["Loyalty"]},"patch":{"description":"Update mutable properties of an existing point of sale, such as labels or configuration.","operationId":"PointOfSaleAdminController_patch_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePointOfSaleDto"}}}},"responses":{"200":{"description":"Point of sale updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointOfSaleDto"}}}}},"summary":"Update a point of sale","tags":["Loyalty"]},"delete":{"description":"Delete a point of sale owned by the organization to remove it from future operations.","operationId":"PointOfSaleAdminController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Point of sale deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointOfSaleDto"}}}}},"summary":"Delete a point of sale","tags":["Loyalty"]}},"/v1/agent-wallets/{agentWalletId}/policy":{"get":{"operationId":"WalletPolicyController_get_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get the policy attached to an agent wallet","tags":["Wallet Policy"],"x-mcp-name":"get_wallet_policy","x-mcp-type":"Resource"},"put":{"operationId":"WalletPolicyController_upsert_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertWalletPolicyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create or update the policy attached to an agent wallet","tags":["Wallet Policy"],"x-mcp-name":"set_wallet_policy","x-mcp-type":"Tool"},"delete":{"description":"Clears every cap, threshold and budget, releases the emergency stop and keeps the currency. The policy row itself is kept: an agent wallet always carries a policy, and signing is refused without one.","operationId":"WalletPolicyController_delete_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Reset an agent wallet's policy to an unrestricted one","tags":["Wallet Policy"],"x-mcp-name":"reset_wallet_policy","x-mcp-type":"Tool"}},"/v1/agent-wallets/{agentWalletId}/policy/intents":{"get":{"operationId":"WalletPolicyController_listIntents_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"state","required":false,"in":"query","description":"Optional state filter (e.g. pending_human_approval for the approval queue)","schema":{"enum":["pending_human_approval","approved","declined","abandoned","consumed","expired","failed"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletPolicyIntentDto"}}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List an agent wallet's policy intents (newest first)","tags":["Wallet Policy"]}},"/v1/agent-wallets/{agentWalletId}/policy/intents/{intentId}":{"get":{"operationId":"WalletPolicyController_getIntent_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"intentId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyIntentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get one policy intent with its timeline and current (re-priced) value","tags":["Wallet Policy"],"x-mcp-name":"get_wallet_payment","x-mcp-type":"Resource"}},"/v1/agent-wallets/{agentWalletId}/policy/intents/{intentId}/approve":{"post":{"operationId":"WalletPolicyController_approveIntent_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"intentId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyIntentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Approve a pending require_human intent","tags":["Wallet Policy"]}},"/v1/agent-wallets/{agentWalletId}/policy/emergency-stop":{"post":{"operationId":"WalletPolicyController_engageEmergencyStop_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Engage emergency stop (deny all requests for this wallet)","tags":["Wallet Policy"],"x-mcp-name":"freeze_wallet","x-mcp-type":"Tool"},"delete":{"operationId":"WalletPolicyController_releaseEmergencyStop_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Release emergency stop (re-enable the wallet)","tags":["Wallet Policy"],"x-mcp-name":"unfreeze_wallet","x-mcp-type":"Tool"}},"/v1/agent-wallets/{agentWalletId}/policy/intents/{intentId}/decline":{"post":{"operationId":"WalletPolicyController_declineIntent_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"intentId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletPolicyIntentDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Decline a pending require_human intent","tags":["Wallet Policy"]}},"/v1/policy/evaluate-intent":{"post":{"description":"Evaluates the payment against the wallet policy and stores the decision as an intent.\n\n**Keyban welcome offer.** An agent declaring `capabilities: [\"sponsored-x402\"]` in the request may have an x402 payment paid by Keyban, when the organization offer covers it: only for the wallet that earned the offer (its first Base agent wallet), on the offer network, before expiry and for the whole price.\n\nThe response then carries `sponsored: true`: the envelope `from` is the Keyban sponsor wallet, not the agent wallet, and the agent must not sign it. It fetches the signature from `POST /v1/policy/intents/:id/sponsored-signature` once the intent is approved.\n\nWithout the capability, or when the offer does not cover the payment, `sponsored` is absent and the agent signs from its own wallet as usual.","operationId":"PolicyController_evaluateIntent_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyInputDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyDecisionDto"}}}}},"security":[{"api_key":[]}],"summary":"Pre-flight: store a policy decision for the agent wallet","tags":["Wallet Policy"]}},"/v1/policy/cancel-intent":{"post":{"operationId":"PolicyController_cancelIntent_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelIntentDto"}}}},"responses":{"200":{"description":""}},"security":[{"api_key":[]}],"summary":"Abandon the agent wallet's in-flight intent (releases the lock)","tags":["Wallet Policy"]}},"/v1/policy/intents/{id}/sponsored-signature":{"post":{"description":"Counterpart of the agent signature for an x402 intent the Keyban welcome offer pays (`sponsored: true` at evaluate-intent).\n- 200: the offer was debited, the intent moved `approved → consumed`, and the sponsor signature is returned.\n  Replayable: once the intent was consumed by this endpoint, the same call returns the same signature without a second debit.\n  Resumable: a call interrupted after the debit, on an intent still `approved` and unexpired, resumes on retry without a second debit.\n- 403: the policy refuses (`policy/missing`, `policy/emergency-stop`, or the intent is not `approved`: pending, declined, expired, already consumed…); the reason is `policy/…`.\n- 404: no sponsored intent with this id on the calling wallet.\n- 409 `AGENT_WALLET_SPONSOR_UNAVAILABLE`: the offer can no longer cover the payment (expired, spent, taken by a concurrent payment, or sponsor wallet no longer available); the intent stays `approved` and nothing is debited. Evaluate the payment again.","operationId":"SponsoredSignatureController_sign_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Sponsor signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsoredSignatureDto_Output"}}}},"403":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Sign a sponsored x402 payment with the Keyban sponsor wallet","tags":["Wallet Policy"],"x-mcp-output-schema":true}},"/v1/agent-wallets/{agentWalletId}/destination-rule":{"get":{"operationId":"WalletDestinationRuleController_get_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationRuleDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get the wallet's destination rule","tags":["Destination Rules"],"x-mcp-name":"get_wallet_destination_rule","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"put":{"operationId":"WalletDestinationRuleController_upsert_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertDestinationRuleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationRuleDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create or update the wallet's destination rule","tags":["Destination Rules"],"x-mcp-name":"set_wallet_destination_rule","x-mcp-output-schema":true,"x-mcp-type":"Tool"},"delete":{"operationId":"WalletDestinationRuleController_delete_v1","parameters":[{"name":"agentWalletId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Remove the wallet's destination rule","tags":["Destination Rules"],"x-mcp-name":"delete_wallet_destination_rule","x-mcp-type":"Tool"}},"/v1/applications/{applicationId}/destination-rule":{"get":{"operationId":"ApplicationDestinationRuleController_get_v1","parameters":[{"name":"applicationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationRuleDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get the application's destination rule","tags":["Destination Rules"],"x-mcp-name":"get_application_destination_rule","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"put":{"operationId":"ApplicationDestinationRuleController_upsert_v1","parameters":[{"name":"applicationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertDestinationRuleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationRuleDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create or update the application's destination rule","tags":["Destination Rules"],"x-mcp-name":"set_application_destination_rule","x-mcp-output-schema":true,"x-mcp-type":"Tool"},"delete":{"operationId":"ApplicationDestinationRuleController_delete_v1","parameters":[{"name":"applicationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Remove the application's destination rule","tags":["Destination Rules"],"x-mcp-name":"delete_application_destination_rule","x-mcp-type":"Tool"}},"/v1/organizations/{organizationId}/destination-rule":{"get":{"operationId":"OrganizationDestinationRuleController_get_v1","parameters":[{"name":"organizationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationRuleDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get the organisation's destination rule","tags":["Destination Rules"],"x-mcp-name":"get_organization_destination_rule","x-mcp-output-schema":true,"x-mcp-type":"Resource"},"put":{"operationId":"OrganizationDestinationRuleController_upsert_v1","parameters":[{"name":"organizationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertDestinationRuleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationRuleDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Create or update the organisation's destination rule","tags":["Destination Rules"],"x-mcp-name":"set_organization_destination_rule","x-mcp-output-schema":true,"x-mcp-type":"Tool"},"delete":{"operationId":"OrganizationDestinationRuleController_delete_v1","parameters":[{"name":"organizationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Remove the organisation's destination rule","tags":["Destination Rules"],"x-mcp-name":"delete_organization_destination_rule","x-mcp-type":"Tool"}},"/v1/x402/resources":{"get":{"description":"Search and browse online services that accept x402 payments. Full-text search over name/description/tags; filter by network or tag; omit the query to list all, ordered by recent popularity.","operationId":"X402DiscoveryController_list_v1","parameters":[{"name":"search","required":false,"in":"query","description":"Full-text query matched against service name, description and tags. Omit to list all, ordered by popularity.","schema":{"minLength":1,"maxLength":200,"example":"weather","type":"string"}},{"name":"network","required":false,"in":"query","description":"Filter to services accepting payment on this CAIP-2 chain id.","schema":{"example":"eip155:8453","type":"string"}},{"name":"tag","required":false,"in":"query","description":"Filter to services carrying this exact tag.","schema":{"example":"market news","type":"string"}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"example":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page (max 100).","schema":{"minimum":1,"maximum":100,"default":24,"example":24,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedX402ResourceDto_Output"}}}},"400":{"description":"Invalid query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List x402 services","tags":["x402 Discovery"],"x-mcp-name":"list_x402_services","x-mcp-output-schema":true,"x-mcp-type":"Resource"}},"/v1/x402/resources/{id}":{"get":{"description":"Fetch a single x402 service directory entry by its id.","operationId":"X402DiscoveryController_getOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402ResourceDto_Output"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"Get one x402 service","tags":["x402 Discovery"],"x-mcp-name":"get_x402_service","x-mcp-output-schema":true,"x-mcp-type":"Resource"}},"/v1/applications/{applicationId}/x402/services":{"get":{"description":"The x402 catalogue seen from one application.\n\n- `authorized`: the service host passes both the organization and the application destination rules.\n- `orgRule`: state of the organization rule alone for this host (drives the admin toggle).\n- `usage`: agent wallets of the application that paid this service this month, and the total.\n- `authorized=true` keeps only authorized services; without `search`, services paid this month come first, by spend.\n\nAuthorization reflects the organization and application destination rules only: a rule set on an individual agent wallet can still refuse a payment to an authorized service.","operationId":"ApplicationX402ServicesController_get_v1","parameters":[{"name":"applicationId","required":true,"in":"path","schema":{"format":"uuid","type":"string"}},{"name":"search","required":false,"in":"query","description":"Full-text query matched against service name, description and tags. Omit to list all, ordered by popularity.","schema":{"minLength":1,"maxLength":200,"example":"weather","type":"string"}},{"name":"network","required":false,"in":"query","description":"Filter to services accepting payment on this CAIP-2 chain id.","schema":{"example":"eip155:8453","type":"string"}},{"name":"tag","required":false,"in":"query","description":"Filter to services carrying this exact tag.","schema":{"example":"market news","type":"string"}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"example":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page (max 100).","schema":{"minimum":1,"maximum":100,"default":24,"example":24,"type":"integer"}},{"name":"authorized","required":false,"in":"query","description":"Keep only services whose host passes the organization and application rules (per-agent-wallet rules are not evaluated).","schema":{"example":true,"type":"string"}},{"name":"sources","required":false,"in":"query","description":"Comma-separated upstream directories to keep. Omit to list every source.","schema":{"minItems":1,"example":"coinbase,orthogonal","type":"array","items":{"type":"string","enum":["coinbase","orthogonal"],"description":"Upstream directory this entry is mirrored from.","example":"orthogonal"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402ServicesPageDto"}}}},"404":{"description":"Unknown application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]},{"bearer":[]}],"summary":"List x402 services for an application","tags":["x402 Discovery"]}},"/v1/trust/passports/structure":{"post":{"description":"Launch a structuration batch over the passports matching the filters (same filter format as the passport list): for each one, extract the product characteristics still missing from its free-text fields (name, description) into `product.characteristics`.\n\nExisting characteristics are never overwritten (fill-only). Each passport is an independent child job: one failure does not stop the batch. The response carries the batch `jobId` — follow it via `GET /v1/trust/passports/structure/{jobId}` or the SSE progress stream.","operationId":"TrustStructurationController_post_v1","parameters":[{"name":"applicationId","required":true,"in":"query","description":"UUID of the application owning the passports. Must belong to the authenticated organization; the filters only select passports within it.","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"id"},{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"createdAt"},{"type":"object","properties":{"field":{"type":"string","enum":["updatedAt"]},"operator":{"type":"string","enum":["gt","lt","gte","lte"]},"value":{"type":"string","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))$"}},"required":["field","operator","value"],"title":"updatedAt"},{"type":"object","properties":{"field":{"type":"string","enum":["application.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"application.id"},{"type":"object","properties":{"field":{"type":"string","enum":["status"]},"operator":{"type":"string","enum":["eq","ne"]},"value":{"type":"string","enum":["draft","published","claimed","archived"]}},"required":["field","operator","value"],"title":"status"},{"type":"object","properties":{"field":{"type":"string","enum":["product.idGranularity"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["model","batch","item"]}},"required":["field","operator","value"],"title":"product.idGranularity"},{"type":"object","properties":{"field":{"type":"string","enum":["product.modelNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.modelNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.batchNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.batchNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.itemNumber"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.itemNumber"},{"type":"object","properties":{"field":{"type":"string","enum":["product.name"]},"operator":{"type":"string","enum":["contains"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"product.name"},{"type":"object","properties":{"field":{"type":"string","enum":["mintedTo.id"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"mintedTo.id"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"structureJob"},{"type":"object","properties":{"field":{"type":"string","enum":["structureJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"structureJob.status"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob"]},"operator":{"type":"string","enum":["null","nnull"]},"value":{}},"required":["field","operator","value"],"title":"certifyJob"},{"type":"object","properties":{"field":{"type":"string","enum":["certifyJob.status"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["pending","completed","failed"]}},"required":["field","operator","value"],"title":"certifyJob.status"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["id","createdAt","updatedAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"201":{"description":""}},"security":[{"api_key":[]}],"summary":"Structure DPP passports","tags":["Trust"]},"get":{"description":"List all structuration jobs for the authenticated organization, filterable by application and job name (batch or per-passport child).","operationId":"TrustStructurationController_get_v1","parameters":[{"name":"filters","required":false,"in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"operator":{"type":"string","enum":["or","and"]},"value":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["batch","passport"]}},"required":["field","operator","value"],"title":"name"},{"type":"object","properties":{"field":{"type":"string","enum":["parent"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"parent"},{"type":"object","properties":{"field":{"type":"string","enum":["data.applicationId"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"data.applicationId"}]}}},"required":["operator","value"],"title":"LOGICAL"},{"type":"object","properties":{"field":{"type":"string","enum":["name"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","enum":["batch","passport"]}},"required":["field","operator","value"],"title":"name"},{"type":"object","properties":{"field":{"type":"string","enum":["parent"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string"}},"required":["field","operator","value"],"title":"parent"},{"type":"object","properties":{"field":{"type":"string","enum":["data.applicationId"]},"operator":{"type":"string","enum":["eq"]},"value":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["field","operator","value"],"title":"data.applicationId"}]}}},{"name":"sorters","required":false,"in":"query","schema":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["createdAt"]},"order":{"type":"string","enum":["asc","desc"]}},"required":["field","order"]}}},{"name":"currentPage","required":false,"in":"query","description":"1-based page index.","schema":{"minimum":1,"maximum":9007199254740991,"default":1,"type":"integer"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page.","schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"api_key":[]}],"summary":"List structuration jobs","tags":["Trust"]}},"/v1/trust/passports/structure/{jobId}":{"get":{"description":"Get details of a specific structuration job by its ID (the `jobId` returned at launch), including per-child statuses for a batch.","operationId":"TrustStructurationController_getJob_v1","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api_key":[]}],"summary":"Get a structuration job","tags":["Trust"]}},"/v1/trust/passports/structure/{jobId}/progress":{"get":{"description":"Subscribe to real-time progress updates for a specific structuration batch via Server-Sent Events.","operationId":"TrustStructurationController_progress_v1","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api_key":[]}],"summary":"Stream structuration job progress","tags":["Trust"]}},"/v1/trust/passports/{passportId}/characteristics":{"get":{"description":"List the passport characteristics with their AI provenance: source data (no provenance), published extractions (`verified`), parked ones pending review (`suggested`) and clashes with existing values (`conflict`).","operationId":"TrustStructurationReviewController_list_v1","parameters":[{"name":"passportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppCharacteristicReviewDto"}}}}},"security":[{"api_key":[]}],"summary":"Review passport characteristics","tags":["Trust"]}},"/v1/trust/passports/{passportId}/characteristics/approve-all":{"post":{"description":"Publish every `suggested` extraction of the passport to `product.characteristics` (each becomes `verified`). Conflicts are left untouched — they require individual arbitration.","operationId":"TrustStructurationReviewController_approveAll_v1","parameters":[{"name":"passportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppCharacteristicReviewDto"}}}}},"security":[{"api_key":[]}],"summary":"Approve all suggested characteristics","tags":["Trust"]}},"/v1/trust/passports/{passportId}/characteristics/{key}/approve":{"post":{"description":"Publish one `suggested` extraction to `product.characteristics` (it becomes `verified`). A `conflict` cannot be approved: the existing value always stays.","operationId":"TrustStructurationReviewController_approve_v1","parameters":[{"name":"passportId","required":true,"in":"path","schema":{"type":"string"}},{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppCharacteristicReviewDto"}}}},"409":{"description":"Conflicting extractions cannot be approved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsDto"}}}}},"security":[{"api_key":[]}],"summary":"Approve a suggested characteristic","tags":["Trust"]}},"/v1/trust/passports/{passportId}/characteristics/{key}/reject":{"post":{"description":"Discard an AI extraction: a `verified` one is removed from `product.characteristics`, a `suggested`/`conflict` one only loses its parked entry. Source values are never touched.","operationId":"TrustStructurationReviewController_reject_v1","parameters":[{"name":"passportId","required":true,"in":"path","schema":{"type":"string"}},{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DppCharacteristicReviewDto"}}}}},"security":[{"api_key":[]}],"summary":"Reject an AI-extracted characteristic","tags":["Trust"]}},"/v1/trust/audit/subjects":{"get":{"description":"List the products tracked as AI-visibility audit subjects for an application: their lifecycle state, T0 (baseline) score, latest score and the delta between the two.","operationId":"TrustAuditSubjectsController_list_v1","parameters":[{"name":"applicationId","required":true,"in":"query","description":"UUID of the application owning the tracked products. Must belong to the authenticated organization.","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},{"name":"state","required":false,"in":"query","description":"Only return subjects in this lifecycle state. Omit to list every state, pending baselines and archived subjects included.","schema":{"example":"active","type":"string","enum":["baseline_pending","active","archived"]}},{"name":"limit","required":false,"in":"query","description":"Max number of subjects to return in this page.","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"Number of subjects to skip before this page.","schema":{"minimum":0,"maximum":9007199254740991,"default":0,"example":0,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditSubjectsDto"}}}}},"security":[{"api_key":[]}],"summary":"List AI-visibility audit subjects","tags":["Trust"]}},"/v1/trust/audit/subjects/{id}":{"get":{"description":"Drill down into a single tracked product: its full snapshot history (chronological) and the raw audit material (per-query ranks, competitors, technical checks, recommendations) of the most recent snapshot.","operationId":"TrustAuditSubjectsController_get_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditSubjectDetailDto"}}}}},"security":[{"api_key":[]}],"summary":"Get an AI-visibility audit subject","tags":["Trust"]}},"/v1/trust/audit/prompts":{"get":{"description":"Rank the prompts of the latest audit of every active tracked product, best-performing first: where the catalogue surfaces best in generative-engine answers, per prompt and per shopping intent (generic purchase intents and proof-seeking intents such as origin or certification). `intents` (comma-separated) keeps only the given intent families; omitted, every prompt is ranked and `total` counts them all. Each item names the `leader` of its prompt: the tracked product itself when its best rank across the engines ties the best rank seen (the same reading as `bestRank`), otherwise the best-ranked competitor domain; null on snapshots captured before leaders were recorded.","operationId":"TrustAuditPromptsController_list_v1","parameters":[{"name":"applicationId","required":true,"in":"query","description":"UUID of the application owning the tracked products. Must belong to the authenticated organization.","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max number of prompts to return, best-performing first.","schema":{"minimum":1,"maximum":50,"default":10,"example":10,"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"Number of prompts to skip before this page.","schema":{"minimum":0,"maximum":9007199254740991,"default":0,"example":0,"type":"integer"}},{"name":"intents","required":false,"in":"query","description":"Shopping intents to keep, comma-separated (`quality,origin`) or repeated (`intents=quality&intents=origin`), among `category`, `brand`, `comparison`, `problem`, `quality`, `origin`, `warranty`, `certification`. Omit to rank every prompt.","schema":{"example":"quality,origin,warranty,certification","type":"array","items":{"type":"string","enum":["category","brand","comparison","problem","quality","origin","warranty","certification"],"description":"Shopping intent family the query covers. One query per family max, frozen at recruitment. Generic purchase intents: `category` (the product type or use case), `brand` (this brand specifically), `comparison` (this product against alternatives), `problem` (a need the product solves). Proof-seeking intents — where certified product data has a chance to weigh: `quality` (proven quality or reliability), `origin` (provenance, made-in), `warranty` (guarantee, after-sales), `certification` (certified or verified product claims).","example":"certification"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditPromptRankingDto"}}}}},"security":[{"api_key":[]}],"summary":"Rank AI-visibility audit prompts","tags":["Trust"]}},"/v1/trust/audit/recommendations":{"get":{"description":"Group the recommendations of the latest audit of every active tracked product by action, so the catalogue reads as a to-do list: each action lists the products whose page still needs it, highest priority first, then most impacted first. Recommendations are re-derived from the technical checks and answerability signals of each latest snapshot, without the per-product cap of 5 that `details.recommendations` carries on the subject endpoints — a product appears under every action its page fails, not only under its 5 most urgent. `auditedSubjects` counts the active products with at least one audit: the population each `subjects` list is drawn from.","operationId":"TrustAuditRecommendationsController_list_v1","parameters":[{"name":"applicationId","required":true,"in":"query","description":"UUID of the application owning the tracked products. Must belong to the authenticated organization.","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditRecommendationsDto"}}}}},"security":[{"api_key":[]}],"summary":"Group AI-visibility audit recommendations by action","tags":["Trust"]}},"/v1/webhooks/applications/{appId}/endpoints":{"get":{"description":"List the outbound webhook endpoints configured for the application. Signing secrets are never returned here — they are only shown once at creation or rotation.","operationId":"WebhookController_list_v1","parameters":[{"name":"appId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Webhook endpoints of the application","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointListDto"}}}}},"security":[{"api_key":[]}],"summary":"List webhook endpoints","tags":["Webhook"],"x-mcp-name":"list_webhook_endpoints","x-mcp-type":"Resource"},"post":{"description":"Register an HTTPS endpoint to receive event deliveries. A signing secret (`whsec_…`) is generated and returned ONCE in the response — store it now; it is never retrievable again. The receiver verifies the `webhook-signature` header with it (Standard Webhooks).","operationId":"WebhookController_create_v1","parameters":[{"name":"appId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointDto"}}}},"responses":{"201":{"description":"The created endpoint, including its signing secret (shown once)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointWithSecretDto"}}}}},"security":[{"api_key":[]}],"summary":"Create a webhook endpoint","tags":["Webhook"],"x-mcp-name":"create_webhook_endpoint","x-mcp-type":"Tool"}},"/v1/webhooks/applications/{appId}/endpoints/{id}":{"patch":{"description":"Update the target URL, subscribed event types or enabled state. Does not rotate the signing secret.","operationId":"WebhookController_update_v1","parameters":[{"name":"appId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointDto"}}}},"responses":{"200":{"description":"The updated endpoint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointDto"}}}}},"security":[{"api_key":[]}],"summary":"Update a webhook endpoint","tags":["Webhook"],"x-mcp-name":"update_webhook_endpoint","x-mcp-type":"Tool"},"delete":{"description":"Delete the endpoint and all its signing secrets and delivery history.","operationId":"WebhookController_remove_v1","parameters":[{"name":"appId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Endpoint deleted"}},"security":[{"api_key":[]}],"summary":"Delete a webhook endpoint","tags":["Webhook"],"x-mcp-name":"delete_webhook_endpoint","x-mcp-type":"Tool"}},"/v1/webhooks/applications/{appId}/endpoints/{id}/rotate-secret":{"post":{"description":"Mint a new active signing secret (returned ONCE) and deprecate the current one for a grace period during which both are used to sign, so the receiver can swap without dropping deliveries.","operationId":"WebhookController_rotateSecret_v1","parameters":[{"name":"appId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"The endpoint with its new signing secret (shown once)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointWithSecretDto"}}}}},"security":[{"api_key":[]}],"summary":"Rotate a webhook signing secret","tags":["Webhook"],"x-mcp-name":"rotate_webhook_secret","x-mcp-type":"Tool"}}},"info":{"title":"Keyban REST APIs","description":"# API Reference\n\nWelcome to the Keyban API reference. This page provides a developer-focused overview of the resources and conventions used across the API.\n\n## Core Resources\n\n### Applications\n\nManage tenant applications and their configuration, including theme settings, feature flags, and domain associations.\n\n### Accounts\n\nManage customer accounts across different applications, including account creation, updates, and account assignments for loyalty programs.\n\n### Digital Product Passport (DPP)\n\n- **Product Sheets**: Define and manage product templates for DPP minting\n- **DPP Products**: Mint individual digital passports with blockchain attestation\n- **Claim Permissions**: Control who can claim DPP products\n- **Batch Operations**: Support for bulk minting with streaming status updates\n\n### Loyalty\n\n- **Loyalty Settings**: Configure loyalty programs, point conversion rates, and welcome bonuses\n- **Reward Tiers**: Create and manage tiered rewards based on customer activity\n- **Points Management**: Mint and burn loyalty points for customer accounts\n- **Zelty Integration**: Webhook-based integration with Zelty POS systems\n\n### Points of Sale\n\nAdminister physical or virtual points of sale associated with applications, enabling location-based loyalty operations.\n\n### Shopify Integration\n\nManage Shopify shop connections for automated DPP minting on product orders, including OAuth authentication flows.\n\n### Metadata\n\nRetrieve blockchain network configuration (RPC endpoints, indexer URLs) used by the Keyban SDK to connect to supported networks.\n\n## Developer Notes\n\n### Authentication\n\nUse the `X-Api-Key` header for authenticated requests. Obtain your API key from the admin portal.\n\n### Environments\n\nThe API is available on multiple environments:\n\n- **Production**: `https://api.prod.keyban.io`\n- **Testing**: `https://api.testing.keyban.io`\n- **Development**: `https://api.keyban.localtest.me`\n\n### Versioning\n\nAll endpoints are versioned using URI versioning (e.g., `/v1/accounts`). The current API version is `v1`.\n\n### Pagination\n\nList endpoints support pagination via `offset` and `limit` query parameters. Check individual endpoint documentation for specific pagination options.\n\n### Error Handling\n\nThe API uses standard HTTP status codes and returns RFC 7807 Problem Details for structured, machine-readable error responses.\n\n### Asynchronous Operations\n\nLong-running operations (e.g., DPP minting, blockchain deployments) return job IDs and provide:\n\n- Polling endpoints (`/status`) for checking job progress\n- Server-Sent Events (`/status/sse`) for real-time status updates\n\n## API Documentation\n\nFor complete request/response schemas, parameters, and examples, see:\n\n- Public API: `/openapi.json`\n- LLM API: `/llm/openapi.json` (AI-powered completions for internal use)\n","version":"1.0","contact":{},"termsOfService":"https://docs.keyban.io/overview/terms-and-conditions"},"tags":[{"name":"Accounts","description":"Manage customer accounts"},{"name":"Applications","description":"Manage applications"},{"name":"DPP","description":"Digital Product Passport - passports and product sheets"},{"name":"Loyalty","description":"Loyalty program - accounts, reward tiers, points of sale"},{"name":"Integrations","description":"Third-party integrations (Shopify, Zelty)"},{"name":"LLM","description":"LLM chat completions"},{"name":"Agent API Keys","description":"Manage API keys for agent authentication"},{"name":"Agent Wallets","description":"Manage blockchain wallets for agents"},{"name":"Billing","description":"Subscription plans, Chargebee customers, and billing portal"},{"name":"Import","description":"Bulk data import jobs and progress tracking"},{"name":"Invest","description":"Tokenized investment funds, holdings, identities, and offers"},{"name":"Metrics","description":"Business metrics for Loyalty, DPP, and platform"},{"name":"Onboarding","description":"Account onboarding and plan activation"},{"name":"Organizations","description":"Read and update the active organization"},{"name":"Quotas","description":"Organization usage quotas and limits"}],"servers":[{"url":"https://api.prod.keyban.io","description":"Production"},{"url":"https://api.testing.keyban.io","description":"Testing"},{"url":"https://api.keyban.localtest.me","description":"Development"}],"components":{"securitySchemes":{"api_key":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Your API key"}},"schemas":{"AuthOrganizationDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","description":"Unique identifier of the organization (UUID v4)."},"createdAt":{"type":"string","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))$","example":"2024-01-15T09:30:00.000Z","description":"Creation date (ISO 8601)."},"name":{"type":"string","example":"Keyban SAS","description":"Legal or commercial name of the organization (e.g. `Keyban SAS`). Displayed in the admin UI and on invoices."},"slug":{"type":"string","example":"keyban-sas","description":"URL-safe unique identifier of the organization in kebab-case (e.g. `keyban-sas`). Used in API paths and subdomains. Distinct from `name`."},"logo":{"type":"string","format":"uri","example":"https://cdn.example.com/logos/keyban.png","description":"HTTPS URL of the organization logo (PNG or SVG). `null` when no logo has been uploaded.","nullable":true},"metadata":{"type":"object","properties":{},"additionalProperties":{},"description":"Billing and onboarding state managed by Keyban (Chargebee subscription, trial and pending markers). Read-only and ignored on update; its keys may change without notice.","nullable":true},"defaultLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the organization's default locale (e.g. `fr-FR`). Null when not set; falls back to Accept-Language header.","nullable":true},"preferredCurrency":{"type":"string","enum":["EUR","USD","JPY",null],"example":"EUR","description":"Fiat currency (ISO 4217) the organization displays monetary values in: wallet and treasury balances are converted to it, transfer amounts are quoted in it for signers, and agent spending policies are authored in it. Chosen once, at the creation of the first application or treasury, and immutable afterwards (a change is refused with `ORG_PREFERRED_CURRENCY_IMMUTABLE`; sending `null` or omitting the field leaves it untouched). Null until chosen.","nullable":true},"agentRoles":{"maxItems":6,"type":"array","items":{"type":"string","enum":["sales","analyst","content","compliance","support","recruit"]},"example":["sales","analyst"],"description":"What the organization's agents do, as picked during the agent-wallet onboarding. Selects the example prompts offered for the first payment. Null until picked.","nullable":true},"acquisitionChannel":{"type":"string","enum":["n8n","trial",null],"example":"n8n","description":"Third-party channel the organization signed up through (e.g. the n8n node listing). Null for an organic/direct signup, never attributed to a specific channel.","nullable":true},"planIncludesTreasury":{"type":"boolean","example":true,"description":"Whether the current plan includes the organization treasury (Agent Wallet Growth and above). Creating a treasury needs this or a Keyban grant (`quotas.pilotFeatures`); a treasury already created stays usable either way."},"settings":{"type":"object","properties":{"authConfig":{"type":"object","properties":{"email-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"phone-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"google":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"auth0":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]},"clientId":{"type":"string","example":"abc123xyz","description":"OAuth 2.0 / OIDC client identifier issued by the Auth0 tenant. Required when Auth0 is enabled."},"clientSecret":{"type":"string","example":"**********","description":"OAuth 2.0 / OIDC client secret issued by the Auth0 tenant. Sensitive — excluded from public API responses via `.omit` in `application/index.ts`. Never log or expose this value."},"domain":{"type":"string","example":"keyban.eu.auth0.com","description":"Auth0 tenant domain used as the OIDC issuer base URL (e.g. `keyban.eu.auth0.com`). Required when Auth0 is enabled."}},"required":["enabled","clientId","clientSecret","domain"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]}},"required":["email-otp","phone-otp","google","auth0"],"additionalProperties":false}},"required":["authConfig"],"additionalProperties":false},"quotas":{"type":"object","properties":{"applicationLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":5,"description":"Maximum number of applications the organization is allowed to own concurrently. `null` means unlimited (no quota enforced).","nullable":true},"trustProductLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":5,"description":"Maximum number of published products the organization is allowed to own concurrently. `null` means unlimited (no quota enforced).","nullable":true},"trustAuditLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":10,"description":"Maximum number of tracked AI-visibility audit subjects the organization may hold concurrently. Defaults to 10 when `null`.","nullable":true},"dppMonthlyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":10000,"description":"Maximum number of Digital Product Passports that can be minted within a single calendar month. Resets on the first day of each month. `null` means unlimited.","nullable":true},"activeUsersMonthlyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":50000,"description":"Maximum number of distinct end-users who can interact with the organization’s applications within a calendar month. Resets monthly. `null` means unlimited.","nullable":true},"agentWalletLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":10,"description":"Maximum number of agent wallets the organization may hold concurrently (total, not monthly). `null` means unlimited (no cap enforced).","nullable":true},"transactionLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":2000,"description":"Maximum number of agent wallet transactions (consumed intents) per calendar month, across all applications of the organization. Resets on the first day of each month (UTC). `null` means unlimited (no cap enforced).","nullable":true},"chargebee":{"type":"object","properties":{"customerId":{"type":"string","example":"cbdemo_AzqhKqSU6HrW1Mvq","description":"Chargebee customer identifier linked to the organization. `null` when no billing profile exists yet (e.g. free tier before onboarding completion).","nullable":true},"subscriptionId":{"type":"string","example":"AzZlGzSU6c6Hqxwh","description":"Active Chargebee subscription identifier for the organization. `null` when the organization has no active subscription.","nullable":true}},"additionalProperties":false,"description":"Billing identifiers mirrored from Chargebee. Used to reconcile usage with invoicing; the source of truth for billing state remains Chargebee."},"allowOverage":{"type":"boolean","description":"When `true`, usage is allowed to exceed the configured limits and any overage is billed through Chargebee. When `false`, requests that would exceed a limit are rejected with a quota error."},"allowTransactionOverage":{"type":"boolean","description":"When `true`, the organization may choose to keep transacting beyond `transactionLimit` and be billed per extra transaction. Always `false` on the free plan, which blocks at the limit."},"blockOnTransactionQuota":{"type":"boolean","description":"When `true`, agent transactions are refused once `transactionLimit` is reached. When `false` (and `allowTransactionOverage` is `true`), extra transactions are billed."},"transactionAlertRecipientIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Identifiers of the organization members notified by e-mail when transaction usage reaches 80 % and 100 % of `transactionLimit`. Empty means no e-mail."},"allowedFeatures":{"default":[],"description":"Technical features the organization is entitled to enable on its applications (e.g. DPP, Loyalty, Invest). Derived from the subscribed plan.","type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]}},"pilotFeatures":{"default":[],"description":"Features granted manually by a super-admin, per organization (pilot programs). Never derived from the plan: plan syncs overwrite `allowedFeatures` but must not touch this list. Entitlement checks use the union of both lists. The treasury also comes with the Agent Wallet Growth plan and above (`planIncludesTreasury` on the organization).","type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]}},"allowedNetworks":{"type":"array","items":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]},"description":"Blockchain networks available to the organization. Restricts the choices offered when creating applications or passports."},"transactionMonthlyUsage":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of agent wallet transactions consumed so far in the current calendar month (UTC), across all applications of the organization. Compared against `transactionLimit`."},"applicationUsage":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Current number of applications owned by the organization. Compared against `applicationLimit` to decide whether a new application can be created."},"trustProductUsage":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of Product published so far. Compared against `trustProductLimit`."},"dppMonthlyUsage":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of Digital Product Passports minted so far during the current calendar month. Compared against `dppMonthlyLimit`; resets monthly."},"activeUsersMonthlyUsage":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of distinct active end-users counted so far during the current calendar month. Compared against `activeUsersMonthlyLimit`; resets monthly."},"agentWalletUsage":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Current number of non-deleted agent wallets owned by the organization. Compared against `agentWalletLimit`."}},"required":["chargebee","allowOverage","allowTransactionOverage","blockOnTransactionQuota","transactionAlertRecipientIds","allowedFeatures","pilotFeatures","allowedNetworks","transactionMonthlyUsage","applicationUsage","trustProductUsage","dppMonthlyUsage","activeUsersMonthlyUsage","agentWalletUsage"],"additionalProperties":false,"description":"Quotas, entitlements and current usage of the organization. The same record as `GET /v1/quotas/{orgId}`, keyed by the organization."}},"required":["id","createdAt","name","slug","logo","metadata","planIncludesTreasury","settings","quotas"],"additionalProperties":false},"ProblemDetailsDto":{"type":"object","properties":{"type":{"default":"about:blank","type":"string"},"title":{"type":"string"},"status":{"type":"integer","minimum":100,"maximum":599},"detail":{"type":"string","minLength":1},"instance":{"type":"string"},"param":{"type":"string"},"code":{"description":"Stable error code for client-side i18n lookup. Clients map it to a localized message via their own catalog and fall back to `detail` (English) when the code is unknown. Only set for errors that can reach a browser UI (admin, dpp consumer); backend-only errors keep `code` undefined.","example":"BILLING_NO_CHARGEBEE_CUSTOMER","type":"string","enum":["BILLING_NO_CHARGEBEE_CUSTOMER","BILLING_INVALID_ORG_METADATA","BILLING_NO_ACTIVE_SUBSCRIPTION","BILLING_CHARGEBEE_CUSTOMER_ALREADY_EXISTS","BILLING_NO_OWNER_MEMBER","BILLING_CHARGEBEE_API_ERROR","BILLING_WEBHOOK_AUTH_FAILED","BILLING_WEBHOOK_INVALID_PAYLOAD","BILLING_CHARGEBEE_ITEM_NOT_FOUND","BILLING_UPGRADE_NOT_ALLOWED","BILLING_UPGRADE_IDENTITY_REQUIRED","QUOTA_APPLICATION_LIMIT_REACHED","QUOTA_TRUST_PRODUCT_LIMIT_REACHED","QUOTA_DPP_LIMIT_REACHED","QUOTA_WALLET_LIMIT_REACHED","QUOTA_AGENT_WALLET_LIMIT_REACHED","QUOTA_FEATURE_RESTRICTED","QUOTA_NETWORK_RESTRICTED","TRANSACTION_QUOTA_OVERAGE_NOT_ALLOWED","TRANSACTION_QUOTA_RECIPIENT_NOT_MEMBER","ONBOARDING_USER_ALREADY_IN_ORG","ONBOARDING_CHECKOUT_NOT_COMPLETED","ONBOARDING_HOSTED_PAGE_USER_MISMATCH","ONBOARDING_ORG_SLUG_TAKEN","ONBOARDING_COMPANY_NOT_FOUND","ONBOARDING_COMPANY_LOOKUP_UNAVAILABLE","ONBOARDING_COMPANY_CLOSED","ONBOARDING_SIREN_REQUIRED","ONBOARDING_VAT_REQUIRED","ONBOARDING_LEGAL_NAME_REQUIRED","ONBOARDING_VAT_INVALID","ONBOARDING_PLAN_NOT_FOUND","ONBOARDING_AUDIENCE_NOT_ALLOWED","ONBOARDING_V3_DISABLED","DPP_CERTIFICATION_KEY_NOT_FOUND","DPP_DID_WEB_DOMAIN_NOT_CONFIGURED","DPP_DID_WEB_DOMAIN_ALREADY_TAKEN","DPP_CLAIM_NOT_ALLOWED","DPP_PASSPORT_DUPLICATE_REFERENCE","DPP_PASSPORT_SOURCE_READ_ONLY","DPP_PASSPORT_PUBLISHED_CANNOT_DELETE","DPP_MINT_JOB_NOT_FOUND","DPP_PASSPORT_NOT_PUBLISHED","DPP_VC_NOT_YET_CERTIFIED","DPP_VC_IPFS_UNAVAILABLE","DPP_VC_SELF_HOSTED_UNAVAILABLE","DPP_VC_NOTHING_TO_CERTIFY","DPP_CERTIFICATE_SIGNATURE_REQUIRED","IMPORT_MAPPER_DUPLICATE_NAME","IMPORT_MAPPER_URL_EXISTS","DPP_SHOPIFY_INVALID_SHOP_DOMAIN","DPP_SHOPIFY_SHOP_ALREADY_LINKED","DPP_SHOPIFY_INVALID_WEBHOOK_SIGNATURE","DPP_SHOPIFY_UNHANDLED_WEBHOOK_TOPIC","INVEST_IDENTITY_NOT_FOUND","INVEST_IDENTITY_ALREADY_EXISTS","INVEST_CANNOT_DELETE_OLDEST_NAV","INVEST_SHARES_BELOW_DISTRIBUTED","INVEST_FUND_NOT_ACTIVE","INVEST_INVESTOR_REJECTED_KYC","INVEST_NOT_ENOUGH_FUND_SHARES","INVEST_FUND_LOCKUP_PERIOD","INVEST_INVESTOR_LOCKUP_PERIOD","INVEST_NOT_ENOUGH_AVAILABLE_SHARES","INVEST_SECONDARY_MARKET_DISABLED","INVEST_KYC_REQUIRED","ORG_CROSS_ACCESS_DENIED","ORG_PREFERRED_CURRENCY_IMMUTABLE","AUTH_UNAUTHENTICATED","AUTH_SUPER_ADMIN_REQUIRED","AUTH_INSUFFICIENT_PERMISSIONS","AUTH_MISSING_ORG_ID","AUTH_MISSING_SDK_NETWORK_HEADER","AUTH_INVALID_API_KEY","AUTH_SESSION_APP_MISMATCH","LOYALTY_FIRST_ASSIGNMENT_EXISTING","ACCOUNT_REWARD_TIER_NOT_FOUND","LOYALTY_ACCOUNT_NOT_FOUND","LOYALTY_REWARD_TIER_DUPLICATE_VISITS","LOYALTY_STELLAR_ONLY","LOYALTY_ZELTY_NOT_CONFIGURED","LOYALTY_ZELTY_ORDER_VERIFICATION_FAILED","LOYALTY_ZELTY_WEBHOOK_INVALID_SIGNATURE","LOYALTY_CAMPAIGN_NOT_EDITABLE","LOYALTY_CAMPAIGN_NOT_SENDABLE","LOYALTY_CAMPAIGN_NOT_RESUMABLE","LOYALTY_CAMPAIGN_NOT_SCHEDULABLE","LOYALTY_CAMPAIGN_NOT_CANCELLABLE","LOYALTY_CAMPAIGN_CONTENT_INCOMPLETE","AGENT_WALLET_SESSION_REQUIRED","AGENT_WALLET_NO_ONCHAIN_ADDRESS","AGENT_WALLET_NETWORK_UNSUPPORTED","AGENT_WALLET_DEPLOYING","AGENT_WALLET_OWNER_NOT_MEMBER","AGENT_WALLET_SIGNER_NOT_READY","AGENT_SIGNER_NOT_AGENTIC","AGENT_SIGNER_NOT_READY","AGENT_SIGNER_NO_COMMITMENT","AGENT_SIGNER_JOB_NOT_FOUND","AGENT_SIGNER_JOB_FORBIDDEN","AGENT_API_KEY_REQUIRED","AGENT_API_KEY_NOT_BOUND","AGENT_WALLET_EXPENSE_EXPORT_TOO_LARGE","AGENT_WALLET_SPONSOR_UNAVAILABLE","IMPORT_JOB_NOT_FOUND","IMPORT_RUN_IN_PROGRESS","DPP_STRUCTURE_JOB_NOT_FOUND","DPP_STRUCTURE_NO_MATCH","DPP_CHARACTERISTIC_REVIEW_NOT_FOUND","DPP_CHARACTERISTIC_CONFLICT_NOT_APPROVABLE","CLIENT_SHARE_NO_APPLICATION","ACCOUNT_SDK_CONTEXT_MISSING","SIGNER_NO_AUTH_CONTEXT","SIGNER_INVALID_DKG_ROUND","SIGNER_DKG_ALREADY_COMPLETED","SIGNER_RELAY_EVM_ONLY","SIGNER_ACCOUNT_NOT_REGISTERED","SIGNER_APPLICATION_REQUIRED","MULTISIG_WALLET_SESSION_REQUIRED","MULTISIG_WALLET_ALREADY_EXISTS","MULTISIG_WALLET_ALREADY_DEPLOYED","MULTISIG_WALLET_NOT_ACTIVE","MULTISIG_SIGNER_ALREADY_ENROLLED","MULTISIG_SIGNER_NOT_INVITED","MULTISIG_SIGNER_NOT_VALIDATOR","MULTISIG_SIGNER_NOT_REQUESTED","MULTISIG_SIGNER_NOT_CHALLENGED","MULTISIG_SIGNER_COMMITMENT_INVALID","MULTISIG_SIGNER_SAS_MISMATCH","MULTISIG_SIGNER_PUBKEY_INVALID","MULTISIG_WEBAUTHN_UNAVAILABLE","MULTISIG_SIGNER_NOT_FAILED","MULTISIG_INVITATION_NOT_A_MEMBER","MULTISIG_INVITATION_ALREADY_EXISTS","MULTISIG_WALLET_NOT_READY","MULTISIG_WALLET_SELF_ADDRESS","MULTISIG_TOPUP_TARGET_INVALID","MULTISIG_TOPUP_ASSET_UNSUPPORTED","MULTISIG_TOPUP_INSUFFICIENT_FUNDS","MULTISIG_BATCH_TOO_LARGE","MULTISIG_INTENT_ALREADY_PENDING","MULTISIG_INTENT_NOT_PENDING","MULTISIG_INTENT_NOT_SIGNER","MULTISIG_INTENT_ALREADY_APPROVED","MULTISIG_INTENT_SIGNATURE_INVALID","MULTISIG_CONTACT_INVALID","MULTISIG_CONTACT_ADDRESS_INVALID","MULTISIG_CONTACT_DUPLICATE","MULTISIG_CONTACT_NOT_SIGNER","REFILL_REQUEST_ALREADY_PENDING","REFILL_REQUEST_NOT_PENDING","REFILL_REQUEST_NOT_REQUESTER","PUSH_SESSION_REQUIRED","WEBHOOK_ENDPOINT_NOT_FOUND","WEBHOOK_URL_INVALID","WEBHOOK_URL_BLOCKED","INVALID_APP_DOMAIN","ONRAMP_KYC_REQUIRED","ONRAMP_LINK_AUTH_REQUIRED","ONRAMP_LINK_ACCOUNT_NOT_FOUND","ONRAMP_SESSION_LOCK_FAILED","ONRAMP_WALLET_NOT_FUNDABLE","ONRAMP_CLIENT_IP_UNRESOLVED","ONRAMP_DESTINATION_INVALID","LEGAL_ACCEPTANCE_REQUIRED","INVITATION_EMAIL_SUPPRESSED"]},"params":{"description":"ICU MessageFormat interpolation variables for the localized message keyed by `code`. Values are scalars only (strings, numbers).","example":{"orgName":"Acme"},"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["detail"]},"UpdateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","example":"Keyban SAS","description":"Legal or commercial name of the organization (e.g. `Keyban SAS`). Displayed in the admin UI and on invoices."},"slug":{"type":"string","example":"keyban-sas","description":"URL-safe unique identifier of the organization in kebab-case (e.g. `keyban-sas`). Used in API paths and subdomains. Distinct from `name`."},"logo":{"type":"string","format":"uri","example":"https://cdn.example.com/logos/keyban.png","description":"HTTPS URL of the organization logo (PNG or SVG). `null` when no logo has been uploaded.","nullable":true},"defaultLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the organization's default locale (e.g. `fr-FR`). Null when not set; falls back to Accept-Language header.","nullable":true},"preferredCurrency":{"type":"string","enum":["EUR","USD","JPY",null],"example":"EUR","description":"Fiat currency (ISO 4217) the organization displays monetary values in: wallet and treasury balances are converted to it, transfer amounts are quoted in it for signers, and agent spending policies are authored in it. Chosen once, at the creation of the first application or treasury, and immutable afterwards (a change is refused with `ORG_PREFERRED_CURRENCY_IMMUTABLE`; sending `null` or omitting the field leaves it untouched). Null until chosen.","nullable":true},"agentRoles":{"maxItems":6,"type":"array","items":{"type":"string","enum":["sales","analyst","content","compliance","support","recruit"]},"example":["sales","analyst"],"description":"What the organization's agents do, as picked during the agent-wallet onboarding. Selects the example prompts offered for the first payment. Null until picked.","nullable":true},"settings":{"type":"object","properties":{"authConfig":{"type":"object","properties":{"email-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"]},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"]}]},"phone-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"]},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"]}]},"google":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"]},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"]}]},"auth0":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]},"clientId":{"type":"string","example":"abc123xyz","description":"OAuth 2.0 / OIDC client identifier issued by the Auth0 tenant. Required when Auth0 is enabled."},"clientSecret":{"type":"string","example":"**********","description":"OAuth 2.0 / OIDC client secret issued by the Auth0 tenant. Sensitive — excluded from public API responses via `.omit` in `application/index.ts`. Never log or expose this value."},"domain":{"type":"string","example":"keyban.eu.auth0.com","description":"Auth0 tenant domain used as the OIDC issuer base URL (e.g. `keyban.eu.auth0.com`). Required when Auth0 is enabled."}},"required":["enabled","clientId","clientSecret","domain"]},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"]}]}},"required":["email-otp","phone-otp","google","auth0"]}},"required":["authConfig"]}}},"LegalDocumentListDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"document":{"type":"string","enum":["cgu","cgv","marketing","cgs"],"description":"Legal document identified, one of the LegalDocument enum values.","example":"cgu"},"audience":{"type":"string","enum":["company","individual"],"description":"Billing identity the document applies to — company and individual terms differ.","example":"company"},"version":{"type":"string","format":"date","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])))$","description":"Current published version of the document, as its publication date (ISO 8601 date-only, YYYY-MM-DD).","example":"2026-10-01"},"url":{"type":"string","format":"uri","description":"Absolute HTTPS URL where the full document text is published.","example":"https://www.keyban.io/cgu/"},"required":{"type":"boolean","description":"Whether this document must be accepted at its current version to complete onboarding (CGU, CGV) — false for opt-in documents (marketing).","example":true}},"required":["document","audience","version","url","required"]}}},"required":["data"]},"SignupIntentDto":{"type":"object","properties":{"customerType":{"type":"string","description":"Billing identity of the organization owner. Only `company` is accepted: the individual offer is not open yet.","example":"company","enum":["company"]},"acceptances":{"maxItems":6,"type":"array","items":{"type":"object","properties":{"document":{"type":"string","enum":["cgu","cgv","marketing","cgs"],"description":"Legal document accepted, one of the LegalDocument enum values.","example":"cgu"},"version":{"type":"string","format":"date","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])))$","description":"Version of the document accepted, as its publication date (ISO 8601 date-only, YYYY-MM-DD). Must match the current version to satisfy a required document.","example":"2026-10-01"}},"required":["document","version"]}},"locale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT"]}},"required":["customerType","acceptances"]},"LegalMeDto":{"type":"object","properties":{"audience":{"type":"string","enum":["company","individual"],"description":"Billing identity resolved for the caller — organization metadata wins over the user type, falling back to company.","example":"company"},"missing":{"type":"array","items":{"type":"object","properties":{"document":{"type":"string","enum":["cgu","cgv","marketing","cgs"],"description":"Legal document identified, one of the LegalDocument enum values.","example":"cgu"},"audience":{"type":"string","enum":["company","individual"],"description":"Billing identity the document applies to — company and individual terms differ.","example":"company"},"version":{"type":"string","format":"date","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])))$","description":"Current published version of the document, as its publication date (ISO 8601 date-only, YYYY-MM-DD).","example":"2026-10-01"},"url":{"type":"string","format":"uri","description":"Absolute HTTPS URL where the full document text is published.","example":"https://www.keyban.io/cgu/"},"required":{"type":"boolean","description":"Whether this document must be accepted at its current version to complete onboarding (CGU, CGV) — false for opt-in documents (marketing).","example":true}},"required":["document","audience","version","url","required"]},"description":"Required documents the caller has not yet accepted at their current version, for their resolved audience — CGV is only listed for the active organization owner."}},"required":["audience","missing"]},"LegalAcceptancesDto":{"type":"object","properties":{"acceptances":{"type":"array","items":{"type":"object","properties":{"document":{"type":"string","enum":["cgu","cgv","marketing","cgs"],"description":"Legal document accepted, one of the LegalDocument enum values.","example":"cgu"},"version":{"type":"string","format":"date","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])))$","description":"Version of the document accepted, as its publication date (ISO 8601 date-only, YYYY-MM-DD). Must match the current version to satisfy a required document.","example":"2026-10-01"}},"required":["document","version"]},"description":"One entry per document the caller accepts, each naming the document and the version accepted."}},"required":["acceptances"]},"PaginatedAccountDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application this account belongs to"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"name":{"type":"string","example":"Alice Dupont","description":"Full display name of the user (first name + last name)."},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","example":"alice@example.com","description":"Contact email address of the user. Must be a valid RFC 5322 address."},"emailVerified":{"type":"boolean","description":"Indicates whether the email address has been verified via OTP or magic-link."},"image":{"type":"string","format":"uri","example":"https://cdn.example.com/avatars/alice.png","description":"HTTPS URL of the user avatar image. `null` when no avatar has been set.","nullable":true},"phoneNumber":{"type":"string","example":"+33612345678","description":"Phone number of the user in E.164 format (e.g. `+33612345678`). `null` when not provided.","nullable":true},"phoneNumberVerified":{"type":"boolean","description":"Indicates whether the phone number has been verified via OTP. `null` when no phone number is on record.","nullable":true},"birthDate":{"type":"string","format":"date","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])))$","example":"1990-03-15","description":"Date of birth in ISO 8601 date-only format (`YYYY-MM-DD`, e.g. `1990-03-15`). `null` when not provided.","nullable":true},"preferredLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the user's preferred locale (e.g. `fr-FR`). Null when not set; falls back to organization default or Accept-Language header.","nullable":true}},"required":["id","createdAt","updatedAt","name","email","emailVerified"]},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"The blockchain network where this account is deployed"},"address":{"type":"string","minLength":1,"description":"The blockchain address of the account"},"explorerUrl":{"description":"URL to a blockchain explorer for this account","type":"string","format":"uri"},"loyalty":{"type":"object","properties":{"optimisticBalance":{"type":"string","description":"The current loyalty points balance (as string to handle large numbers)"},"zelty":{"type":"object","properties":{"customerId":{"type":"number","description":"The Zelty customer ID associated with this account, if any","nullable":true}},"description":"Zelty-specific loyalty data"},"visits":{"type":"number"},"fixedRewardTier":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","nullable":true},"rewardTier":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"],"nullable":true}},"required":["optimisticBalance","zelty","visits"],"description":"Loyalty program data associated with this account"},"dpp":{"type":"object","properties":{"passportCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of DPP item passports minted to this account"},"lastActivityAt":{"type":"string","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))$","description":"Timestamp of the most recent wallet quota event (account creation, passport update as minter) for the user of this account within the application","nullable":true},"isActive":{"type":"boolean","description":"Whether the account had wallet activity recently (within the rolling activity window)"}},"required":["passportCount","isActive"],"description":"DPP data associated with this account"}},"required":["id","createdAt","updatedAt","application","user","network","address","loyalty","dpp"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"AccountDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application this account belongs to"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"name":{"type":"string","example":"Alice Dupont","description":"Full display name of the user (first name + last name)."},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","example":"alice@example.com","description":"Contact email address of the user. Must be a valid RFC 5322 address."},"emailVerified":{"type":"boolean","description":"Indicates whether the email address has been verified via OTP or magic-link."},"image":{"type":"string","format":"uri","example":"https://cdn.example.com/avatars/alice.png","description":"HTTPS URL of the user avatar image. `null` when no avatar has been set.","nullable":true},"phoneNumber":{"type":"string","example":"+33612345678","description":"Phone number of the user in E.164 format (e.g. `+33612345678`). `null` when not provided.","nullable":true},"phoneNumberVerified":{"type":"boolean","description":"Indicates whether the phone number has been verified via OTP. `null` when no phone number is on record.","nullable":true},"birthDate":{"type":"string","format":"date","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])))$","example":"1990-03-15","description":"Date of birth in ISO 8601 date-only format (`YYYY-MM-DD`, e.g. `1990-03-15`). `null` when not provided.","nullable":true},"preferredLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the user's preferred locale (e.g. `fr-FR`). Null when not set; falls back to organization default or Accept-Language header.","nullable":true}},"required":["id","createdAt","updatedAt","name","email","emailVerified"]},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"The blockchain network where this account is deployed"},"address":{"type":"string","minLength":1,"description":"The blockchain address of the account"},"explorerUrl":{"description":"URL to a blockchain explorer for this account","type":"string","format":"uri"},"loyalty":{"type":"object","properties":{"optimisticBalance":{"type":"string","description":"The current loyalty points balance (as string to handle large numbers)"},"zelty":{"type":"object","properties":{"customerId":{"type":"number","description":"The Zelty customer ID associated with this account, if any","nullable":true}},"description":"Zelty-specific loyalty data"},"visits":{"type":"number"},"fixedRewardTier":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","nullable":true},"rewardTier":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"],"nullable":true}},"required":["optimisticBalance","zelty","visits"],"description":"Loyalty program data associated with this account"},"dpp":{"type":"object","properties":{"passportCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of DPP item passports minted to this account"},"lastActivityAt":{"type":"string","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))$","description":"Timestamp of the most recent wallet quota event (account creation, passport update as minter) for the user of this account within the application","nullable":true},"isActive":{"type":"boolean","description":"Whether the account had wallet activity recently (within the rolling activity window)"}},"required":["passportCount","isActive"],"description":"DPP data associated with this account"}},"required":["id","createdAt","updatedAt","application","user","network","address","loyalty","dpp"]},"UpdateAccountDto":{"type":"object","properties":{"loyalty":{"type":"object","properties":{"fixedRewardTier":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","nullable":true}}}},"required":["loyalty"],"description":"Fields to update on the account ssss"},"PaginatedAccountAssignmentDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the account assignment"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Contact email of the assigned account","nullable":true},"phoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"Contact phone number of the assigned account","nullable":true},"name":{"type":"string","description":"Name of the user to be assigned","nullable":true},"balance":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"The optimistic loyalty balance","nullable":true},"rewardTier":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"],"nullable":true}},"required":["id","createdAt","updatedAt","application","rewardTier"],"description":"Account assignment data"},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"AccountAssignmentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the account assignment"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Contact email of the assigned account","nullable":true},"phoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"Contact phone number of the assigned account","nullable":true},"name":{"type":"string","description":"Name of the user to be assigned","nullable":true},"balance":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"The optimistic loyalty balance","nullable":true},"rewardTier":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"],"nullable":true}},"required":["id","createdAt","updatedAt","application","rewardTier"],"description":"Account assignment data"},"CreateAccountAssignmentDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Contact email of the assigned account","nullable":true},"phoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"Contact phone number of the assigned account","nullable":true},"name":{"type":"string","description":"Name of the user to be assigned","nullable":true},"balance":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"The optimistic loyalty balance","nullable":true},"rewardTier":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string"}],"description":"UUID or name of a fixed reward tier applied to this account","nullable":true}},"required":["application"]},"UpdateAccountAssignmentDto":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Contact email of the assigned account","nullable":true},"phoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"Contact phone number of the assigned account","nullable":true},"name":{"type":"string","description":"Name of the user to be assigned","nullable":true},"balance":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"The optimistic loyalty balance","nullable":true},"rewardTier":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string"}],"description":"UUID or name of a fixed reward tier applied to this account","nullable":true}}},"PaginatedCampaignDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (brand) the campaign belongs to.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","minLength":1,"description":"Campaign name shown in the back-office campaign list.","example":"Summer menu launch"},"description":{"type":"string","description":"Internal note describing the campaign intent. Never sent to customers.","example":"Promote the new summer menu to recent visitors.","nullable":true},"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["google","apple"]},"description":"Wallet channels the campaign targets — a non-empty subset of google/apple.","example":["google","apple"]},"targeting":{"type":"object","properties":{"minPoints":{"description":"Inclusive lower bound on the loyalty point balance, in points. Omit for no lower bound.","example":100,"type":"integer","minimum":0,"maximum":9007199254740991},"maxPoints":{"description":"Inclusive upper bound on the loyalty point balance, in points. Omit for no upper bound.","example":500,"type":"integer","minimum":0,"maximum":9007199254740991},"minVisits":{"description":"Minimum number of distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Omit to ignore visit frequency.","example":3,"type":"integer","minimum":0,"maximum":9007199254740991},"maxVisits":{"description":"Inclusive upper bound on distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Set to 0 to target customers with no visit in the window (inactive/win-back). Omit for no upper bound.","example":0,"type":"integer","minimum":0,"maximum":9007199254740991},"rewardTierIds":{"description":"Restrict to customers whose effective reward tier is one of these tier IDs. Omit to target every tier.","example":["550e8400-e29b-41d4-a716-446655440000"],"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"description":"Audience filter. Null or empty targets the whole opted-in audience.","nullable":true},"content":{"type":"object","properties":{"header":{"type":"string","minLength":1,"maxLength":64,"description":"Short notification headline shown on the wallet pass. Kept under 64 chars to fit Google Wallet message limits.","example":"New summer menu"},"body":{"type":"string","minLength":1,"maxLength":255,"description":"Notification body text (≤ 255 chars). On Apple Wallet it populates the changeMessage field that makes the update visible as a push.","example":"Come and taste our new summer menu this week."}},"required":["header","body"],"description":"The single message (headline + body) delivered to every selected channel. May be absent while the campaign is a draft; its presence is validated at send time (LOYALTY_CAMPAIGN_CONTENT_INCOMPLETE otherwise).","nullable":true},"sendAt":{"type":"string","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))$","description":"Scheduled send time (RFC 3339). Null means immediate send when triggered.","example":"2026-06-23T10:00:00Z","nullable":true},"status":{"type":"string","enum":["draft","scheduled","sending","sent","finished"],"description":"Lifecycle status. Server-managed: a campaign is always created as draft.","example":"draft"},"audienceSnapshotCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Audience size frozen when sending starts: the count of opted-in accounts matching the targeting, BEFORE the per-recipient consent and frequency-cap exclusions. It can therefore be higher than the number of actual deliveries. Null until the campaign starts sending.","example":1234,"nullable":true},"conversionWindowDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Days after sending during which conversions are measured. Defaults to 7.","example":7},"sentAt":{"type":"string","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))$","description":"Timestamp when sending started (anchors the conversion window). Null until sent.","example":"2026-06-15T14:30:00Z","nullable":true},"isStranded":{"description":"Computed flag, set only on the campaign detail endpoint: true when the campaign is stuck in `sending` because its send job failed or vanished (no worker is draining it), so it can be resumed via POST /:id/resume. Absent on list responses and for any non-sending campaign.","example":false,"type":"boolean"},"scheduledImmediately":{"description":"Computed flag, set only on the POST /:id/schedule response: true when the requested sendAt was already in the past, so the campaign fires immediately instead of waiting. Absent (never false) in the nominal case where sendAt is in the future and the campaign is scheduled for later.","example":true,"type":"boolean"},"scheduleJobLost":{"description":"Computed flag, set only on the campaign detail endpoint: true when the campaign is stuck in `scheduled` past its due date because its delayed trigger vanished (no job will fire it). An hourly safety-net sweep re-arms it automatically, so this is informational and self-heals. Absent on list responses and for any non-scheduled or not-yet-due campaign.","example":false,"type":"boolean"}},"required":["id","createdAt","updatedAt","application","name","channels","status","conversionWindowDays"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"CampaignDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (brand) the campaign belongs to.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","minLength":1,"description":"Campaign name shown in the back-office campaign list.","example":"Summer menu launch"},"description":{"type":"string","description":"Internal note describing the campaign intent. Never sent to customers.","example":"Promote the new summer menu to recent visitors.","nullable":true},"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["google","apple"]},"description":"Wallet channels the campaign targets — a non-empty subset of google/apple.","example":["google","apple"]},"targeting":{"type":"object","properties":{"minPoints":{"description":"Inclusive lower bound on the loyalty point balance, in points. Omit for no lower bound.","example":100,"type":"integer","minimum":0,"maximum":9007199254740991},"maxPoints":{"description":"Inclusive upper bound on the loyalty point balance, in points. Omit for no upper bound.","example":500,"type":"integer","minimum":0,"maximum":9007199254740991},"minVisits":{"description":"Minimum number of distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Omit to ignore visit frequency.","example":3,"type":"integer","minimum":0,"maximum":9007199254740991},"maxVisits":{"description":"Inclusive upper bound on distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Set to 0 to target customers with no visit in the window (inactive/win-back). Omit for no upper bound.","example":0,"type":"integer","minimum":0,"maximum":9007199254740991},"rewardTierIds":{"description":"Restrict to customers whose effective reward tier is one of these tier IDs. Omit to target every tier.","example":["550e8400-e29b-41d4-a716-446655440000"],"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"description":"Audience filter. Null or empty targets the whole opted-in audience.","nullable":true},"content":{"type":"object","properties":{"header":{"type":"string","minLength":1,"maxLength":64,"description":"Short notification headline shown on the wallet pass. Kept under 64 chars to fit Google Wallet message limits.","example":"New summer menu"},"body":{"type":"string","minLength":1,"maxLength":255,"description":"Notification body text (≤ 255 chars). On Apple Wallet it populates the changeMessage field that makes the update visible as a push.","example":"Come and taste our new summer menu this week."}},"required":["header","body"],"description":"The single message (headline + body) delivered to every selected channel. May be absent while the campaign is a draft; its presence is validated at send time (LOYALTY_CAMPAIGN_CONTENT_INCOMPLETE otherwise).","nullable":true},"sendAt":{"type":"string","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))$","description":"Scheduled send time (RFC 3339). Null means immediate send when triggered.","example":"2026-06-23T10:00:00Z","nullable":true},"status":{"type":"string","enum":["draft","scheduled","sending","sent","finished"],"description":"Lifecycle status. Server-managed: a campaign is always created as draft.","example":"draft"},"audienceSnapshotCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Audience size frozen when sending starts: the count of opted-in accounts matching the targeting, BEFORE the per-recipient consent and frequency-cap exclusions. It can therefore be higher than the number of actual deliveries. Null until the campaign starts sending.","example":1234,"nullable":true},"conversionWindowDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Days after sending during which conversions are measured. Defaults to 7.","example":7},"sentAt":{"type":"string","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))$","description":"Timestamp when sending started (anchors the conversion window). Null until sent.","example":"2026-06-15T14:30:00Z","nullable":true},"isStranded":{"description":"Computed flag, set only on the campaign detail endpoint: true when the campaign is stuck in `sending` because its send job failed or vanished (no worker is draining it), so it can be resumed via POST /:id/resume. Absent on list responses and for any non-sending campaign.","example":false,"type":"boolean"},"scheduledImmediately":{"description":"Computed flag, set only on the POST /:id/schedule response: true when the requested sendAt was already in the past, so the campaign fires immediately instead of waiting. Absent (never false) in the nominal case where sendAt is in the future and the campaign is scheduled for later.","example":true,"type":"boolean"},"scheduleJobLost":{"description":"Computed flag, set only on the campaign detail endpoint: true when the campaign is stuck in `scheduled` past its due date because its delayed trigger vanished (no job will fire it). An hourly safety-net sweep re-arms it automatically, so this is informational and self-heals. Absent on list responses and for any non-scheduled or not-yet-due campaign.","example":false,"type":"boolean"}},"required":["id","createdAt","updatedAt","application","name","channels","status","conversionWindowDays"]},"CampaignStatsDto":{"type":"object","properties":{"sent":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Notifications accepted by a wallet platform, counted per delivered channel. A recipient reachable on both wallets counts twice.","example":142},"failed":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Notifications a wallet platform rejected, counted per failed channel. Retriable per recipient.","example":3},"excludedFrequencyCap":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Deliveries skipped because the loyalty card had already reached the rolling per-card notification cap.","example":12},"excludedOptOut":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Deliveries skipped because the customer has no marketing opt-in (GDPR consent missing or withdrawn).","example":8},"excludedNoCard":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Deliveries skipped because the recipient has no wallet card on the targeted channel (no Apple pass, or Google card never added). Not a failure — the channel was simply unreachable.","example":5},"notified":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Distinct recipients (loyalty cards) reached by at least one accepted notification. This is the conversion denominator.","example":138},"activated":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Distinct notified recipients who recorded at least one visit within the conversion window after being notified. Proxy signal: a visit correlated in time, NOT proven causation and with no revenue attribution.","example":21},"conversionRate":{"type":"number","minimum":0,"maximum":1,"description":"activated / notified, as a fraction in [0, 1]. 0 when no recipient was notified.","example":0.152},"revenueCents":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Revenue attributed to the campaign, in cents of `currency`: sum of indexer order prices placed by notified recipients, deduplicated per order. Uses the SAME conversion window as `activated` — anchored on each recipient's earliest `sent_at` — so both metrics cover the identical period. Time-correlated attribution, NOT proven causation. 0 when no order matches or no indexer data is available for the networks involved.","example":125900},"currency":{"type":"string","enum":["EUR","USD"],"description":"ISO 4217 currency of `revenueCents`, read from the application LoyaltySettings (defaults to EUR when the application has none). A single currency per application: order prices from every targeted network are summed under this one currency.","example":"EUR"}},"required":["sent","failed","excludedFrequencyCap","excludedOptOut","excludedNoCard","notified","activated","conversionRate","revenueCents","currency"]},"AudiencePreviewRequestDto":{"type":"object","properties":{"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (brand) whose audience is previewed. The preview is scoped to this application only, matching the application a campaign is created against.","example":"550e8400-e29b-41d4-a716-446655440000"},"targeting":{"type":"object","properties":{"minPoints":{"description":"Inclusive lower bound on the loyalty point balance, in points. Omit for no lower bound.","example":100,"type":"integer","minimum":0,"maximum":9007199254740991},"maxPoints":{"description":"Inclusive upper bound on the loyalty point balance, in points. Omit for no upper bound.","example":500,"type":"integer","minimum":0,"maximum":9007199254740991},"minVisits":{"description":"Minimum number of distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Omit to ignore visit frequency.","example":3,"type":"integer","minimum":0,"maximum":9007199254740991},"maxVisits":{"description":"Inclusive upper bound on distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Set to 0 to target customers with no visit in the window (inactive/win-back). Omit for no upper bound.","example":0,"type":"integer","minimum":0,"maximum":9007199254740991},"rewardTierIds":{"description":"Restrict to customers whose effective reward tier is one of these tier IDs. Omit to target every tier.","example":["550e8400-e29b-41d4-a716-446655440000"],"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"description":"Targeting filter to preview. Null or omitted previews the whole opted-in audience of the application.","nullable":true},"channels":{"description":"Wallet channels the campaign targets. A matching customer is reachable only if they have an installed card on at least one of these channels — the same per-channel card check the send pipeline applies (NoCardOnChannel). Omitted means \"any channel\": a card on either Apple or Google counts.","example":["google","apple"],"minItems":1,"type":"array","items":{"type":"string","enum":["google","apple"]}}},"required":["applicationId"]},"AudiencePreviewDto":{"type":"object","properties":{"matchingCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Opted-in customers matching the targeting filter — the campaign reach before the frequency cap and the card-installation check are applied.","example":1234},"accessibleCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Subset of matching customers reachable right now: they have an installed wallet card on at least one targeted channel and are below the all-channel notification cap over the rolling window. Invariant: accessibleCount + cappedCount + noCardCount === matchingCount.","example":1180},"cappedCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Subset of matching customers that have an installed card but are temporarily withheld because they already hit the notification cap. They become reachable again at fullAvailabilityAt.","example":54},"noCardCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Subset of matching customers with no installed wallet card on any targeted channel (Apple pass never registered on a device, or Google card never added). They match the targeting and consented, but the send pipeline excludes them as NoCardOnChannel, so they are not reachable.","example":0},"fullAvailabilityAt":{"type":"string","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))$","description":"Earliest RFC 3339 instant at which every capped customer can be reached again. Null when cappedCount is 0 (no customer is capped). Serialized from a Date to an ISO 8601 string by the HTTP layer.","example":"2026-06-17T09:00:00Z","nullable":true}},"required":["matchingCount","accessibleCount","cappedCount","noCardCount","fullAvailabilityAt"]},"CreateCampaignDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (brand) the campaign belongs to.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","minLength":1,"description":"Campaign name shown in the back-office campaign list.","example":"Summer menu launch"},"description":{"type":"string","description":"Internal note describing the campaign intent. Never sent to customers.","example":"Promote the new summer menu to recent visitors.","nullable":true},"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["google","apple"]},"description":"Wallet channels the campaign targets — a non-empty subset of google/apple.","example":["google","apple"]},"targeting":{"type":"object","properties":{"minPoints":{"description":"Inclusive lower bound on the loyalty point balance, in points. Omit for no lower bound.","example":100,"type":"integer","minimum":0,"maximum":9007199254740991},"maxPoints":{"description":"Inclusive upper bound on the loyalty point balance, in points. Omit for no upper bound.","example":500,"type":"integer","minimum":0,"maximum":9007199254740991},"minVisits":{"description":"Minimum number of distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Omit to ignore visit frequency.","example":3,"type":"integer","minimum":0,"maximum":9007199254740991},"maxVisits":{"description":"Inclusive upper bound on distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Set to 0 to target customers with no visit in the window (inactive/win-back). Omit for no upper bound.","example":0,"type":"integer","minimum":0,"maximum":9007199254740991},"rewardTierIds":{"description":"Restrict to customers whose effective reward tier is one of these tier IDs. Omit to target every tier.","example":["550e8400-e29b-41d4-a716-446655440000"],"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"description":"Audience filter. Null or empty targets the whole opted-in audience.","nullable":true},"content":{"type":"object","properties":{"header":{"type":"string","minLength":1,"maxLength":64,"description":"Short notification headline shown on the wallet pass. Kept under 64 chars to fit Google Wallet message limits.","example":"New summer menu"},"body":{"type":"string","minLength":1,"maxLength":255,"description":"Notification body text (≤ 255 chars). On Apple Wallet it populates the changeMessage field that makes the update visible as a push.","example":"Come and taste our new summer menu this week."}},"required":["header","body"],"description":"The single message (headline + body) delivered to every selected channel. May be absent while the campaign is a draft; its presence is validated at send time (LOYALTY_CAMPAIGN_CONTENT_INCOMPLETE otherwise).","nullable":true}},"required":["application","name","channels"]},"ScheduleCampaignDto":{"type":"object","properties":{"sendAt":{"type":"string","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))$","description":"Send time (RFC 3339, UTC). The campaign transitions to `scheduled` and a delayed job fires at this instant. A past or present timestamp is accepted and triggers an immediate send (flagged by `scheduledImmediately` on the response).","example":"2026-07-15T09:00:00Z"}},"required":["sendAt"]},"UpdateCampaignDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Campaign name shown in the back-office campaign list.","example":"Summer menu launch"},"description":{"type":"string","description":"Internal note describing the campaign intent. Never sent to customers.","example":"Promote the new summer menu to recent visitors.","nullable":true},"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["google","apple"]},"description":"Wallet channels the campaign targets — a non-empty subset of google/apple.","example":["google","apple"]},"targeting":{"type":"object","properties":{"minPoints":{"description":"Inclusive lower bound on the loyalty point balance, in points. Omit for no lower bound.","example":100,"type":"integer","minimum":0,"maximum":9007199254740991},"maxPoints":{"description":"Inclusive upper bound on the loyalty point balance, in points. Omit for no upper bound.","example":500,"type":"integer","minimum":0,"maximum":9007199254740991},"minVisits":{"description":"Minimum number of distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Omit to ignore visit frequency.","example":3,"type":"integer","minimum":0,"maximum":9007199254740991},"maxVisits":{"description":"Inclusive upper bound on distinct visit days over the application visit window (LoyaltySettings.visitsWindowDays). Set to 0 to target customers with no visit in the window (inactive/win-back). Omit for no upper bound.","example":0,"type":"integer","minimum":0,"maximum":9007199254740991},"rewardTierIds":{"description":"Restrict to customers whose effective reward tier is one of these tier IDs. Omit to target every tier.","example":["550e8400-e29b-41d4-a716-446655440000"],"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"description":"Audience filter. Null or empty targets the whole opted-in audience.","nullable":true},"content":{"type":"object","properties":{"header":{"type":"string","minLength":1,"maxLength":64,"description":"Short notification headline shown on the wallet pass. Kept under 64 chars to fit Google Wallet message limits.","example":"New summer menu"},"body":{"type":"string","minLength":1,"maxLength":255,"description":"Notification body text (≤ 255 chars). On Apple Wallet it populates the changeMessage field that makes the update visible as a push.","example":"Come and taste our new summer menu this week."}},"required":["header","body"],"description":"The single message (headline + body) delivered to every selected channel. May be absent while the campaign is a draft; its presence is validated at send time (LOYALTY_CAMPAIGN_CONTENT_INCOMPLETE otherwise).","nullable":true}}},"LoyaltyAccountMintDto":{"type":"object","properties":{"amount":{"description":"Amount to mint for the loyalty account. Accepts numeric or string values and is converted to a BigInt for internal processing.","anyOf":[{"type":"string"},{"type":"number"}]}},"required":["amount"],"description":"Payload for minting loyalty account balance (amount)"},"LoyaltyAccountMintResponseDto":{"type":"object","properties":{"newamount":{"type":"number","description":"New optimistic balance after mint (number)","example":42}},"required":["newamount"]},"PaginatedLoyaltyOrderDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"price":{"type":"string"},"items":{"type":"array","items":{}},"orderTransactions":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","properties":{"assetTransfer":{"type":"object","properties":{"id":{"type":"string"},"fromId":{"type":"string"},"toId":{"type":"string"},"value":{"type":"string"},"decimals":{"type":"number"},"transaction":{"type":"object","properties":{"id":{"type":"string"},"blockNumber":{"type":"string"},"date":{"type":"string","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))$"}},"required":["id","blockNumber","date"]}},"required":["id","fromId","toId","value","decimals","transaction"]}},"required":["assetTransfer"]}}},"required":["nodes"]}},"required":["id","createdAt","price","items","orderTransactions"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"},"limit":{"type":"integer","minimum":1,"maximum":5000,"description":"Number of items per page (max 5000 for client-side pagination)"}},"required":["data","total","limit"]},"PaginatedLoyaltyRewardTierDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"LoyaltyRewardTierDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"]},"CreateLoyaltyRewardTierDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["application","name","requiredVisits","currencyToPointRatio"]},"UpdateLoyaltyRewardTierDto":{"type":"object","properties":{"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}}},"PaginatedConsentLogDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"user":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Customer (AuthUser) whose consent decision this entry records.","example":"550e8400-e29b-41d4-a716-446655440000"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (data controller / brand) the decision applies to. The same person holds independent decisions per application, so consent for one brand never extends to another (#4484).","example":"45339a90-40ce-4dd8-85c1-2252cb273282"},"purpose":{"type":"string","enum":["marketing"],"description":"Processing purpose the decision applies to. `marketing` = wallet campaign notifications (the only purpose today).","example":"marketing"},"consent":{"type":"boolean","description":"Decision recorded by this entry: true = consented, false = explicitly refused, null = decision withdrawn/reset. false and null are distinct legal events (refusal vs withdrawal) even though both stop sends.","example":true,"nullable":true},"source":{"type":"string","enum":["loyalty_app","admin","service"],"description":"Channel the change came through: loyalty_app (customer self-service), admin (back-office), or service (server-side write, e.g. bulk retro-collection).","example":"loyalty_app"},"occurredAt":{"type":"string","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))$","description":"RFC 3339 instant the decision was recorded. The authoritative timestamp of the proof of consent.","example":"2026-06-22T12:27:59Z"},"termsVersion":{"type":"string","description":"Version of the terms/privacy policy in force when consent was given (what the customer agreed to). Null when not resolvable at write time.","example":"2026-06-marketing-v1","nullable":true}},"required":["id","createdAt","updatedAt","user","application","purpose","consent","source","occurredAt","termsVersion"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"ZeltySettingsDto":{"type":"object","properties":{"apiKey":{"type":"string","description":"Optional API key provided by Zelty for authentication","nullable":true},"transactionMethodId":{"type":"string","description":"Optional identifier used to map transaction methods between Zelty and Keyban","nullable":true}},"description":"Defines the integration parameters for Zelty within an organization. Includes optional API key and transaction method identifier used to configure communication with Zelty services."},"UpdateZeltySettingsDto":{"type":"object","properties":{"apiKey":{"type":"string","description":"Optional API key provided by Zelty for authentication","nullable":true},"transactionMethodId":{"type":"string","description":"Optional identifier used to map transaction methods between Zelty and Keyban","nullable":true}},"description":"Defines the integration parameters for Zelty within an organization. Includes optional API key and transaction method identifier used to configure communication with Zelty services."},"QuotaUsageListDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"organization":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6","description":"UUID of the organization that owns this usage counter. Used to scope quota enforcement per tenant."},"subject":{"type":"string","enum":["application","dppPassport","wallet"],"example":"dppPassport","description":"Discriminant identifying the type of resource being tracked (`application`, `dppPassport`, `wallet`). Scopes the counted actions to one resource family."},"period":{"type":"string","format":"date","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])))$","example":"2025-01-01","description":"ISO 8601 date (`YYYY-MM-DD`) representing the first day of the monthly quota window. Always set to the 1st of the month; resets each calendar month."},"count":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":342,"description":"Total number of actions recorded on published/claimed passports for the period (all event types). Non-negative integer; mirrors what counts against the monthly quota."}},"required":["organization","subject","period","count"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false},"TransactionQuotaDto":{"type":"object","properties":{"limit":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":2000,"description":"Monthly agent wallet transaction quota of the organization. `null` means unlimited.","nullable":true},"usage":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":342,"description":"Consumed agent wallet transactions of the current calendar month (UTC), all applications included."},"allowOverage":{"type":"boolean","description":"Whether the plan allows billing transactions beyond the quota. When false, the quota always blocks."},"blockOnQuota":{"type":"boolean","description":"Whether agent transactions are refused once the quota is reached. When false, the overage is billed."},"pricePerThousandInCents":{"type":"integer","minimum":0,"maximum":9007199254740991,"example":500,"description":"Price in cents of each block of 1,000 transactions beyond the quota (500 = 5.00 EUR per 1,000). The monthly overage invoice rounds its total up to the cent. `null` when the plan has no overage.","nullable":true},"alertRecipientIds":{"type":"array","items":{"type":"string"},"description":"Ids of the organization members who receive the quota alert emails. Empty disables the emails."}},"required":["limit","usage","allowOverage","blockOnQuota","pricePerThousandInCents","alertRecipientIds"]},"UpdateTransactionQuotaDto":{"type":"object","properties":{"blockOnQuota":{"description":"Refuse agent transactions at the quota (true) or bill the overage (false). Billing requires a plan that allows overage.","type":"boolean"},"alertRecipientIds":{"description":"Ids of the organization members who receive the quota alert emails. Replaces the current list; empty disables the emails.","maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}}},"CertificationKeyResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"organizationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Organization UUID"},"publicKey":{"type":"string","description":"Public key in hex format, without a 0x prefix (legacy encoding kept for already-issued keys; EVM callers re-add the prefix)."},"status":{"type":"string","enum":["active","pending","rotated","revoked"],"description":"Lifecycle status of the certification key. `active`: currently used for signing passports. `pending`: rotation in progress, not yet active. `rotated`: superseded by a newer key, kept for historical verification of past signatures. `revoked`: permanently invalidated (do not trust signatures)."},"name":{"type":"string","description":"Optional key name for identification","nullable":true},"activatedAt":{"type":"string","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))$","description":"When the key was activated"},"deactivatedAt":{"type":"string","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))$","description":"When the key was rotated or revoked","nullable":true},"onChainStatus":{"type":"string","enum":["registered","pending"],"description":"On-chain registration status: registered or pending"},"registeredNetworks":{"type":"array","items":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]},"description":"Networks where the key is registered"},"explorerUrl":{"type":"string","format":"uri","description":"Explorer URL for the registration transaction","nullable":true},"rotation":{"type":"object","properties":{"newKeyId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the new certification key that will replace the current active key once all on-chain rotation transactions are confirmed.","example":"550e8400-e29b-41d4-a716-446655440000"},"newPublicKey":{"type":"string","description":"Public key of the new key"},"pendingNetworks":{"type":"array","items":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]},"description":"Networks where rotation is still pending"},"completedNetworks":{"type":"array","items":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]},"description":"Networks where rotation has completed"}},"required":["newKeyId","newPublicKey","pendingNetworks","completedNetworks"],"description":"Rotation status if a key rotation is in progress","nullable":true}},"required":["id","createdAt","updatedAt","organizationId","publicKey","status","activatedAt","onChainStatus","registeredNetworks"]},"CertificationKeyHistoryResponseDto":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Key ID"},"publicKey":{"type":"string","description":"Public key (hex)"},"status":{"type":"string","enum":["active","pending","rotated","revoked"],"description":"Key status"},"name":{"type":"string","description":"Optional key name","nullable":true},"activatedAt":{"type":"string","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))$","description":"When the key was activated"},"deactivatedAt":{"type":"string","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))$","description":"When the key was deactivated","nullable":true},"createdAt":{"type":"string","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))$","description":"Creation timestamp"},"registeredNetworks":{"type":"array","items":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]},"description":"Networks where the key was registered"}},"required":["id","publicKey","status","activatedAt","createdAt","registeredNetworks"]},"description":"Chronological history of all certification keys for the organization, ordered by activation date descending (most recent first)."}},"required":["keys"]},"DidWebConfigResponseDto":{"type":"object","properties":{"domain":{"type":"string","maxLength":253,"pattern":"^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$","description":"Currently configured `did:web` domain, or `null` if self-hosted DID Web is disabled for this tenant.","example":"brand.example.com","nullable":true},"didDocument":{"type":"object","properties":{"@context":{"type":"array","items":{"type":"string"},"description":"JSON-LD contexts. Includes DID Core v1 and JsonWebKey2020 suite.","example":["https://www.w3.org/ns/did/v1","https://w3id.org/security/suites/jws-2020/v1"]},"id":{"type":"string","description":"The DID identifier (`did:web:{domain}`).","example":"did:web:brand.example.com"},"verificationMethod":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Verification method DID URL (DID + `#fragment`).","example":"did:web:brand.example.com#key-1"},"type":{"type":"string","description":"Key suite identifier per W3C JsonWebKey2020.","example":"JsonWebKey2020","enum":["JsonWebKey2020"]},"controller":{"type":"string","description":"DID that controls (i.e. can rotate) this key.","example":"did:web:brand.example.com"},"publicKeyJwk":{"type":"object","properties":{"kty":{"type":"string","description":"Key type — always `EC` for P-256.","example":"EC","enum":["EC"]},"crv":{"type":"string","description":"Curve identifier per RFC 7518.","example":"P-256","enum":["P-256"]},"x":{"type":"string","description":"Base64url-encoded 32-byte X coordinate.","example":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU"},"y":{"type":"string","description":"Base64url-encoded 32-byte Y coordinate.","example":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"}},"required":["kty","crv","x","y"],"description":"P-256 public key serialized as a JSON Web Key (RFC 7517)."}},"required":["id","type","controller","publicKeyJwk"],"description":"Single verification method declared in the DID Document. V1 exposes one key per tenant."}},"assertionMethod":{"type":"array","items":{"type":"string"},"description":"Verification methods authorized to issue assertions (sign VCs).","example":["did:web:brand.example.com#key-1"]},"authentication":{"type":"array","items":{"type":"string"},"description":"Verification methods authorized for DID authentication.","example":["did:web:brand.example.com#key-1"]}},"required":["@context","id","verificationMethod","assertionMethod","authentication"],"description":"DID Document to publish at `https://{domain}/.well-known/did.json`. `null` when no domain is configured. Regenerate on every certification key rotation.","nullable":true},"lastCheck":{"type":"object","properties":{"at":{"type":"string","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))$","description":"RFC 3339 timestamp of the most recent did:web publication check (manual verify or certification attempt).","example":"2026-06-10T14:30:00.000Z"},"status":{"type":"string","enum":["ok","failed"],"description":"`ok`: the published did.json matched the active certification key at `at`. `failed`: it was unreachable or did not match — new certifications fail until the tenant repairs it.","example":"ok"},"reason":{"type":"string","enum":["unreachable","tls_invalid","timeout","http_error","redirect_not_allowed","not_json","invalid_did_document","key_mismatch","missing_assertion_method","blocked_address",null],"description":"Failure reason; `null` when status is `ok`.","example":"key_mismatch","nullable":true}},"required":["at","status","reason"],"description":"Result of the latest did:web publication check. `null` when the domain has never been checked (or no domain is configured).","nullable":true}},"required":["domain","didDocument","lastCheck"]},"SetDidWebDomainDto":{"type":"object","properties":{"domain":{"type":"string","maxLength":253,"pattern":"^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$","description":"Bare host on which the tenant publishes `.well-known/did.json` (HTTPS, no scheme/path/port). Pass `null` to disable self-hosted DID Web and fall back to `did:key`.","example":"brand.example.com","nullable":true}},"required":["domain"]},"VerifyDidWebConfigResponseDto":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","description":"The DID Document published at `https://{domain}/.well-known/did.json` resolves and matches the active certification key.","example":"ok","enum":["ok"]},"domain":{"type":"string","maxLength":253,"pattern":"^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$","description":"The domain that was checked (echoed from the tenant config).","example":"brand.example.com"},"fetchedAt":{"type":"string","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))$","description":"RFC 3339 timestamp of the fetch attempt against the domain.","example":"2026-05-28T10:00:00.000Z"}},"required":["status","domain","fetchedAt"],"name":"VerifyDidWebConfigOk"},{"type":"object","properties":{"status":{"type":"string","description":"The verification could not complete or the document did not match.","example":"failed","enum":["failed"]},"domain":{"type":"string","maxLength":253,"pattern":"^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$","description":"The domain that was checked (echoed from the tenant config).","example":"brand.example.com"},"fetchedAt":{"type":"string","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))$","description":"RFC 3339 timestamp of the fetch attempt against the domain.","example":"2026-05-28T10:00:00.000Z"},"reason":{"type":"string","enum":["unreachable","tls_invalid","timeout","http_error","redirect_not_allowed","not_json","invalid_did_document","key_mismatch","missing_assertion_method","blocked_address"],"description":"Specific reason the verification failed. `blocked_address`: the domain resolves to a private/loopback/link-local IP, refused as an SSRF precaution. `unreachable`: DNS/network failure or connection refused. `tls_invalid`: certificate chain validation failed. `timeout`: request or body read exceeded 5s. `http_error`: 4xx/5xx response. `redirect_not_allowed`: 3xx response (the did:web spec forbids redirects on `.well-known/did.json`). `not_json`: body could not be parsed as JSON or exceeded 1 MiB. `invalid_did_document`: structure violates W3C DID Core or `id` does not match the configured domain. `key_mismatch`: the published `verificationMethod[].publicKeyJwk` does not include the org's active certification key. `missing_assertion_method`: the published `assertionMethod` does not reference the active key fragment.","example":"key_mismatch"},"detail":{"type":"string","description":"Human-readable diagnostic appended to the reason (e.g. the underlying error message or HTTP status). Free-form English, do not pattern-match.","example":"HTTP 404 when fetching https://brand.example.com/.well-known/did.json.","nullable":true}},"required":["status","domain","fetchedAt","reason"],"name":"VerifyDidWebConfigFailed"}]},"RotateCertificationKeyResponseDto":{"type":"object","properties":{"newKeyId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"ID of the newly generated key"},"newPublicKey":{"type":"string","description":"Public key of the new certification key"},"rotationJobsQueued":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of on-chain rotation jobs queued"}},"required":["newKeyId","newPublicKey","rotationJobsQueued"]},"OptInFormUploadDto":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":255},"mediaType":{"type":"string","enum":["image/png","image/jpeg","image/webp"]},"content":{"type":"string","format":"base64","contentEncoding":"base64","pattern":"^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"}},"required":["filename","mediaType","content"]},"OptInFormUploadResponseDto":{"type":"object","properties":{"cid":{"type":"string"},"uri":{"type":"string"}},"required":["cid","uri"]},"PaginatedDppPassportDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `model` passport, null when there is none.","nullable":true},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `batch` passport, null when there is none.","nullable":true},"certifyJob":{"type":"string","description":"Identifier of the latest certification job, null when the passport was never certified.","nullable":true},"structureJob":{"type":"string","description":"Identifier of the latest AI structuration job, null when the passport was never structured.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Embedded parent `model` passport, resolved via `modelNumber`. Null when the passport has no parent model. Populated on read, ignored on create.","nullable":true},"batch":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `model` passport, null when there is none.","nullable":true},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `batch` passport, null when there is none.","nullable":true},"certifyJob":{"type":"string","description":"Identifier of the latest certification job, null when the passport was never certified.","nullable":true},"structureJob":{"type":"string","description":"Identifier of the latest AI structuration job, null when the passport was never structured.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Embedded parent `batch` passport, resolved via `batchNumber`. Null when the passport has no parent batch. Populated on read, ignored on create.","nullable":true},"certifyJob":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"name":{"type":"string"},"parent":{"type":"string","description":"Identifier of the parent job, null for a root job.","nullable":true},"status":{"type":"string","enum":["pending","completed","failed"]},"data":{},"result":{},"error":{"type":"string","nullable":true},"childrenStats":{"description":"Children counts by status. Loaded on demand, absent when not requested.","type":"object","properties":{"pending":{"type":"number"},"completed":{"type":"number"},"failed":{"type":"number"}},"required":["pending","completed","failed"]},"streamToken":{"type":"string"}},"required":["id","createdAt","name","status","streamToken"],"description":"Latest certification job for this passport. Null when the passport was never certified. Populated on read, ignored on create.","nullable":true},"structureJob":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"name":{"type":"string"},"parent":{"type":"string","description":"Identifier of the parent job, null for a root job.","nullable":true},"status":{"type":"string","enum":["pending","completed","failed"]},"data":{},"result":{},"error":{"type":"string","nullable":true},"childrenStats":{"description":"Children counts by status. Loaded on demand, absent when not requested.","type":"object","properties":{"pending":{"type":"number"},"completed":{"type":"number"},"failed":{"type":"number"}},"required":["pending","completed","failed"]},"streamToken":{"type":"string"}},"required":["id","createdAt","name","status","streamToken"],"description":"Latest AI structuration job for this passport (Trust feature). Null when the passport was never structured. Populated on read, ignored on create.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"DppPassportDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `model` passport, null when there is none.","nullable":true},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `batch` passport, null when there is none.","nullable":true},"certifyJob":{"type":"string","description":"Identifier of the latest certification job, null when the passport was never certified.","nullable":true},"structureJob":{"type":"string","description":"Identifier of the latest AI structuration job, null when the passport was never structured.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Embedded parent `model` passport, resolved via `modelNumber`. Null when the passport has no parent model. Populated on read, ignored on create.","nullable":true},"batch":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `model` passport, null when there is none.","nullable":true},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `batch` passport, null when there is none.","nullable":true},"certifyJob":{"type":"string","description":"Identifier of the latest certification job, null when the passport was never certified.","nullable":true},"structureJob":{"type":"string","description":"Identifier of the latest AI structuration job, null when the passport was never structured.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Embedded parent `batch` passport, resolved via `batchNumber`. Null when the passport has no parent batch. Populated on read, ignored on create.","nullable":true},"certifyJob":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"name":{"type":"string"},"parent":{"type":"string","description":"Identifier of the parent job, null for a root job.","nullable":true},"status":{"type":"string","enum":["pending","completed","failed"]},"data":{},"result":{},"error":{"type":"string","nullable":true},"childrenStats":{"description":"Children counts by status. Loaded on demand, absent when not requested.","type":"object","properties":{"pending":{"type":"number"},"completed":{"type":"number"},"failed":{"type":"number"}},"required":["pending","completed","failed"]},"streamToken":{"type":"string"}},"required":["id","createdAt","name","status","streamToken"],"description":"Latest certification job for this passport. Null when the passport was never certified. Populated on read, ignored on create.","nullable":true},"structureJob":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"name":{"type":"string"},"parent":{"type":"string","description":"Identifier of the parent job, null for a root job.","nullable":true},"status":{"type":"string","enum":["pending","completed","failed"]},"data":{},"result":{},"error":{"type":"string","nullable":true},"childrenStats":{"description":"Children counts by status. Loaded on demand, absent when not requested.","type":"object","properties":{"pending":{"type":"number"},"completed":{"type":"number"},"failed":{"type":"number"}},"required":["pending","completed","failed"]},"streamToken":{"type":"string"}},"required":["id","createdAt","name","status","streamToken"],"description":"Latest AI structuration job for this passport (Trust feature). Null when the passport was never structured. Populated on read, ignored on create.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"]},"CreateDppPassportDto":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}}},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}}},"dimensions":{"type":"object","properties":{"weight":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"GRM","example":"GRM","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"length":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"width":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"height":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"volume":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"STL","example":"STL","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"GRM","example":"GRM","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"length":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"width":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"height":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"volume":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"STL","example":"STL","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]}}},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"]},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentHash":{"description":"Client-computed hash of the PLAINTEXT certified content, anchored on-chain in the certification event instead of the server-computed hash — lets holders of a clear certificate verify passports whose `data` is encrypted client-side. SHA-256 over the JCS (RFC 8785) canonical `{type: 'Data', data}`, full digest: `0x` + 64 lowercase hex. Format-validated only, never returned by the API, and cleared when `data`/`certifiedPaths`/`product` are updated without resending it (fallback to the server-computed hash).","example":"0x94b7e2c1a9f04d3e8b16c5a2d90e7f4815263748a5b6c7d8e9f0a1b2c3d4e5f6","type":"string","pattern":"^0x[0-9a-f]{64}$"}},"required":["network","product","application"]},"UpdateDppPassportDto":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}}},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}}},"dimensions":{"type":"object","properties":{"weight":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"GRM","example":"GRM","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"length":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"width":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"height":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"volume":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"STL","example":"STL","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"GRM","example":"GRM","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"length":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"width":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"height":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"MTR","example":"MTR","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]},"volume":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"default":"STL","example":"STL","type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#."}},"required":["value"]}}},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}}},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentHash":{"description":"Client-computed hash of the PLAINTEXT certified content, anchored on-chain in the certification event instead of the server-computed hash — lets holders of a clear certificate verify passports whose `data` is encrypted client-side. SHA-256 over the JCS (RFC 8785) canonical `{type: 'Data', data}`, full digest: `0x` + 64 lowercase hex. Format-validated only, never returned by the API, and cleared when `data`/`certifiedPaths`/`product` are updated without resending it (fallback to the server-computed hash).","example":"0x94b7e2c1a9f04d3e8b16c5a2d90e7f4815263748a5b6c7d8e9f0a1b2c3d4e5f6","type":"string","pattern":"^0x[0-9a-f]{64}$"}}},"PublishDppPassportsResultDto":{"type":"object","properties":{"jobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the background job that carries out the action, or null when the filter matched nothing to process. Passports change state as the job progresses, not when this call returns.","example":"6f1b9a7e-6c2d-4f3a-9b21-2f5d1c8e4a70","nullable":true},"eligibleCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of passports the job will process (matched passports plus the batches and items cascaded from them). It is what the job starts from, not a count of completed work.","example":42}},"required":["jobId","eligibleCount"]},"CertifyDppPassportsResultDto":{"type":"object","properties":{"jobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the background job that carries out the action, or null when the filter matched nothing to process. Passports change state as the job progresses, not when this call returns.","example":"6f1b9a7e-6c2d-4f3a-9b21-2f5d1c8e4a70","nullable":true},"eligibleCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of passports the job will process (matched passports plus the batches and items cascaded from them). It is what the job starts from, not a count of completed work.","example":42}},"required":["jobId","eligibleCount"]},"DeleteDppPassportsResultDto":{"type":"object","properties":{"jobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the background job that carries out the action, or null when the filter matched nothing to process. Passports change state as the job progresses, not when this call returns.","example":"6f1b9a7e-6c2d-4f3a-9b21-2f5d1c8e4a70","nullable":true},"eligibleCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of passports the job will process (matched passports plus the batches and items cascaded from them). It is what the job starts from, not a count of completed work.","example":42},"skippedCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of matched passports the job will leave untouched, because they are published or come from a read-only source. Known before the job starts, so this count is final.","example":3}},"required":["jobId","eligibleCount","skippedCount"]},"PaginatedShopifyShopDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID reference to the Keyban application linked to this shopify shop"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]},"name":{"type":"string","description":"Display name of the shopify shop"},"domain":{"type":"string","description":"Display domain of the shopify shop"},"hasSession":{"type":"boolean"}},"required":["id","createdAt","updatedAt","application","network","name","domain","hasSession"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"ShopifyShopDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID reference to the Keyban application linked to this shopify shop"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]},"name":{"type":"string","description":"Display name of the shopify shop"},"domain":{"type":"string","description":"Display domain of the shopify shop"},"hasSession":{"type":"boolean"}},"required":["id","createdAt","updatedAt","application","network","name","domain","hasSession"]},"CreateShopifyShopDto":{"type":"object","properties":{"domain":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*\\.myshopify\\.com$","description":"Canonical Shopify domain of the shop (e.g. your-shop.myshopify.com), not a custom storefront domain"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Network of the Shopify shop"},"appId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application to link the shop to"}},"required":["domain","network","appId"]},"CreateImportJobDto":{"type":"object","properties":{"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the application the import targets. Every imported entity is created under this application."},"entityName":{"type":"string","enum":["DppPassport"],"description":"Class name of the entity to import. Currently only `DppPassport` is supported.","example":"DppPassport"},"url":{"type":"string","format":"uri"},"mapperId":{"description":"Optional UUID of a `DppPassport` mapper (must belong to the same application). When set, each uploaded item is treated as a foreign-schema source object and transformed into a passport via the mapper rules before validation — the original fields are replaced by the mapper output. Omit to import items already shaped as `CreateDppPassportDto`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"network":{"description":"Blockchain network applied to every imported passport (the import body / mapper output does not carry it). Defaults to `BaseMainnet` when omitted. An explicit `network` already present on an item takes precedence.","type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]},"csvHasHeader":{"default":true,"description":"CSV imports only: whether the first row is a header to skip (`true`) or already data to import (`false`). Ignored for JSON. Column indices in the mapper are unaffected — they are always counted from the first column.","type":"boolean"}},"required":["applicationId","entityName","url"]},"PaginatedImportMapperDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the parent application owning the mapper.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","minLength":1,"description":"Human-readable mapper name. Must be unique within the parent application.","example":"Shopify product import"},"type":{"type":"string","enum":["file","url"],"description":"How the data is obtained: `file` (manual upload at import time) or `url` (file fetched on a recurring CRON schedule).","example":"file"},"url":{"type":"string","format":"uri","description":"Absolute URL of the file fetched on each scheduled run. Null unless `type=url`.","example":"https://example.com/catalog/products.csv","nullable":true},"cronFrequency":{"type":"string","description":"CRON expression driving the scheduled fetch. Null unless `type=url`.","example":"0 2 * * *","nullable":true},"csvHasHeader":{"type":"boolean","description":"Scheduled CSV sources only: whether the first fetched row is a header to skip (`true`) or already data (`false`). Null for `file` mappers and ignored when the fetched file is JSON.","example":true,"nullable":true},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"type":{"type":"string","enum":["const","path","column"],"description":"How `source` is interpreted. `path` extracts a value from the imported JSON; `const` uses `source` as a literal value.","example":"path"},"source":{"type":"string","minLength":1,"description":"Source value. JSONPath expression (RFC 9535) rooted at `$` when `type=path`, literal value when `type=const`.","example":"$.product.brand"},"destination":{"type":"string","minLength":1,"description":"Target field on the resulting model where the resolved value is written.","example":"brand"},"position":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Zero-based position of the row within its mapper. Rows are applied in ascending position order during import.","example":0}},"required":["id","createdAt","updatedAt","type","source","destination","position"]},"description":"Ordered list of field mappings applied during import. Order is preserved and significant: later rows can overwrite earlier ones on the same `destination`."},"sourceStructure":{"oneOf":[{"type":"object","properties":{"format":{"type":"string","description":"The sample was a CSV file with a header row.","example":"csv","enum":["csv"]},"columns":{"minItems":1,"type":"array","items":{"type":"string","minLength":1},"description":"Normalized header names (lowercased, diacritics and non-alphanumerics stripped), in file order. Order is significant: CSV rows are mapped by column index.","example":["gtin","titre","prixttc"]}},"required":["format","columns"]},{"type":"object","properties":{"format":{"type":"string","description":"The sample was a JSON document (or array of documents).","example":"json","enum":["json"]},"paths":{"minItems":1,"type":"array","items":{"type":"string","minLength":1},"description":"Sorted, deduplicated JSONPath expressions of the leaves of the first item.","example":["$.product.gtin","$.product.name"]}},"required":["format","paths"]}],"description":"Canonical structure of the sample file the mapper was built against, used to auto-detect the mapper matching an uploaded file. Null when the mapper predates the feature or was built without a usable header (never auto-detected until re-saved with a sample).","nullable":true}},"required":["id","createdAt","updatedAt","application","name","type","url","cronFrequency","csvHasHeader","rows","sourceStructure"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"RunningImportsDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"mapperId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the mapper whose run is still importing.","example":"550e8400-e29b-41d4-a716-446655440000"},"importId":{"type":"string","description":"Identifier of the import job carrying the run, as exposed by `GET /v1/imports`.","example":"import:550e8400-e29b-41d4-a716-446655440000"}},"required":["mapperId","importId"]}}},"required":["data"]},"ImportMappingSuggestionDto":{"type":"object","properties":{"mappings":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","minLength":1,"description":"Destination dot-path into the passport-creation input, guaranteed to be one of the server-side destination fields.","example":"product.modelNumber"},"source":{"type":"string","minLength":1,"description":"The `path` of the source to read it from, guaranteed to be one of the submitted sources. Destinations left unmapped are omitted rather than returned empty.","example":"$.product.mpn"},"origin":{"type":"string","enum":["exact","alias","pattern","llm"],"description":"How the correspondence was established. Anything other than `llm` was produced by the deterministic matcher, without a model call.","example":"alias"},"evidence":{"type":"string","enum":["confirmed","unaided","unopposed","contested","inadmissible"],"description":"How well the correspondence is corroborated, from confronting the answer with the deterministic matcher. Says what to check, where a numeric score would only say how much to worry: `contested` points at a namesake destination, `inadmissible` at values the destination cannot accept. Orthogonal to `origin` — who proposed a correspondence and how well it holds up are different questions.","example":"confirmed"},"confidence":{"type":"string","enum":["high","review","low"],"description":"What to do with the correspondence. `high` and `review` are both meant to be applied — `review` asks for a second look — while `low` must NOT be applied automatically: offer it as a suggestion and leave the destination empty. Derived server-side from `evidence` so the cut-off has one home; do not re-derive it from `evidence` or `origin`. That cut-off is calibrated against the evaluation corpus that ships with the server, so it can be recalibrated server-side without a contract version change — a client that froze its own `evidence`-to-decision table would keep applying the previous calibration.","example":"high"}},"required":["destination","source","origin","evidence","confidence"]},"description":"Suggested correspondences, one per recognized destination. Read `confidence` before applying: a `low` entry is reported so it can be offered, not pre-filled. Empty when nothing could be recognized — a valid outcome, not an error."},"degraded":{"type":"boolean","description":"True when the language model could not be reached or answered unusably, and the correspondences come from the deterministic matcher alone. The suggestion is then narrower — it favours leaving a destination empty over guessing — so it deserves a closer review. Never an error: a degraded suggestion is still returned with a 200.","example":false}},"required":["mappings","degraded"]},"ImportMapperDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the parent application owning the mapper.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","minLength":1,"description":"Human-readable mapper name. Must be unique within the parent application.","example":"Shopify product import"},"type":{"type":"string","enum":["file","url"],"description":"How the data is obtained: `file` (manual upload at import time) or `url` (file fetched on a recurring CRON schedule).","example":"file"},"url":{"type":"string","format":"uri","description":"Absolute URL of the file fetched on each scheduled run. Null unless `type=url`.","example":"https://example.com/catalog/products.csv","nullable":true},"cronFrequency":{"type":"string","description":"CRON expression driving the scheduled fetch. Null unless `type=url`.","example":"0 2 * * *","nullable":true},"csvHasHeader":{"type":"boolean","description":"Scheduled CSV sources only: whether the first fetched row is a header to skip (`true`) or already data (`false`). Null for `file` mappers and ignored when the fetched file is JSON.","example":true,"nullable":true},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"type":{"type":"string","enum":["const","path","column"],"description":"How `source` is interpreted. `path` extracts a value from the imported JSON; `const` uses `source` as a literal value.","example":"path"},"source":{"type":"string","minLength":1,"description":"Source value. JSONPath expression (RFC 9535) rooted at `$` when `type=path`, literal value when `type=const`.","example":"$.product.brand"},"destination":{"type":"string","minLength":1,"description":"Target field on the resulting model where the resolved value is written.","example":"brand"},"position":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Zero-based position of the row within its mapper. Rows are applied in ascending position order during import.","example":0}},"required":["id","createdAt","updatedAt","type","source","destination","position"]},"description":"Ordered list of field mappings applied during import. Order is preserved and significant: later rows can overwrite earlier ones on the same `destination`."},"sourceStructure":{"oneOf":[{"type":"object","properties":{"format":{"type":"string","description":"The sample was a CSV file with a header row.","example":"csv","enum":["csv"]},"columns":{"minItems":1,"type":"array","items":{"type":"string","minLength":1},"description":"Normalized header names (lowercased, diacritics and non-alphanumerics stripped), in file order. Order is significant: CSV rows are mapped by column index.","example":["gtin","titre","prixttc"]}},"required":["format","columns"]},{"type":"object","properties":{"format":{"type":"string","description":"The sample was a JSON document (or array of documents).","example":"json","enum":["json"]},"paths":{"minItems":1,"type":"array","items":{"type":"string","minLength":1},"description":"Sorted, deduplicated JSONPath expressions of the leaves of the first item.","example":["$.product.gtin","$.product.name"]}},"required":["format","paths"]}],"description":"Canonical structure of the sample file the mapper was built against, used to auto-detect the mapper matching an uploaded file. Null when the mapper predates the feature or was built without a usable header (never auto-detected until re-saved with a sample).","nullable":true}},"required":["id","createdAt","updatedAt","application","name","type","url","cronFrequency","csvHasHeader","rows","sourceStructure"]},"ImportMapperRunDto":{"type":"object","properties":{"importId":{"type":"string","description":"Identifier of the import job carrying the run, as exposed by `GET /v1/imports` — follow its progress there (`data.source = scheduled`).","example":"import:550e8400-e29b-41d4-a716-446655440000"}},"required":["importId"]},"ChatCompletionRequestDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application ID for usage tracking"},"provider":{"default":"GOOGLE","description":"LLM provider to use (GOOGLE for MVP)","type":"string","enum":["GOOGLE"]},"model":{"type":"string","minLength":1,"description":"Model identifier (e.g., gemini-2.5-flash-lite)"},"messages":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant","system"],"description":"Role of the message sender (user, assistant, system)"},"content":{"description":"Content of the message (simple text mode). Deprecated in favor of parts for multimodal support.","type":"string","minLength":1,"maxLength":100000},"parts":{"description":"Message parts for multimodal content (text + files). Use this instead of content for files.","minItems":1,"maxItems":20,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","description":"Text content","enum":["text"]},"text":{"type":"string","minLength":1,"maxLength":100000,"description":"Text content of the part"}},"required":["type","text"]},{"type":"object","properties":{"type":{"type":"string","description":"File content (base64 encoded)","enum":["inline_data"]},"inlineData":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file (e.g., application/pdf, image/png, image/jpeg)"},"data":{"type":"string","minLength":1,"description":"Base64-encoded file data"}},"required":["mimeType","data"],"description":"File data"}},"required":["type","inlineData"]}]}}},"required":["role"],"description":"Single message in a conversation (text-only or multimodal with files)"},"description":"Conversation history (1-100 messages)"},"temperature":{"description":"Sampling temperature (0=deterministic, 2=creative). Optional.","type":"number","minimum":0,"maximum":2},"maxTokens":{"description":"Maximum tokens in response (up to 8192). Optional.","type":"integer","exclusiveMinimum":true,"maximum":8192,"minimum":0},"topP":{"description":"Nucleus sampling parameter. Optional.","type":"number","minimum":0,"maximum":1},"topK":{"description":"Top-K sampling parameter. Optional.","type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0}},"required":["application","model","messages"],"description":"Request to generate an LLM chat completion. Requires authenticated user with active organization."},"ChatCompletionResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique identifier for this completion"},"provider":{"type":"string","enum":["GOOGLE"],"description":"Provider that generated this"},"model":{"type":"string","description":"Model that generated this response"},"message":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant","system"],"description":"Role of the message sender (user, assistant, system)"},"content":{"description":"Content of the message (simple text mode). Deprecated in favor of parts for multimodal support.","type":"string","minLength":1,"maxLength":100000},"parts":{"description":"Message parts for multimodal content (text + files). Use this instead of content for files.","minItems":1,"maxItems":20,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","description":"Text content","enum":["text"]},"text":{"type":"string","minLength":1,"maxLength":100000,"description":"Text content of the part"}},"required":["type","text"]},{"type":"object","properties":{"type":{"type":"string","description":"File content (base64 encoded)","enum":["inline_data"]},"inlineData":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file (e.g., application/pdf, image/png, image/jpeg)"},"data":{"type":"string","minLength":1,"description":"Base64-encoded file data"}},"required":["mimeType","data"],"description":"File data"}},"required":["type","inlineData"]}]}}},"required":["role"],"description":"Generated assistant message"},"usage":{"type":"object","properties":{"promptTokens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tokens in the prompt"},"completionTokens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tokens in the completion"},"totalTokens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total tokens consumed"}},"required":["promptTokens","completionTokens","totalTokens"],"description":"Token usage statistics"},"finishReason":{"type":"string","description":"Reason completion finished (stop, length, etc.)"},"createdAt":{"type":"string","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))$","description":"Timestamp of completion"}},"required":["id","provider","model","message","usage","finishReason","createdAt"],"description":"Response from LLM chat completion"},"EventListDto":{"type":"object","properties":{"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application owning the event."},"subject":{"type":"string","enum":["application"]},"type":{"type":"string","enum":["create","update","delete"]},"user":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User responsible for the event, when known.","nullable":true},"count":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":1,"description":"Aggregated count for this event row (default 1)."}},"required":["id","createdAt","updatedAt","application","subject","type","user","count"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application owning the event."},"subject":{"type":"string","enum":["dppPassport"]},"type":{"type":"string","enum":["create","update","publish","claim","scan","transfer"]},"user":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User responsible for the event, when known.","nullable":true},"count":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":1,"description":"Aggregated count for this event row (default 1)."},"passport":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application this account belongs to"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"name":{"type":"string","example":"Alice Dupont","description":"Full display name of the user (first name + last name)."},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","example":"alice@example.com","description":"Contact email address of the user. Must be a valid RFC 5322 address."},"emailVerified":{"type":"boolean","description":"Indicates whether the email address has been verified via OTP or magic-link."},"image":{"type":"string","format":"uri","example":"https://cdn.example.com/avatars/alice.png","description":"HTTPS URL of the user avatar image. `null` when no avatar has been set.","nullable":true},"phoneNumber":{"type":"string","example":"+33612345678","description":"Phone number of the user in E.164 format (e.g. `+33612345678`). `null` when not provided.","nullable":true},"phoneNumberVerified":{"type":"boolean","description":"Indicates whether the phone number has been verified via OTP. `null` when no phone number is on record.","nullable":true},"birthDate":{"type":"string","format":"date","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])))$","example":"1990-03-15","description":"Date of birth in ISO 8601 date-only format (`YYYY-MM-DD`, e.g. `1990-03-15`). `null` when not provided.","nullable":true},"preferredLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the user's preferred locale (e.g. `fr-FR`). Null when not set; falls back to organization default or Accept-Language header.","nullable":true}},"required":["id","createdAt","updatedAt","name","email","emailVerified"]},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"The blockchain network where this account is deployed"},"address":{"type":"string","minLength":1,"description":"The blockchain address of the account"},"explorerUrl":{"description":"URL to a blockchain explorer for this account","type":"string","format":"uri"},"loyalty":{"type":"object","properties":{"optimisticBalance":{"type":"string","description":"The current loyalty points balance (as string to handle large numbers)"},"zelty":{"type":"object","properties":{"customerId":{"type":"number","description":"The Zelty customer ID associated with this account, if any","nullable":true}},"description":"Zelty-specific loyalty data"},"visits":{"type":"number"},"fixedRewardTier":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","nullable":true},"rewardTier":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the loyalty reward tier"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The number of visits required to reach this reward tier"},"currencyToPointRatio":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts."},"bgImageUrl":{"type":"string","format":"uri","description":"Background image for the reward tier. Supported formats: WEBP (preferred), PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true}},"required":["id","createdAt","updatedAt","application","name","requiredVisits","currencyToPointRatio"],"nullable":true}},"required":["optimisticBalance","zelty","visits"],"description":"Loyalty program data associated with this account"},"dpp":{"type":"object","properties":{"passportCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of DPP item passports minted to this account"},"lastActivityAt":{"type":"string","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))$","description":"Timestamp of the most recent wallet quota event (account creation, passport update as minter) for the user of this account within the application","nullable":true},"isActive":{"type":"boolean","description":"Whether the account had wallet activity recently (within the rolling activity window)"}},"required":["passportCount","isActive"],"description":"DPP data associated with this account"}},"required":["id","createdAt","updatedAt","application","user","network","address","loyalty","dpp"],"description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `model` passport, null when there is none.","nullable":true},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `batch` passport, null when there is none.","nullable":true},"certifyJob":{"type":"string","description":"Identifier of the latest certification job, null when the passport was never certified.","nullable":true},"structureJob":{"type":"string","description":"Identifier of the latest AI structuration job, null when the passport was never structured.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Embedded parent `model` passport, resolved via `modelNumber`. Null when the passport has no parent model. Populated on read, ignored on create.","nullable":true},"batch":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network on which the passport is anchored. Passports are anchored on EVM networks (e.g. BaseMainnet).","example":"BaseMainnet"},"status":{"type":"string","enum":["draft","published","claimed","archived"],"description":"Lifecycle status. `draft` is editable and not certified; `published` triggers on-chain certification; `claimed` is set on item passports once they have been minted to an end-user account; `archived` is read-only. The transition `draft` → `published` is one-way: a published passport cannot be reverted to `draft`.","example":"published"},"source":{"type":"string","enum":["manual","import","shopify"],"description":"Origin of the passport (`manual`, `import`, `shopify`). Set by the server, read-only.","example":"manual"},"editable":{"type":"boolean","description":"Whether the passport can still be modified. Computed server-side, read-only.","example":true},"webPageUrl":{"type":"string","mappable":true,"description":"Absolute URL of the product's own web page on the brand or merchant site — the page a shopper lands on (RFC 3986). Not a link to an image, a document or the passport itself.","example":"https://brand.example.com/products/hiking-boots","nullable":true},"product":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["name","idGranularity"],"description":"The product as stored at creation or import. The computed UNTP identifiers (`id`, `idScheme`) are served by `productUntp`."},"productUntp":{"type":"object","properties":{"type":{"default":["Product"],"type":"array","prefixItems":[{"type":"string","const":"Product"}]},"id":{"type":"string","description":"Globally unique product identifier (typically an URI, DID or GS1 digital link)."},"name":{"type":"string","mappable":true,"description":"Commercial name of the product.","example":"Trail Runner Hiking Boots"},"description":{"type":"string","mappable":true,"description":"Marketing description of the product. Null when absent (nullable column).","example":"Waterproof hiking boots with reinforced ankle support, built for multi-day treks.","nullable":true},"idScheme":{"type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/01/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GTIN\")."}},"required":["id","name"],"description":"Identifier scheme describing how to interpret the `id` and serial numbers below."},"modelNumber":{"type":"string","mappable":true,"description":"Manufacturer model reference / SKU. Required at `batch` and `item` granularity to link to the parent `model` passport. Null when absent (nullable column).","example":"TRB-2400","nullable":true},"batchNumber":{"type":"string","mappable":true,"description":"Production batch or lot identifier. Required at `item` granularity to link to the parent `batch` passport. Null at `model` granularity (nullable column).","example":"LOT-2026-03-A","nullable":true},"itemNumber":{"type":"string","mappable":true,"description":"Individual serial number. Required at `item` granularity to identify a single physical unit. Null at `model`/`batch` granularity (nullable column).","example":"SN-000482913","nullable":true},"idGranularity":{"type":"string","enum":["model","batch","item"],"description":"Passport granularity: `model` = product template, `batch` = production lot, `item` = individual serialized unit.","mappable":true,"enumSelect":true},"productImage":{"description":"Primary product image shown in the passport viewer.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]},"characteristics":{"description":"Free-form dictionary of technical characteristics: each entry maps a human-readable label in the source-data language (e.g. « type de canne ») to a plain-text value with its units (e.g. « 1,80 m »). Product-specific — no fixed vocabulary.","type":"object","properties":{},"additionalProperties":{}},"productCategory":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."},"mappable":true,"description":"Product categories against external classification schemes (CPC, HS, NACE, …). Typically non-empty.","example":[{"code":"6402.91","name":"Waterproof footwear covering the ankle","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"}]},"relatedDocument":{"mappable":true,"description":"Related documents (user manuals, datasheets, certificates, …).","example":[{"linkURL":"https://brand.example.com/docs/care-instructions.pdf","linkName":"Care instructions","mediaType":"application/pdf"}],"type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"relatedParty":{"mappable":true,"description":"Parties involved in the product lifecycle, each with its role (manufacturer, distributor, …).","example":[{"role":"manufacturer","party":{"id":"https://id.gs1.org/414/1234567890128","name":"Acme Corp"}}],"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["owner","producer","manufacturer","processor","remanufacturer","recycler","operator","serviceProvider","inspector","certifier","logisticsProvider","carrier","consignor","consignee","importer","exporter","distributor","retailer","brandOwner","regulator"],"description":"Role taken by the party with respect to the product. Values follow the UNTP `PartyRole` vocabulary."},"party":{"type":"object","properties":{"type":{"default":["Party"],"type":"array","prefixItems":[{"type":"string","const":"Party"}]},"id":{"type":"string","description":"Globally unique identifier of the party (typically an URI, DID, or GS1 GLN URL)."},"name":{"type":"string","description":"Legal or trading name of the party."},"description":{"description":"Free-form description of the party.","type":"string"},"registeredId":{"description":"Registered legal identifier (e.g. SIRET, VAT number, GLN) as assigned by `idScheme`.","type":"string"},"idScheme":{"description":"Identifier scheme describing how to interpret `registeredId`.","type":"object","properties":{"type":{"default":["IdentifierScheme"],"type":"array","prefixItems":[{"type":"string","const":"IdentifierScheme"}]},"id":{"type":"string","description":"URI of the identifier scheme (e.g. `https://id.gs1.org/gln/`)."},"name":{"type":"string","description":"Human-readable name of the identifier scheme (e.g. \"GS1 GLN\")."}},"required":["id","name"]},"registrationCountry":{"description":"Country where the party is legally registered (may differ from the party’s operating location).","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"partyAddress":{"description":"Postal address of the party.","type":"object","properties":{"streetAddress":{"type":"string","description":"Street name and number, or equivalent line-1 of the address."},"postalCode":{"type":"string","description":"Postal or ZIP code. String-typed to preserve leading zeros and non-numeric formats."},"addressLocality":{"type":"string","description":"City or locality of the address."},"addressRegion":{"type":"string","description":"State, region, or province. Prefer ISO 3166-2 subdivision codes when known."},"addressCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country of the address, as a UNTP `Country` reference."}},"required":["streetAddress","postalCode","addressLocality","addressRegion","addressCountry"]},"organisationWebsite":{"description":"Public website URL of the party.","type":"string"},"industryCategory":{"description":"Industry classifications the party belongs to (e.g. NACE, ISIC codes).","type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"UNTP `Classification` entry pointing at a code in an external classification scheme."}}},"required":["id","name"],"description":"The party assuming the role."}},"required":["role","party"],"description":"UNTP `PartyRole` — association of a party with a specific role in the product lifecycle."}},"producedAtFacility":{"description":"Facility where the product was manufactured or assembled.","type":"object","properties":{"type":{"default":["Facility"],"type":"array","prefixItems":[{"type":"string","const":"Facility"}]},"id":{"type":"string","mappable":true,"description":"URI identifying the production facility.","example":"https://id.gs1.org/414/1234567890128"},"name":{"type":"string","mappable":true,"description":"Commercial or trading name of the physical site where production took place — a plant, workshop or assembly line. Not the manufacturer, brand or vendor: a company name alone does not identify a site.","example":"Acme Corp — Lyon Plant"},"registeredId":{"mappable":true,"description":"Legal identifier of the facility (e.g. GS1 GLN, national registry number).","example":"3760123450016","type":"string"}},"required":["id","name"]},"productionDate":{"mappable":true,"description":"Date the product (or batch / item) was physically manufactured (ISO 8601 `YYYY-MM-DD`). Not a record timestamp: a catalogue entry's creation, update or publication date is unrelated to when the goods were made.","example":"2026-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"expiryDate":{"mappable":true,"description":"Date the product expires or is no longer recommended for use (ISO 8601 `YYYY-MM-DD`). Absent when not applicable.","example":"2028-02-10","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"countryOfProduction":{"description":"Country where the product was produced. Used for regulatory labelling (e.g. \"Made in\").","type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"]},"dimensions":{"description":"Physical dimensions of the product itself (excluding packaging).","type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}}},"materialProvenance":{"mappable":true,"description":"Breakdown of the materials composing the product, with origins and recycled content.","example":[{"name":"Full-grain leather","originCountry":{"countryCode":"IT"},"materialType":{"code":"291000","name":"Leather","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.6}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."}},"packaging":{"description":"Primary packaging shipped with the product.","type":"object","properties":{"description":{"type":"string","mappable":true,"description":"Free-form description of the packaging (e.g. \"cardboard box with PE inner bag\").","example":"Recycled cardboard box with a paper honeycomb inner liner."},"dimensions":{"type":"object","properties":{"weight":{"description":"Weight of the item (typically in `KGM` or `GRM`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"GRM"}},"required":["value","unit"]},"length":{"description":"Length of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"width":{"description":"Width of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"height":{"description":"Height of the item.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"MTR"}},"required":["value","unit"]},"volume":{"description":"Volume of the item (typically in `LTR` or `MTQ`).","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"STL"}},"required":["value","unit"]}},"description":"Outer dimensions of the package, shipped as-is."},"materialUsed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Commercial or common name of the material (e.g. \"Organic cotton\")."},"originCountry":{"type":"object","properties":{"countryCode":{"type":"string","mappable":true,"description":"ISO 3166-1 alpha-2 country code as defined by the UNCEFACT vocabulary (https://vocabulary.uncefact.org/CountryId#).","example":"FR"},"countryName":{"mappable":true,"description":"Optional localized country name; informational only, the code is the authoritative identifier.","example":"France","type":"string"}},"required":["countryCode"],"description":"Country where the material was harvested or produced."},"materialType":{"type":"object","properties":{"code":{"type":"string","description":"Classification code value within the referenced scheme (e.g. `6109.10` for CPC)."},"name":{"type":"string","description":"Human-readable label corresponding to the code."},"definition":{"description":"Optional long-form definition of the classification entry.","type":"string"},"schemeID":{"type":"string","description":"Identifier of the classification scheme (e.g. `https://vocabulary.uncefact.org/cpc`)."},"schemeName":{"type":"string","description":"Human-readable name of the classification scheme (e.g. \"UN CPC\", \"HS 2022\")."}},"required":["code","name","schemeID","schemeName"],"description":"Classification of the material against an external scheme (e.g. ECHA, CAS)."},"mass":{"description":"Absolute mass of the material, when known.","type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"]},"massFraction":{"type":"number","minimum":0,"maximum":1,"description":"Share of the product mass represented by this material, expressed as a ratio in `[0, 1]` (e.g. `0.75` for 75%)."},"recycledMassFraction":{"description":"Share of `mass` that is post-consumer or post-industrial recycled content, expressed as a ratio in `[0, 1]`.","type":"number","minimum":0,"maximum":1},"hazardous":{"description":"When `true`, the material is classified as hazardous under applicable regulations (e.g. REACH, CLP).","type":"boolean"},"symbol":{"description":"Optional pictogram or labelling symbol associated with the material.","type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"]},"materialSafetyInformation":{"description":"Link to the material safety data sheet (SDS) or equivalent document.","type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"]}},"required":["name","originCountry","materialType","massFraction"],"description":"UNTP `Material` — component material of a product, including origin, share, recycled content and hazard information."},"mappable":true,"description":"Materials composing the packaging, with their mass fractions and recycled content.","example":[{"name":"Recycled cardboard","originCountry":{"countryCode":"FR"},"materialType":{"code":"481910","name":"Corrugated paper board","schemeID":"https://vocabulary.uncefact.org/CPC","schemeName":"CPC"},"massFraction":0.95}]},"packageLabel":{"description":"Images of the labelling printed on the package.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"description":"Claims specifically concerning the packaging (e.g. recyclability, compostability).","type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["description","dimensions","materialUsed"]},"productLabel":{"mappable":true,"description":"Images of the regulatory or commercial labels printed on the product.","example":[{"name":"CE marking","imageData":"https://brand.example.com/labels/ce-mark.png","mediaType":"image/png"}],"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Short label used to identify the image (e.g. \"Front view\")."},"description":{"description":"Optional longer description of the image content.","type":"string"},"imageData":{"type":"string","description":"Either a `data:` URL with the base64-encoded bytes, or an absolute URL pointing to the image resource."},"mediaType":{"type":"string","description":"IANA media type of the image (e.g. `image/png`, `image/webp`). See https://mimetype.io/."}},"required":["name","imageData","mediaType"],"description":"UNTP `Image` — embedded or referenced image attached to the passport."}},"performanceClaim":{"mappable":true,"description":"Headline performance claim attached to the product (e.g. energy class).","example":[{"id":"https://brand.example.com/claims/waterproof-2026","name":"Waterproof rating IPX7","referenceCriteria":[{"id":"https://vocabulary.uncefact.org/criteria/ipx7","name":"IPX7 immersion test"}],"claimDate":"2026-01-15","claimedPerformance":[{"metric":{"id":"https://example.org/metrics/water-resistance","name":"Water resistance"},"measure":{"value":1,"unit":"MTR"},"score":{"code":"IPX7"}}],"conformityTopic":[{"id":"https://vocabulary.uncefact.org/conformity/environmental","name":"Environmental"}]}],"type":"array","items":{"type":"object","properties":{"type":{"default":["Claim"],"type":"array","prefixItems":[{"type":"string","const":"Claim"}]},"id":{"type":"string","description":"URI uniquely identifying the claim within the issuer’s system."},"name":{"type":"string","description":"Short name of the claim (e.g. \"Organic certification\")."},"description":{"description":"Long-form description of what is being claimed.","type":"string"},"referenceCriteria":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Criterion"],"type":"array","prefixItems":[{"type":"string","const":"Criterion"}]},"id":{"type":"string","description":"URI identifying the criterion evaluated."},"name":{"type":"string","description":"Human-readable name of the criterion."}},"required":["id","name"],"description":"Individual criterion required to substantiate the claim."},"description":"Criteria referenced by the claim. Non-empty in practice."},"referenceRegulation":{"description":"Regulations the claim maps onto, when applicable.","type":"array","items":{"type":"object","properties":{"type":{"default":["Regulation"],"type":"array","prefixItems":[{"type":"string","const":"Regulation"}]},"id":{"type":"string","description":"URI identifying the regulation (e.g. \"https://eur-lex.europa.eu/eli/reg/2019/1020\")."},"name":{"type":"string","description":"Human-readable name of the regulation (e.g. \"EU 2019/1020\")."}},"required":["id","name"],"description":"Regulation the claim is aligned with or required by."}},"referenceStandard":{"description":"Voluntary standards the claim aligns with.","type":"array","items":{"type":"object","properties":{"type":{"default":["Standard"],"type":"array","prefixItems":[{"type":"string","const":"Standard"}]},"id":{"type":"string","description":"URI identifying the standard (e.g. \"https://www.iso.org/standard/14001\")."},"name":{"type":"string","description":"Human-readable name of the standard (e.g. \"ISO 14001\")."}},"required":["id","name"],"description":"Standard the claim conforms to."}},"claimDate":{"description":"Date on which the claim was issued by the credential issuer (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"applicablePeriod":{"description":"Period during which the claim is valid. When omitted, the claim is considered open-ended until the credential expires.","type":"object","properties":{"type":{"default":["Period"],"type":"array","prefixItems":[{"type":"string","const":"Period"}]},"startDate":{"description":"Inclusive start date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"endDate":{"description":"Inclusive end date of the period (ISO 8601 `YYYY-MM-DD`).","anyOf":[{"type":"string","format":"date","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])))$"},{"type":"string","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))$"}]},"periodInformation":{"description":"Free-form note about the period (e.g. \"harvest season 2025\").","type":"string"}}},"claimedPerformance":{"type":"array","items":{"type":"object","properties":{"type":{"default":["Performance"],"type":"array","prefixItems":[{"type":"string","const":"Performance"}]},"metric":{"type":"object","properties":{"type":{"default":["PerformanceMetric"],"type":"array","prefixItems":[{"type":"string","const":"PerformanceMetric"}]},"id":{"type":"string","description":"URI uniquely identifying the metric (e.g. `https://example.org/metrics/co2e`)."},"name":{"type":"string","description":"Human-readable name of the metric (e.g. \"Carbon footprint\")."}},"required":["id","name"],"description":"Definition of the performance metric being reported."},"measure":{"type":"object","properties":{"value":{"type":"number","mappable":true,"description":"Numerical magnitude of the measure, expressed in `unit`.","example":1.2},"upperTolerance":{"description":"Absolute upper deviation accepted around `value`, in the same unit.","type":"number"},"lowerTolerance":{"description":"Absolute lower deviation accepted around `value`, in the same unit.","type":"number"},"unit":{"type":"string","mappable":true,"description":"UN/ECE Recommendation 20 unit of measure code (e.g. `KGM`, `MTR`). Full list: https://vocabulary.uncefact.org/UnitMeasureCode#.","example":"KGM"}},"required":["value","unit"],"description":"Quantitative value achieved against the metric."},"score":{"type":"object","properties":{"type":{"default":["Score"],"type":"array","prefixItems":[{"type":"string","const":"Score"}]},"code":{"type":"string","description":"Symbolic score value (e.g. `A+`, `B`, `5-stars`). Interpreted according to the referenced metric."},"rank":{"description":"Numerical rank (`1` = best), allowing consumers to order or compare scores consistently.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"definition":{"description":"Optional description of the meaning of this score level.","type":"string"}},"required":["code"],"description":"Qualitative score corresponding to the measure (e.g. energy class)."}},"required":["metric","measure","score"],"description":"UNTP `Performance` — measured value and associated score for a given metric."},"description":"Supporting performance measurements backing the claim. Typically contains one entry per metric."},"evidence":{"description":"Links to third-party evidence documents (test reports, audit certificates, …).","type":"array","items":{"type":"object","properties":{"linkURL":{"type":"string","mappable":true,"description":"Absolute URL of the linked resource (RFC 3986).","example":"https://brand.example.com/products/hiking-boots/front.jpg"},"linkName":{"type":"string","mappable":true,"description":"Human-readable label shown to the user for this link.","example":"Front view"},"digestMultibase":{"mappable":true,"description":"Multibase-encoded hash of the target resource, allowing consumers to verify the content has not been tampered with. Format: https://www.w3.org/TR/vc-data-integrity/#multibase-0.","example":"zQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG","type":"string"},"mediaType":{"mappable":true,"description":"IANA media type of the linked resource (e.g. `application/pdf`). See https://mimetype.io/.","example":"image/jpeg","type":"string"},"linkType":{"mappable":true,"description":"Semantic relationship with the current resource, typically a UNTP link-type code (e.g. `certificate`, `manual`).","example":"productImage","type":"string"}},"required":["linkURL","linkName"],"description":"UNTP `Link` reference to an external document or media asset attached to the passport."}},"conformityTopic":{"type":"array","items":{"type":"object","properties":{"type":{"default":["ConformityTopic"],"type":"array","prefixItems":[{"type":"string","const":"ConformityTopic"}]},"id":{"type":"string","description":"URI identifying the conformity topic in the UNTP vocabulary."},"name":{"type":"string","description":"Human-readable topic name (e.g. \"Environmental\", \"Social\")."},"definition":{"description":"Optional definition of the topic scope.","type":"string"}},"required":["id","name"],"description":"UNTP `ConformityTopic` — thematic category used to group compliance claims (environmental, social, governance, …)."},"description":"Thematic topic the claim falls under (environmental, social, …)."}},"required":["id","name","referenceCriteria","claimedPerformance","conformityTopic"],"description":"UNTP `Claim` — declaration about the product substantiated by criteria, evidence and, optionally, regulations or standards."}}},"required":["id","name","idScheme","idGranularity","productCategory"],"description":"UNTP `Product` — credentialSubject of the Digital Product Passport verifiable credential."},"productSchemaOrg":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."},"gtin":{"type":"string","example":"03600029145843","description":"Global Trade Item Number (GS1). Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 as a numeric string without hyphens. See https://www.gs1.org/standards/id-keys/gtin."},"sku":{"type":"string","example":"SKU-2024-001","description":"Seller's internal Stock Keeping Unit identifier."},"brand":{"type":"object","properties":{"identifier":{"type":"string","description":"Unique identifier for the thing — may be a URI, a product SKU, or a domain-specific code. See https://schema.org/identifier."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Commercial brand associated with the product."},"countryOfOrigin":{"type":"object","properties":{"identifier":{"type":"string","minLength":2,"maxLength":2,"example":"FR","description":"ISO 3166-1 alpha-2 country code (2 uppercase letters). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2. Example: `\"FR\"`, `\"DE\"`, `\"JP\"`."},"name":{"type":"string","description":"Human-readable name of the thing."},"description":{"type":"string","description":"Free-text description of the thing."},"image":{"type":"string","format":"uri","example":"https://example.com/images/product.jpg","description":"Absolute HTTPS URL of a representative image. For IPFS-hosted images, use `passport.images` instead."}},"description":"Country where the product was manufactured or produced."},"keywords":{"type":"array","items":{"type":"string"},"description":"List of keywords used for search and classification of the product."},"additionalProperty":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{}},"required":["name","value"],"additionalProperties":{}}}},"description":"schema.org/Product — any offered product or service. Extends Thing with commerce-specific fields."},"data":{"type":"object","properties":{},"additionalProperties":{},"description":"Free-form business payload (attributes, traceability, compliance fields, ...). Consumed as the source object for the certified snapshot — see `certifiedPaths`."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public actions (links / buttons) rendered on the passport page (e.g. authenticity proof, care guide)."},"tokenId":{"type":"string","description":"Deterministic ERC-721 token identifier derived from the passport `id` (`0x` followed by the SHA-256 of the UUID). Computed server-side and available from creation — it is **not** populated by the on-chain mint, so reading it does not indicate whether the token has been minted yet. Read-only.","example":"0x04a8b3c5d6e7f8091a2b3c4d5e6f70819203a4b5c6d7e8f9001122334455667788"},"ipfsCid":{"type":"string","description":"IPFS CID of the published metadata snapshot. Set by the server, read-only.","example":"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi","nullable":true},"certificateUri":{"type":"string","description":"Optional https URL to a self-hosted signed Verifiable Credential. When provided on create/update, the server anchors this URI on-chain instead of uploading the credential to IPFS — letting the issuer host (and delete) the certificate itself for data-protection compliance. The hosted credential must be the exact VC returned by `POST /v1/dpp/passports/build-vc` for the same content. Must be sent together with `certificateSignature`. Leave null/absent to use the default IPFS flow.","example":"https://certs.example.com/dpp/550e8400.jsonld","nullable":true},"certificateSignature":{"type":"string","description":"The self-hosted credential's Data Integrity proof value (the VC `proof.proofValue`, multibase base58btc). Required together with `certificateUri`: it is anchored on-chain so a verifier can pin the served credential to its on-chain record (a self-hosted URL is mutable and not content-addressed). Anchoring it without re-supplying it when the certified content changes is rejected. Ignored for the IPFS flow.","example":"z3FXQjecWufY46yg5abdVZsXqLhxhueuSoGgQRDH8z3Rn...","nullable":true},"vcUrl":{"type":"string","description":"Relative API path to download the signed W3C Verifiable Credential (JSON-LD) of this passport, or null until it is certified. Resolve against the API base URL. Set by the server, read-only.","example":"/v1/dpp/passports/550e8400-e29b-41d4-a716-446655440000/vc.jsonld","nullable":true},"certificationStatus":{"type":"string","enum":["pending","certified","error"],"description":"On-chain certification outcome. `pending` while the certify job is queued or retrying, `certified` once the on-chain transaction succeeds, `error` once all retries are exhausted. Set by the server, read-only.","example":"certified"},"certifiedAt":{"type":"string","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))$","description":"Timestamp of the last successful on-chain certification. Set by the server when the certify job completes successfully, read-only.","example":"2026-04-28T12:00:00Z","nullable":true},"certifiedPaths":{"type":"array","items":{"type":"string"},"description":"Dot-notation paths selecting which fields from `data` are included in the signed certificate. When empty, the entire `data` object is certified. Example: `[\"brand\", \"gtin\", \"manufacturer.name\"]`. Updating this array on a published passport triggers a re-certification.","example":["brand","gtin","manufacturer.name"]},"certificationExplorerUrl":{"type":"string","format":"uri","description":"Absolute HTTPS URL of the last successful certification transaction on the public block explorer of `network` (e.g. BaseScan for Base). Null until the passport is certified on-chain, for passports certified before this field was introduced (back-filled on their next re-certification), and on networks without a public explorer. Set by the server, read-only.","example":"https://basescan.org/tx/0x9f8c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b","nullable":true},"vcStatus":{"type":"object","properties":{"state":{"type":"string","enum":["valid","pending","error","expired","revoked","suspended"],"description":"Derived VC lifecycle state for the consumer banner. V1 emits only `valid`, `pending`, or `error`; `expired`/`revoked`/`suspended` are part of the contract but not yet produced by the backend (no status list, no expiry policy).","example":"valid"},"issuer":{"type":"object","properties":{"id":{"type":"string","description":"DID identifying the issuer of the signed VC: `did:web:{domain}` when the organization configured a did:web domain, otherwise a key-derived `did:key:z...`. Resolve it to fetch the issuer DID document and verify the credential signature.","example":"did:web:brand.example.com"},"name":{"type":"string","description":"Legal or trading name of the issuing organization, shown in the \"Issued by ...\" VC banner.","example":"Acme Corp"}},"required":["id","name"],"description":"Issuer identity captured when the VC was signed. `null` until the passport is certified (state `pending`/`error`), and on passports certified before this field existed (back-filled on their next re-certification).","nullable":true},"validFrom":{"type":"string","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))$","description":"Issuance instant of the VC (W3C `validFrom`), equal to the last successful certification time. `null` until certified.","example":"2026-04-28T12:00:00Z","nullable":true},"validUntil":{"type":"string","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))$","description":"Expiry instant of the VC (W3C `validUntil`). Always `null` in V1 — Keyban DPPs do not expire yet; reserved for a future tenant expiry policy.","example":null,"nullable":true},"credentialStatus":{"description":"Pointer to the VC status entry (W3C Bitstring Status List `BitstringStatusListEntry`) used to revoke or suspend the credential. Always `null` in V1 — Keyban does not publish a status list yet.","example":null,"nullable":true}},"required":["state","issuer","validFrom","validUntil","credentialStatus"],"description":"W3C VC 2.0 status contract (issuer, validity window, derived state, revocation pointer) for the consumer VC banner. Computed server-side, read-only."},"allowedClaimEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"allowedClaimPhoneNumber":{"type":"string","format":"e164","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 phone number authorized to claim this item. Empty string is coerced to `null` (no restriction).","nullable":true},"mintedTo":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The ID of the account that owns the minted item, when claimed.","nullable":true},"stats":{"description":"Aggregated counters across the passport, by granularity: empty on `item` passports. Loaded on demand, absent when not requested.","type":"object","properties":{"batches":{"description":"Number of `batch` passports linked to this passport. Only on `model` passports.","type":"integer","minimum":0,"maximum":9007199254740991},"items":{"description":"Number of `item` passports linked to this passport. Only on `model` and `batch` passports.","type":"integer","minimum":0,"maximum":9007199254740991}}},"completion":{"type":"object","properties":{"missing":{"type":"array","items":{"type":"string"}},"completed":{"type":"array","items":{"type":"string"}},"total":{"type":"number"}},"required":["missing","completed","total"]},"trustScore":{"type":"integer","minimum":0,"maximum":100,"description":"Current Trust Score (0–100): a blend of data completeness, richness of extracted characteristics, and whether the passport is certified. Computed server-side on read, read-only. Reading bands: Solid ≥ 80, Reinforce 50–79, Fragile < 50. An uncertified passport cannot exceed 60.","example":72},"trustScoreBase":{"type":"integer","minimum":0,"maximum":100,"description":"Trust Score captured at first import — the frozen baseline the progression badge compares against (`↗ +X %`). Never rebased. Null for passports created before the score existed or outside the import flow. Set by the server, read-only.","example":40,"nullable":true},"model":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `model` passport, null when there is none.","nullable":true},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the parent `batch` passport, null when there is none.","nullable":true},"certifyJob":{"type":"string","description":"Identifier of the latest certification job, null when the passport was never certified.","nullable":true},"structureJob":{"type":"string","description":"Identifier of the latest AI structuration job, null when the passport was never structured.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Embedded parent `batch` passport, resolved via `batchNumber`. Null when the passport has no parent batch. Populated on read, ignored on create.","nullable":true},"certifyJob":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"name":{"type":"string"},"parent":{"type":"string","description":"Identifier of the parent job, null for a root job.","nullable":true},"status":{"type":"string","enum":["pending","completed","failed"]},"data":{},"result":{},"error":{"type":"string","nullable":true},"childrenStats":{"description":"Children counts by status. Loaded on demand, absent when not requested.","type":"object","properties":{"pending":{"type":"number"},"completed":{"type":"number"},"failed":{"type":"number"}},"required":["pending","completed","failed"]},"streamToken":{"type":"string"}},"required":["id","createdAt","name","status","streamToken"],"description":"Latest certification job for this passport. Null when the passport was never certified. Populated on read, ignored on create.","nullable":true},"structureJob":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","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))$"},"name":{"type":"string"},"parent":{"type":"string","description":"Identifier of the parent job, null for a root job.","nullable":true},"status":{"type":"string","enum":["pending","completed","failed"]},"data":{},"result":{},"error":{"type":"string","nullable":true},"childrenStats":{"description":"Children counts by status. Loaded on demand, absent when not requested.","type":"object","properties":{"pending":{"type":"number"},"completed":{"type":"number"},"failed":{"type":"number"}},"required":["pending","completed","failed"]},"streamToken":{"type":"string"}},"required":["id","createdAt","name","status","streamToken"],"description":"Latest AI structuration job for this passport (Trust feature). Null when the passport was never structured. Populated on read, ignored on create.","nullable":true}},"required":["id","createdAt","updatedAt","network","status","source","editable","webPageUrl","product","productUntp","productSchemaOrg","data","actions","tokenId","ipfsCid","certificateUri","certificateSignature","vcUrl","certificationStatus","certifiedAt","certifiedPaths","certificationExplorerUrl","vcStatus","completion","trustScore","trustScoreBase","model","batch","certifyJob","structureJob"],"description":"Full DPP passport (same shape as `/v1/dpp/passports`). Present only for `dppPassport` events; absent for other subjects."}},"required":["id","createdAt","updatedAt","application","subject","type","user","count","passport"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application owning the event."},"subject":{"type":"string","enum":["wallet"]},"type":{"type":"string","enum":["create","update","delete"]},"user":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User responsible for the event, when known.","nullable":true},"count":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":1,"description":"Aggregated count for this event row (default 1)."}},"required":["id","createdAt","updatedAt","application","subject","type","user","count"]}]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"PaginatedInvestFundDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the investment fund"},"description":{"type":"string","description":"Description of the investment fund","nullable":true},"currency":{"default":"EUR","description":"Currency of the fund (EUR, USD)","type":"string","enum":["EUR","USD"]},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Total number of shares in the fund"},"minimumInvestment":{"type":"number","minimum":0,"description":"Minimum investment amount","nullable":true},"lockupPeriod":{"type":"string","format":"date","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])))$","description":"Lock-up period end date","nullable":true},"secondaryMarketOfferDuration":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Duration of secondary market offers in days"},"p2pTransfer":{"type":"boolean","description":"Enable peer-to-peer transfers between investors"},"secondaryMarket":{"type":"boolean","description":"Enable secondary market trading"},"status":{"type":"string","enum":["ACTIVE","DRAFT","CLOSED"],"description":"Current status of the fund (Draft, Active, Closed)"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"nav":{"type":"number","minimum":0,"description":"Current Net Asset Value (computed)"},"investors":{"type":"number","minimum":0,"description":"Number of investors in the fund"},"distributedShares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of shares currently held by investors (computed)"},"lockedShares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of distributed shares currently under an active lockup (computed)"}},"required":["application","name","shares","secondaryMarketOfferDuration","p2pTransfer","secondaryMarket","status","id","createdAt","updatedAt","nav","investors","distributedShares","lockedShares"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"InvestFundDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the investment fund"},"description":{"type":"string","description":"Description of the investment fund","nullable":true},"currency":{"default":"EUR","description":"Currency of the fund (EUR, USD)","type":"string","enum":["EUR","USD"]},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Total number of shares in the fund"},"minimumInvestment":{"type":"number","minimum":0,"description":"Minimum investment amount","nullable":true},"lockupPeriod":{"type":"string","format":"date","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])))$","description":"Lock-up period end date","nullable":true},"secondaryMarketOfferDuration":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Duration of secondary market offers in days"},"p2pTransfer":{"type":"boolean","description":"Enable peer-to-peer transfers between investors"},"secondaryMarket":{"type":"boolean","description":"Enable secondary market trading"},"status":{"type":"string","enum":["ACTIVE","DRAFT","CLOSED"],"description":"Current status of the fund (Draft, Active, Closed)"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"nav":{"type":"number","minimum":0,"description":"Current Net Asset Value (computed)"},"investors":{"type":"number","minimum":0,"description":"Number of investors in the fund"},"distributedShares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of shares currently held by investors (computed)"},"lockedShares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of distributed shares currently under an active lockup (computed)"}},"required":["application","name","shares","secondaryMarketOfferDuration","p2pTransfer","secondaryMarket","status","id","createdAt","updatedAt","nav","investors","distributedShares","lockedShares"]},"CreateInvestFundDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the application"},"name":{"type":"string","description":"The name of the investment fund"},"description":{"type":"string","description":"Description of the investment fund","nullable":true},"currency":{"default":"EUR","description":"Currency of the fund (EUR, USD)","type":"string","enum":["EUR","USD"]},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Total number of shares in the fund"},"minimumInvestment":{"type":"number","minimum":0,"description":"Minimum investment amount","nullable":true},"lockupPeriod":{"type":"string","format":"date","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])))$","description":"Lock-up period end date","nullable":true},"secondaryMarketOfferDuration":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Duration of secondary market offers in days"},"p2pTransfer":{"default":false,"description":"Enable peer-to-peer transfers between investors","type":"boolean"},"secondaryMarket":{"default":false,"description":"Enable secondary market trading","type":"boolean"},"status":{"type":"string","enum":["ACTIVE","DRAFT","CLOSED"],"description":"Current status of the fund (Draft, Active, Closed)"},"initialNav":{"type":"number","minimum":0,"description":"Initial Net Asset Value of the fund (required at creation)"}},"required":["application","name","shares","secondaryMarketOfferDuration","status","initialNav"]},"UpdateInvestFundDto":{"type":"object","properties":{"name":{"type":"string","description":"The name of the investment fund"},"description":{"type":"string","description":"Description of the investment fund","nullable":true},"currency":{"default":"EUR","description":"Currency of the fund (EUR, USD)","type":"string","enum":["EUR","USD"]},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Total number of shares in the fund"},"minimumInvestment":{"type":"number","minimum":0,"description":"Minimum investment amount","nullable":true},"lockupPeriod":{"type":"string","format":"date","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])))$","description":"Lock-up period end date","nullable":true},"secondaryMarketOfferDuration":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Duration of secondary market offers in days"},"p2pTransfer":{"type":"boolean","description":"Enable peer-to-peer transfers between investors"},"secondaryMarket":{"type":"boolean","description":"Enable secondary market trading"},"status":{"type":"string","enum":["ACTIVE","DRAFT","CLOSED"],"description":"Current status of the fund (Draft, Active, Closed)"}}},"MyInvestHoldingDto":{"type":"object","properties":{"shares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of shares held by the current investor in this fund"},"lockupEndDate":{"type":"string","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))$","description":"Effective lockup end date: the latest (max) of the fund-level lockup and the investor-level lockup, ignoring already-expired dates. Null when neither applies.","nullable":true}},"required":["shares","lockupEndDate"]},"PaginatedInvestNavDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","description":"UUID of the investment fund this NAV record belongs to."},"value":{"type":"number","minimum":0,"example":1250000,"description":"Total Net Asset Value of the fund at this point in time, expressed in the fund's own currency (see `fund.currency`). Divide by the fund's total share count to obtain the per-share NAV."},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"date":{"type":"string","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))$","example":"2026-04-24T00:00:00Z","description":"ISO 8601 datetime of the NAV record (YYYY-MM-DDTHH:mm:ssZ). Typically recorded once per business day at market close."}},"required":["fund","value","id","createdAt","updatedAt","date"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"PaginatedInvestHoldingDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investment fund"},"identity":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"},"status":{"default":"WAITING_KYC","description":"KYC lifecycle status of the identity","type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"}},"required":["firstName","lastName","id","createdAt","updatedAt"]},"shares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of shares held by the investor"}},"required":["id","createdAt","updatedAt","fund","identity","shares"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"InvestHoldingDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investment fund"},"identity":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"},"status":{"default":"WAITING_KYC","description":"KYC lifecycle status of the identity","type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"}},"required":["firstName","lastName","id","createdAt","updatedAt"]},"shares":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of shares held by the investor"}},"required":["id","createdAt","updatedAt","fund","identity","shares"]},"DistributeSharesDto":{"type":"object","properties":{"identity":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investor identity"},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of shares to distribute"},"price":{"type":"number","minimum":0,"description":"Total price of the distribution"}},"required":["identity","shares","price"]},"InvestTransactionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","description":"The unique identifier of the investment fund"},"seller":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","description":"UUID of the InvestIdentity acting as the seller. Null when `type` is `INITIAL_DISTRIBUTION` (primary issuance: the fund itself emits shares, there is no selling counterparty).","nullable":true},"buyer":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","description":"UUID of the InvestIdentity acting as the buyer. Null when `type` is `BUY_BACK` (the fund redeems shares from an investor; there is no buying counterparty).","nullable":true},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":100,"description":"Number of whole shares exchanged in this transaction (minimum 1)."},"price":{"type":"number","minimum":0,"example":125.5,"description":"Unit price per share in the fund currency at the time of the transaction. Multiply by `shares` to obtain the total settlement amount."},"currency":{"type":"string","enum":["EUR","USD"],"example":"EUR","description":"Currency of the transaction, inherited from the fund (ISO 4217 code, e.g. `EUR`, `USD`)."},"type":{"type":"string","enum":["INITIAL_DISTRIBUTION","BUY_BACK","SECONDARY_MARKET"],"example":"SECONDARY_MARKET","description":"Transaction type. `INITIAL_DISTRIBUTION`: primary issuance of shares from the fund to a KYC-verified investor — `seller` is null. `BUY_BACK`: fund redemption of shares held by an investor — `buyer` is null. `SECONDARY_MARKET`: peer-to-peer transfer of shares between two investors via a secondary-market offer."},"status":{"type":"string","enum":["PENDING","VALIDATED","REJECTED"],"example":"VALIDATED","description":"Lifecycle status of the transaction. `PENDING`: submitted and awaiting validation (KYC check, blockchain settlement). `VALIDATED`: confirmed on-chain; shares have been transferred. `REJECTED`: declined due to KYC failure, lockup period violation, or insufficient funds."}},"required":["id","createdAt","updatedAt","fund","shares","price","currency","type","status"]},"RedeemSharesDto":{"type":"object","properties":{"identity":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investor identity"},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Number of shares to redeem"},"price":{"type":"number","minimum":0,"description":"Total price of the redemption"}},"required":["identity","shares","price"]},"PaginatedInvestIdentityDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"},"status":{"default":"WAITING_KYC","description":"KYC lifecycle status of the identity","type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"account":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["id","name","email"]}},"required":["id","user"]}},"required":["firstName","lastName","id","createdAt","updatedAt","account"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"CreateInvestIdentityDto":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"}},"required":["firstName","lastName"]},"UpdateInvestIdentityDto":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"},"status":{"default":"WAITING_KYC","description":"KYC lifecycle status of the identity","type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]}}},"PaginatedInvestLockupDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investment fund"},"identity":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"},"status":{"default":"WAITING_KYC","description":"KYC lifecycle status of the identity","type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"}},"required":["firstName","lastName","id","createdAt","updatedAt"]},"endDate":{"type":"string","format":"date","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])))$","description":"End date of the custom lockup period"}},"required":["id","createdAt","updatedAt","fund","identity","endDate"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"InvestLockupDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investment fund"},"identity":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the investor"},"lastName":{"type":"string","description":"Last name of the investor"},"status":{"default":"WAITING_KYC","description":"KYC lifecycle status of the identity","type":"string","enum":["WAITING_KYC","KYC_DONE","REJECTED_KYC"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"}},"required":["firstName","lastName","id","createdAt","updatedAt"]},"endDate":{"type":"string","format":"date","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])))$","description":"End date of the custom lockup period"}},"required":["id","createdAt","updatedAt","fund","identity","endDate"]},"CreateInvestLockupDto":{"type":"object","properties":{"identity":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The unique identifier of the investor identity"},"endDate":{"type":"string","format":"date","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])))$","description":"End date of the custom lockup period"}},"required":["identity","endDate"]},"UpdateInvestLockupDto":{"type":"object","properties":{"endDate":{"type":"string","format":"date","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])))$","description":"End date of the custom lockup period"}}},"InvestNavDto":{"type":"object","properties":{"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","description":"UUID of the investment fund this NAV record belongs to."},"value":{"type":"number","minimum":0,"example":1250000,"description":"Total Net Asset Value of the fund at this point in time, expressed in the fund's own currency (see `fund.currency`). Divide by the fund's total share count to obtain the per-share NAV."},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"date":{"type":"string","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))$","example":"2026-04-24T00:00:00Z","description":"ISO 8601 datetime of the NAV record (YYYY-MM-DDTHH:mm:ssZ). Typically recorded once per business day at market close."}},"required":["fund","value","id","createdAt","updatedAt","date"]},"CreateInvestNavDto":{"type":"object","properties":{"value":{"type":"number","minimum":0,"example":1250000,"description":"Total Net Asset Value of the fund at this point in time, expressed in the fund's own currency (see `fund.currency`). Divide by the fund's total share count to obtain the per-share NAV."}},"required":["value"]},"PaginatedInvestOfferDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Green Energy Fund I"}},"required":["id","name"],"description":"The investment fund associated with the offer"},"identity":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"firstName":{"type":"string","example":"Jane"},"lastName":{"type":"string","example":"Doe"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","example":"jane.doe@acme.example"}},"required":["id","firstName","lastName","email"],"description":"The investor who created the offer"},"type":{"type":"string","enum":["BUY","SELL"],"example":"SELL","description":"Direction of the offer on the secondary market. `BUY` indicates the investor is looking to purchase shares; `SELL` indicates they are offering shares for sale."},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":10,"description":"Number of shares offered"},"price":{"type":"number","exclusiveMinimum":true,"example":125.5,"description":"Unit price per share","minimum":0},"currency":{"type":"string","enum":["EUR","USD"],"example":"EUR","description":"Currency of the offer"},"expiresAt":{"type":"string","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))$","example":"2026-12-31T23:59:59.000Z","description":"Expiration date of the offer"}},"required":["id","createdAt","updatedAt","fund","identity","type","shares","price","currency","expiresAt"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"InvestOfferDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Green Energy Fund I"}},"required":["id","name"],"description":"The investment fund associated with the offer"},"identity":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"firstName":{"type":"string","example":"Jane"},"lastName":{"type":"string","example":"Doe"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","example":"jane.doe@acme.example"}},"required":["id","firstName","lastName","email"],"description":"The investor who created the offer"},"type":{"type":"string","enum":["BUY","SELL"],"example":"SELL","description":"Direction of the offer on the secondary market. `BUY` indicates the investor is looking to purchase shares; `SELL` indicates they are offering shares for sale."},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":10,"description":"Number of shares offered"},"price":{"type":"number","exclusiveMinimum":true,"example":125.5,"description":"Unit price per share","minimum":0},"currency":{"type":"string","enum":["EUR","USD"],"example":"EUR","description":"Currency of the offer"},"expiresAt":{"type":"string","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))$","example":"2026-12-31T23:59:59.000Z","description":"Expiration date of the offer"}},"required":["id","createdAt","updatedAt","fund","identity","type","shares","price","currency","expiresAt"]},"CreateInvestOfferDto":{"type":"object","properties":{"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","description":"The unique identifier of the investment fund"},"identity":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","description":"The unique identifier of the investor identity"},"type":{"type":"string","enum":["BUY","SELL"],"example":"SELL","description":"Direction of the offer on the secondary market. `BUY` indicates the investor is looking to purchase shares; `SELL` indicates they are offering shares for sale."},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":10,"description":"Number of shares offered"},"price":{"type":"number","exclusiveMinimum":true,"example":125.5,"description":"Unit price per share","minimum":0}},"required":["fund","identity","type","shares","price"]},"UpdateInvestOfferDto":{"type":"object","properties":{"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":10,"description":"Number of shares offered"},"price":{"type":"number","exclusiveMinimum":true,"example":125.5,"description":"Unit price per share","minimum":0}}},"PaginatedInvestTransactionDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"fund":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"550e8400-e29b-41d4-a716-446655440000","description":"The unique identifier of the investment fund"},"seller":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","description":"UUID of the InvestIdentity acting as the seller. Null when `type` is `INITIAL_DISTRIBUTION` (primary issuance: the fund itself emits shares, there is no selling counterparty).","nullable":true},"buyer":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","description":"UUID of the InvestIdentity acting as the buyer. Null when `type` is `BUY_BACK` (the fund redeems shares from an investor; there is no buying counterparty).","nullable":true},"shares":{"type":"integer","minimum":1,"maximum":9007199254740991,"example":100,"description":"Number of whole shares exchanged in this transaction (minimum 1)."},"price":{"type":"number","minimum":0,"example":125.5,"description":"Unit price per share in the fund currency at the time of the transaction. Multiply by `shares` to obtain the total settlement amount."},"currency":{"type":"string","enum":["EUR","USD"],"example":"EUR","description":"Currency of the transaction, inherited from the fund (ISO 4217 code, e.g. `EUR`, `USD`)."},"type":{"type":"string","enum":["INITIAL_DISTRIBUTION","BUY_BACK","SECONDARY_MARKET"],"example":"SECONDARY_MARKET","description":"Transaction type. `INITIAL_DISTRIBUTION`: primary issuance of shares from the fund to a KYC-verified investor — `seller` is null. `BUY_BACK`: fund redemption of shares held by an investor — `buyer` is null. `SECONDARY_MARKET`: peer-to-peer transfer of shares between two investors via a secondary-market offer."},"status":{"type":"string","enum":["PENDING","VALIDATED","REJECTED"],"example":"VALIDATED","description":"Lifecycle status of the transaction. `PENDING`: submitted and awaiting validation (KYC check, blockchain settlement). `VALIDATED`: confirmed on-chain; shares have been transferred. `REJECTED`: declined due to KYC failure, lockup period violation, or insufficient funds."}},"required":["id","createdAt","updatedAt","fund","shares","price","currency","type","status"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"PaginatedAgentWalletDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"label":{"type":"string","description":"Human-readable label for the wallet"},"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application this wallet belongs to"},"address":{"type":"string","description":"On-chain address of the wallet"},"status":{"type":"string","enum":["deploying","ready","active","failed"],"description":"Current deployment status of the wallet"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network of the wallet"},"paymentRail":{"type":"string","enum":["x402"],"description":"Settlement rail the wallet uses to move funds.","example":"x402"},"owner":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User ID of the owner.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","description":"Display name of the owner, as set on their user profile.","example":"Jeanne Martin"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address of the owner.","example":"jeanne.martin@example.com"}},"required":["id","name","email"],"additionalProperties":false,"description":"Owner (responsable) accountable for the wallet spending. Null on wallets created before owners were introduced.","nullable":true},"whitelist":{"type":"array","items":{"type":"string"},"description":"Bare x402 domains this wallet may pay on — the domains of its wallet-scope destination allow rule. Empty when the wallet has no allow rule (a deny-list or no rule leaves it empty). Surfaced here so the admin list can render the domains without a second call.","example":["api.example.com","openai.com"]},"budget":{"type":"object","properties":{"currency":{"type":"string","description":"ISO 4217 code the caps and spent amounts are denominated in.","example":"EUR"},"day":{"type":"object","properties":{"cap":{"type":"string","description":"Spending cap for the window, in reference-currency sub-units (e.g. EUR cents — divide by 100 for the major amount). Null = no cap.","example":"50000","nullable":true},"spent":{"type":"string","description":"Amount already consumed in the window, same sub-unit encoding as `cap`. Sum of the reference amounts of consumed policy intents since the window start. \"0\" when nothing was spent.","example":"12500"}},"required":["cap","spent"],"additionalProperties":false,"description":"Calendar-day window (policy timezone)."},"week":{"type":"object","properties":{"cap":{"type":"string","description":"Spending cap for the window, in reference-currency sub-units (e.g. EUR cents — divide by 100 for the major amount). Null = no cap.","example":"50000","nullable":true},"spent":{"type":"string","description":"Amount already consumed in the window, same sub-unit encoding as `cap`. Sum of the reference amounts of consumed policy intents since the window start. \"0\" when nothing was spent.","example":"12500"}},"required":["cap","spent"],"additionalProperties":false,"description":"Calendar-week window, Monday→Sunday (policy timezone)."},"month":{"type":"object","properties":{"cap":{"type":"string","description":"Spending cap for the window, in reference-currency sub-units (e.g. EUR cents — divide by 100 for the major amount). Null = no cap.","example":"50000","nullable":true},"spent":{"type":"string","description":"Amount already consumed in the window, same sub-unit encoding as `cap`. Sum of the reference amounts of consumed policy intents since the window start. \"0\" when nothing was spent.","example":"12500"}},"required":["cap","spent"],"additionalProperties":false,"description":"Calendar-month window (policy timezone)."}},"required":["currency","day","week","month"],"additionalProperties":false,"description":"Per-window (day/week/month) spending budget usage derived from the wallet's policy: each window carries its cap and the amount already consumed. Null when the wallet has no policy. Surfaced here so the admin can show budget consumption without extra calls.","nullable":true},"emergencyStop":{"type":"boolean","description":"True while the wallet is paused by its emergency stop: every payment is refused until it is resumed. False when the wallet has no policy.","example":false}},"required":["id","createdAt","updatedAt","label","applicationId","address","status","network","paymentRail","owner","whitelist","budget","emergencyStop"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"PaginatedAgentWalletIntentDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Canonical hash of the signing request the intent authorises. 0x-prefixed, 32-byte (64 hex chars). Unique per subject — the same hash is never re-signed (ADR-86 anti-replay).","example":"0xa3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1"},"kind":{"type":"string","description":"Payment kind label emitted by the payment extractor (opaque to the engine).","example":"usdc-transfer"},"recipient":{"type":"string","description":"Case-normalised (lowercased) recipient: an on-chain address for relay payments, or the seller host for x402.","example":"0x4f6e8b129fa2c1b3d5e7a9c0b2d4f6e8a0c2e4f6"},"resource":{"type":"string","description":"x402 resource the payment unlocks: seller host + path only (query string and fragment stripped, so no per-request secret is stored). Null for relay payments, which target an on-chain address rather than a URL.","example":"api.shop.example.com/premium/report","nullable":true},"asset":{"type":"string","description":"Asset symbol/label the amount is denominated in.","example":"USDC"},"amountNative":{"type":"string","pattern":"^\\d+$","description":"Raw transfer amount as a decimal integer string, in the asset's smallest unit (wei for ETH, base units for USDC).","example":"12500000"},"amountRef":{"type":"string","pattern":"^\\d+$","description":"Reference-currency value at intent creation, as a decimal integer string in centi-units of the policy currency (e.g. 1180 = 11.80).","example":"1180"},"approvedAmountRef":{"type":"string","pattern":"^\\d+$","description":"Reference value the human approved — the anchor a later re-validation tolerates volatility drift around (#4254). Null until the first decision.","example":"1180","nullable":true},"currentAmountRef":{"type":"string","pattern":"^\\d+$","description":"Reference value re-priced at read time (#4254), so a human deciding now judges the current worth, not the stale stored one. Present on reads that re-price; absent when not recomputed.","example":"1185","nullable":true},"state":{"type":"string","enum":["pending_human_approval","approved","declined","abandoned","consumed","expired","failed"],"description":"Lifecycle state: pending_human_approval → approved → consumed, or pending_human_approval → declined. Only consumed is terminal; declined is reversible.","example":"pending_human_approval"},"decidedAt":{"type":"string","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))$","description":"When a human approved or declined the intent (RFC 3339). Null while still pending.","example":"2026-06-17T14:32:00Z","nullable":true},"decidedBy":{"type":"string","description":"Account (email) of the human who approved or declined the intent, captured at decision time. Null for auto-approved intents (no human in the loop) or those still pending.","example":"jane.doe@example.com","nullable":true},"consumedAt":{"type":"string","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))$","description":"When the signature consumed the intent at /sign (RFC 3339). Null until executed.","example":"2026-06-17T14:33:10Z","nullable":true},"expiresAt":{"type":"string","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))$","description":"x402 EIP-3009 validBefore as a wall-clock instant (RFC 3339). Null for relay payments (no time window).","example":"2026-06-17T14:33:00Z","nullable":true},"events":{"default":[],"description":"Append-only lifecycle timeline, oldest first (#4254): one entry per decision point so a reviewer can see how the value moved across the intent → approval → signature window.","type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["created","human_approved","human_declined","agent_abandoned","revalidated","revalidation_required","consumed","expired","settlement_failed"],"description":"Lifecycle checkpoint this entry records (created, human decision, revalidation, or consumption).","example":"human_approved"},"amountRef":{"type":"string","pattern":"^\\d+$","description":"Reference-currency value priced at this checkpoint, as a decimal integer string in centi-units of the policy currency (same encoding as the intent amountRef).","example":"1180"},"at":{"type":"string","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))$","description":"When the checkpoint happened (RFC 3339), taken from the event row creation time.","example":"2026-06-17T14:32:00Z"}},"required":["kind","amountRef","at"],"additionalProperties":false}},"wallet":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the agent wallet the intent belongs to.","example":"550e8400-e29b-41d4-a716-446655440000"},"label":{"type":"string","description":"Human-readable agent wallet name.","example":"Shopping Agent"},"network":{"type":"string","description":"Network identifier the wallet runs on (opaque label, e.g. \"BaseSepolia\").","example":"BaseSepolia"}},"required":["id","label","network"],"additionalProperties":false,"description":"Owning agent wallet, denormalised for display."},"sponsored":{"type":"boolean","description":"True when the Keyban welcome offer pays this x402 payment: the USDC leaves the Keyban sponsor wallet, not the agent wallet. Set from evaluation, so already true while the intent awaits human approval.","example":false}},"required":["id","createdAt","updatedAt","hash","kind","recipient","asset","amountNative","amountRef","state","events","wallet","sponsored"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"SponsorGrantDto_Output":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Agent wallet the offer covers (the first Base agent wallet of the organization); no other wallet is sponsored","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"walletAddress":{"type":"string","description":"On-chain address of the agent wallet the offer covers","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Network on which Keyban covers the payments","example":"BaseSepolia"},"amount":{"type":"string","description":"Amount offered, in USDC base units (6 decimals)","example":"1000000"},"remaining":{"type":"string","description":"Amount still covered, in USDC base units (6 decimals)","example":"620000"},"grantedAt":{"type":"string","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))$","description":"When the offer was granted (first Base agent wallet)","example":"2026-10-08T09:00:00.000Z"},"expiresAt":{"type":"string","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))$","description":"When what remains stops being covered","example":"2026-11-07T09:00:00.000Z"},"status":{"type":"string","enum":["active","exhausted","expired"],"description":"active, exhausted (fully spent) or expired","example":"active"}},"required":["walletId","walletAddress","network","amount","remaining","grantedAt","expiresAt","status"],"additionalProperties":false,"nullable":true},"AgentWalletDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"label":{"type":"string","description":"Human-readable label for the wallet"},"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application this wallet belongs to"},"address":{"type":"string","description":"On-chain address of the wallet"},"status":{"type":"string","enum":["deploying","ready","active","failed"],"description":"Current deployment status of the wallet"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network of the wallet"},"paymentRail":{"type":"string","enum":["x402"],"description":"Settlement rail the wallet uses to move funds.","example":"x402"},"owner":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User ID of the owner.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","description":"Display name of the owner, as set on their user profile.","example":"Jeanne Martin"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address of the owner.","example":"jeanne.martin@example.com"}},"required":["id","name","email"],"additionalProperties":false,"description":"Owner (responsable) accountable for the wallet spending. Null on wallets created before owners were introduced.","nullable":true},"whitelist":{"type":"array","items":{"type":"string"},"description":"Bare x402 domains this wallet may pay on — the domains of its wallet-scope destination allow rule. Empty when the wallet has no allow rule (a deny-list or no rule leaves it empty). Surfaced here so the admin list can render the domains without a second call.","example":["api.example.com","openai.com"]},"budget":{"type":"object","properties":{"currency":{"type":"string","description":"ISO 4217 code the caps and spent amounts are denominated in.","example":"EUR"},"day":{"type":"object","properties":{"cap":{"type":"string","description":"Spending cap for the window, in reference-currency sub-units (e.g. EUR cents — divide by 100 for the major amount). Null = no cap.","example":"50000","nullable":true},"spent":{"type":"string","description":"Amount already consumed in the window, same sub-unit encoding as `cap`. Sum of the reference amounts of consumed policy intents since the window start. \"0\" when nothing was spent.","example":"12500"}},"required":["cap","spent"],"additionalProperties":false,"description":"Calendar-day window (policy timezone)."},"week":{"type":"object","properties":{"cap":{"type":"string","description":"Spending cap for the window, in reference-currency sub-units (e.g. EUR cents — divide by 100 for the major amount). Null = no cap.","example":"50000","nullable":true},"spent":{"type":"string","description":"Amount already consumed in the window, same sub-unit encoding as `cap`. Sum of the reference amounts of consumed policy intents since the window start. \"0\" when nothing was spent.","example":"12500"}},"required":["cap","spent"],"additionalProperties":false,"description":"Calendar-week window, Monday→Sunday (policy timezone)."},"month":{"type":"object","properties":{"cap":{"type":"string","description":"Spending cap for the window, in reference-currency sub-units (e.g. EUR cents — divide by 100 for the major amount). Null = no cap.","example":"50000","nullable":true},"spent":{"type":"string","description":"Amount already consumed in the window, same sub-unit encoding as `cap`. Sum of the reference amounts of consumed policy intents since the window start. \"0\" when nothing was spent.","example":"12500"}},"required":["cap","spent"],"additionalProperties":false,"description":"Calendar-month window (policy timezone)."}},"required":["currency","day","week","month"],"additionalProperties":false,"description":"Per-window (day/week/month) spending budget usage derived from the wallet's policy: each window carries its cap and the amount already consumed. Null when the wallet has no policy. Surfaced here so the admin can show budget consumption without extra calls.","nullable":true},"emergencyStop":{"type":"boolean","description":"True while the wallet is paused by its emergency stop: every payment is refused until it is resumed. False when the wallet has no policy.","example":false}},"required":["id","createdAt","updatedAt","label","applicationId","address","status","network","paymentRail","owner","whitelist","budget","emergencyStop"],"additionalProperties":false},"CreateAgentWalletDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application ID"},"label":{"type":"string","minLength":1,"description":"Human-readable label for the wallet"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network for the wallet"},"paymentRail":{"default":"x402","description":"Settlement rail the wallet uses to move funds. Defaults to `x402` (USDC over the x402 protocol), the only rail wired today.","example":"x402","type":"string","enum":["x402"]},"owner":{"description":"User ID of the owner (responsable) accountable for this wallet. Must be a member of the organization owning the application. Defaults to the authenticated session user when omitted.","example":"550e8400-e29b-41d4-a716-446655440000","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"policy":{"description":"Optional spending policy persisted atomically with the wallet. When provided, the wallet, its first signer and this policy are committed in a single transaction, so a deployed wallet can never be left without its spending caps. Omit to create a wallet with no policy (caps can be set later via PUT .../policy).","type":"object","properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"Reference currency the caps are denominated in, as an ISO 4217 code (e.g. EUR, USD, JPY). Any code the rate oracle can quote works — no enum."},"maxAmountPerPaymentRef":{"type":"string","pattern":"^\\d+$","description":"Per-signature ceiling, expressed as a non-negative integer in the smallest sub-unit of the policy reference currency. Null = no cap.","nullable":true},"requireHumanAboveRef":{"type":"string","pattern":"^\\d+$","description":"Threshold (same encoding as maxAmountPerPaymentRef) above which evaluateIntent returns require_human. Null = never require human approval.","nullable":true},"volatilityMarginBps":{"type":"integer","minimum":0,"maximum":10000,"description":"Volatility tolerance in basis points (100 = 1%, max 10000 = 100%) applied when re-validating an already-approved intent against a freshly re-priced amount. Absorbs rate drift between the human approval and the signature: a retry is honored while the value stays within this margin of the approved value, otherwise it is re-escalated for a fresh human decision. Null/0 = strict (no tolerance).","nullable":true},"timezone":{"type":"string","description":"IANA time zone the budget windows are computed in (e.g. Europe/Paris). Null = UTC.","nullable":true},"maxAmountPerDayRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar day (in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no daily envelope.","nullable":true},"maxAmountPerWeekRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar week (Monday→Sunday, in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no weekly envelope.","nullable":true},"maxAmountPerMonthRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar month (in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no monthly envelope.","nullable":true}},"required":["currency"],"additionalProperties":false}},"required":["application","label","network"]},"UpdateAgentWalletDto":{"type":"object","properties":{"label":{"type":"string","minLength":1,"description":"Human-readable label for the wallet"}},"required":["label"]},"CreateFollowerKeyRequestDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable label for the follower key, shown in key listings."}},"required":["name"]},"FollowerKeyDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier of the follower API key."},"key":{"type":"string","description":"Plaintext API key, returned only in this response."}},"required":["id","key"],"additionalProperties":false},"AgentWalletExpenseStatsDto":{"type":"object","properties":{"month":{"type":"string","description":"Start of the window the stats cover: `since` when given, otherwise the first instant of the current month (UTC).","example":"2026-06-01T00:00:00.000Z"},"currency":{"type":"string","description":"Display currency of the amounts: the app preferred currency (ISO 4217), or \"USDC\" when the rate oracle is unavailable.","example":"EUR"},"fiatAvailable":{"type":"boolean","description":"False when amounts fell back to USDC (oracle unavailable).","example":true},"totalSpentRef":{"type":"string","description":"Total outgoing this month. Unit depends on `fiatAvailable`: centi-units of the display currency when true (divide by 100); USDC base units (10^6) when false (divide by 10^6). Do not change one consumer path without the other.","example":"11875000"},"txCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of successful outgoing transfers counted in the total.","example":42},"averageTicketRef":{"type":"string","description":"totalSpentRef / txCount (integer division), same unit as totalSpentRef. Unit depends on `fiatAvailable`: centi-units of the display currency when true (divide by 100); USDC base units (10^6) when false (divide by 10^6). Do not change one consumer path without the other.","example":"283000"},"excludedAssets":{"type":"array","items":{"type":"string"},"description":"Outgoing assets left out of the total: anything but the canonical USDC contract, native coin included. A token is labelled with its symbol and abbreviated contract address, e.g. \"USDC (0x6c94…d28c)\"."}},"required":["month","currency","fiatAvailable","totalSpentRef","txCount","averageTicketRef","excludedAssets"]},"AgentWalletDailySpendDto":{"type":"object","properties":{"currency":{"type":"string","description":"Reference currency of every amount (the organization's preferred currency).","example":"EUR"},"wallets":{"type":"array","items":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Agent wallet the rate belongs to.","example":"6f1d6f3a-6f2e-4a2b-9d3f-2b5a7c9e1d44"},"dailyRateRef":{"type":"string","description":"Average spend per day over the retained window, in reference-currency sub-units (divide by 100), rounded up so a runway derived from it stays pessimistic. \"0\" when the wallet spent nothing over the last 30 days.","example":"412"},"window":{"anyOf":[{"type":"number","enum":[7]},{"type":"number","enum":[30]}],"description":"Window the rate was computed over: 7 days, or 30 when the last 7 days carried no spend at all.","example":7}},"required":["walletId","dailyRateRef","window"]},"description":"One entry per deployed agent wallet in scope, including those with no spend."},"series":{"description":"Day-by-day spend over `days`, zero-filled. Returned only when `agentId` narrows the query to a single wallet: no surface plots an application-wide series.","type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date","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])))$","description":"Calendar day (YYYY-MM-DD, UTC).","example":"2026-09-18"},"spentRef":{"type":"string","description":"Spend on that day, in reference-currency sub-units (divide by 100). Days with no spend are present with \"0\".","example":"1275"}},"required":["date","spentRef"]}}},"required":["currency","wallets"]},"AgentWalletDailyRatesDto":{"type":"object","properties":{"currency":{"type":"string","description":"Reference currency of every amount (the organization's preferred currency).","example":"EUR"},"wallets":{"type":"array","items":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Agent wallet the rate belongs to.","example":"6f1d6f3a-6f2e-4a2b-9d3f-2b5a7c9e1d44"},"dailyRateRef":{"type":"string","description":"Average spend per day over the retained window, in reference-currency sub-units (divide by 100), rounded up so a runway derived from it stays pessimistic. \"0\" when the wallet spent nothing over the last 30 days.","example":"412"},"window":{"anyOf":[{"type":"number","enum":[7]},{"type":"number","enum":[30]}],"description":"Window the rate was computed over: 7 days, or 30 when the last 7 days carried no spend at all.","example":7}},"required":["walletId","dailyRateRef","window"]},"description":"One entry per deployed agent wallet in scope, including those with no spend."}},"required":["currency","wallets"],"description":"Daily spend rate of every deployed agent wallet of the organization"},"ExpenseDestinationsDto":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Distinct x402 destination hosts (seller host, no path) paid by the application's agent wallets, sorted ascending. Feeds the expenses destination filter dropdown.","example":["api.shop.example.com","data.vendor.io"]}},"required":["domains"]},"PaginatedAggregatedTransactionDto":{"type":"object","properties":{"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","description":"An on-chain USDC transfer of an agent wallet.","example":"transfer","enum":["transfer"]},"id":{"type":"string","description":"Stable row identifier for this transfer, unique within the aggregated list (derived from the transaction hash and the in-scope agent wallet).","example":"0xabc123…#0"},"date":{"type":"string","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))$","description":"When the transfer occurred (RFC 3339), from the on-chain transaction date.","example":"2026-06-01T14:32:00.000Z"},"txHash":{"type":"string","description":"Hash of the on-chain transaction carrying this transfer. Use it to look up the transaction in a block explorer for the agent network.","example":"0x5e1d3a7c8b2f4e9a0c6d1b3f8a2e4c7d9b1f3a5c7e9d0b2f4a6c8e0d2b4f6a8c"},"direction":{"type":"string","enum":["out","in"],"description":"\"out\" when the in-scope agent wallet is the sender (outgoing spend), \"in\" when it is the recipient (incoming funds).","example":"out"},"counterparty":{"type":"string","description":"Address of the other party to the transfer: the recipient when direction is \"out\", the sender when direction is \"in\".","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"resource":{"type":"string","description":"For an outgoing x402 payment, the resource it unlocked — seller host + path, no query/fragment — correlated from the matching policy intent on (payTo, amount) around the consumption time, or through its EIP-3009 nonce for a payment Keyban covered. Null when no x402 intent matches (plain transfer, incoming funds, or pre-correlation history).","example":"api.shop.example.com/premium/report","nullable":true},"service":{"type":"object","properties":{"name":{"type":"string","description":"Provider name.","example":"Fiber AI"},"via":{"type":"string","description":"Gateway that resold the provider, null when paid directly.","example":"Orthogonal","nullable":true}},"required":["name","via"],"description":"Provider behind `resource` (name, and the gateway that resold it), from the x402 catalogue. Null when unknown or for a non-x402 transfer.","nullable":true},"amountRef":{"type":"string","description":"For an outgoing x402 payment, its value in the application display currency priced at authorization time, as a decimal integer string in centi-units (e.g. \"1180\" = 11.80). Correlated from the matching policy intent. Null when no x402 intent matches (no historical fiat snapshot). This is the x402-correlation-specific value (a historical fiat snapshot at authorization, nullable) and must NOT be conflated with `walletPolicyIntentSchema.amountRef`, which is the policy budget reference amount (non-nullable).","example":"1180","nullable":true},"intentId":{"type":"string","description":"UUID of the policy intent this outgoing x402 payment was correlated to, so a transaction can be deep-linked back from the intent. Null when no x402 intent matches.","example":"550e8400-e29b-41d4-a716-446655440000","nullable":true},"decidedBy":{"type":"string","description":"Account (email) of the human who approved the correlated intent. Null when the spending rules approved it automatically, or when no intent matches (`intentId` null).","example":"jane.doe@example.com","nullable":true},"decidedAt":{"type":"string","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))$","description":"When the correlated intent was decided (RFC 3339). Also set when the spending rules approved it automatically, so it can be non-null while `decidedBy` is null. Null when no intent matches (`intentId` null).","example":"2026-06-17T14:32:00Z","nullable":true},"value":{"type":"string","description":"Raw transfer amount as a decimal string in the asset smallest unit (e.g. 6-decimals base units for USDC).","example":"12500000"},"decimals":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of decimals of the transferred asset, used to convert value to a human amount (value / 10^decimals). Null for assets without a known contract (e.g. the native coin or an unrecognised token).","example":6,"nullable":true},"tokenSymbol":{"type":"string","description":"Display symbol of the transferred asset (e.g. \"USDC\"). Null when the asset is unknown or has no symbol.","example":"USDC","nullable":true},"tokenAddress":{"type":"string","description":"Contract address of the transferred token — the ERC-20 that `tokenSymbol` refers to. Null for the native coin or an asset with no known contract.","example":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","nullable":true},"success":{"type":"boolean","description":"True when the on-chain transaction succeeded; false for a reverted or failed transfer.","example":true},"sponsored":{"type":"boolean","description":"True when Keyban paid this x402 payment from its welcome offer: the transfer leaves the Keyban sponsor wallet, not the agent wallet.","example":false},"agent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the agent wallet involved in this transfer (the in-scope side).","example":"550e8400-e29b-41d4-a716-446655440000"},"label":{"type":"string","description":"Human-readable label of the agent wallet, as set by its owner.","example":"Procurement bot"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network the agent wallet operates on.","example":"BaseSepolia"},"owner":{"type":"object","properties":{"id":{"type":"string","description":"Id of the wallet owner (responsable) — a better-auth user id.","example":"aH3kQ9xR2bN7"},"name":{"type":"string","description":"Display name of the owner.","example":"Jane Doe"},"email":{"type":"string","description":"Email of the owner.","example":"jane.doe@example.com"}},"required":["id","name","email"],"description":"Human accountable for the wallet (the \"responsable\"). Null for legacy wallets created before an owner was recorded.","nullable":true}},"required":["id","label","network","owner"]}},"required":["kind","id","date","txHash","direction","counterparty","resource","service","amountRef","intentId","decidedBy","decidedAt","value","decimals","tokenSymbol","tokenAddress","success","sponsored","agent"]},{"type":"object","properties":{"kind":{"type":"string","description":"The Keyban welcome offer of the organization: an information row, with no amount moved and left out of every spend total.","example":"sponsor-grant","enum":["sponsor-grant"]},"id":{"type":"string","description":"Stable row identifier of the offer.","example":"sponsor-grant:550e8400-e29b-41d4-a716-446655440000"},"date":{"type":"string","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))$","description":"When the offer was granted (RFC 3339).","example":"2026-10-08T09:00:00.000Z"},"sponsorGrant":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Network on which Keyban covers the payments","example":"BaseSepolia"},"amount":{"type":"string","description":"Amount offered, in USDC base units (6 decimals)","example":"1000000"},"remaining":{"type":"string","description":"Amount still covered, in USDC base units (6 decimals)","example":"620000"},"expiresAt":{"type":"string","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))$","description":"When what remains stops being covered","example":"2026-11-07T09:00:00.000Z"},"status":{"type":"string","enum":["active","exhausted","expired"],"description":"active, exhausted (fully spent) or expired","example":"active"}},"required":["network","amount","remaining","expiresAt","status"],"description":"State of the offer when the list was read."}},"required":["kind","id","date","sponsorGrant"]}]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"SignerDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"name":{"type":"string","description":"Human-readable name of the signer"},"type":{"type":"string","enum":["agentic"],"description":"Type of the signer"},"status":{"type":"string","enum":["pending","ready","active","failed","deleting"],"description":"Current status of the signer"},"apiKey":{"type":"string","description":"Plaintext API key for agentic signers (KEYBAN_API_KEY)","nullable":true},"commitmentKey":{"type":"string","description":"Plaintext invitation private key (KEYBAN_INVITE_KEY), set when the signer becomes `ready`. Retained after activation — the on-chain commitment is single-use and consumed, so the key is inert, but it keeps the MCP config re-downloadable.","nullable":true},"frostPublicKey":{"type":"string","description":"Public key of the FROST key, set once the DKG has completed (round2). Non-null means the DKG was already run for this signer and the one-shot invite key is consumed — the DKG must not run again (the admin \"Initialize signer\" action is hidden and the backend refuses a second round1 with 409).","nullable":true},"mcpConfig":{"type":"object","properties":{"mcpServers":{"type":"object","properties":{"agent-wallet":{"type":"object","properties":{"command":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"env":{"type":"object","properties":{"KEYBAN_API_KEY":{"type":"string"},"KEYBAN_APP_ID":{"type":"string"},"KEYBAN_INVITE_KEY":{"type":"string"},"KEYBAN_WALLET_ADDRESS":{"type":"string"},"KEYBAN_NETWORK":{"type":"string"},"KEYBAN_BASE_URL":{"type":"string","description":"Keyban API base URL the MCP server targets (e.g. https://api.prod.keyban.io). Selects the environment; an empty value falls back to the server default."}},"required":["KEYBAN_API_KEY","KEYBAN_APP_ID","KEYBAN_INVITE_KEY","KEYBAN_WALLET_ADDRESS","KEYBAN_NETWORK","KEYBAN_BASE_URL"]}},"required":["command","args","env"]}},"required":["agent-wallet"]}},"required":["mcpServers"],"description":"MCP host config to copy into `.mcp.json`. Non-null once the signer is provisioned (`ready` and `active`); null while `pending`.","nullable":true}},"required":["id","createdAt","updatedAt","name","type","status","mcpConfig"]},"CreateSignerDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable name of the signer"}},"required":["name"]},"UpdateSignerDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable name of the signer"}},"required":["name"]},"RegisterRequestDto":{"type":"object","properties":{"frostBytes":{"type":"string","pattern":"^0x[0-9a-fA-F]{168}$","description":"ERC-7913 signer bytes for the FROST signer (84 bytes): frostVerifier || abi.encode(pkX, pkY)"},"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130}$","description":"ECDSA signature (65 bytes, r || s || v) over keccak256(abi.encode(chainId, walletAddress, frostBytes)), signed with KEYBAN_INVITE_KEY"}},"required":["frostBytes","signature"]},"FeatureLabelsResponseDto":{"type":"object","properties":{"locale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT"],"description":"Locale the labels were resolved in: the `locale` query parameter when present, otherwise the request cascade.","example":"fr-FR"},"features":{"type":"object","additionalProperties":{"type":"object","properties":{"label":{"type":"string","description":"Display label of the feature in the resolved locale.","example":"Active products"},"type":{"type":"string","enum":["quantity","switch","custom"],"description":"Shape of the value carried by `GET /v1/billing/plans` for this feature: `quantity` is a number to format, `switch` is `true`/`false`, `custom` is one of the codes in `values`.","example":"quantity"},"unit":{"description":"Unit of a `quantity` value, absent when it is a plain count: `cent` means an amount in the minor unit of EUR, an ISO 4217 code means an amount in that currency.","example":"cent","type":"string"},"values":{"description":"Display label per value code, present on `custom` features only. Scoped per feature because a shared code can mean different things (`none` is \"No access\" for API access, \"No overage\" for budget overage).","example":{"none":"No access"},"type":"object","additionalProperties":{"type":"string"}}},"required":["label","type"]},"description":"One entry per Chargebee feature id, in the display order of the pricing comparison table. Covers the whole catalogue, including features no plan carries an entitlement for.","example":{"trust-active-products":{"label":"Active products","type":"quantity"}}},"common":{"type":"object","properties":{"included":{"type":"string"},"notIncluded":{"type":"string"},"tailorMade":{"type":"string"}},"required":["included","notIncluded","tailorMade"],"description":"Wording a surface needs on top of the catalogue: `included` and `notIncluded` render a `switch`, and a feature the plan carries no entitlement for reads `tailorMade` on a `contactSales` plan and `notIncluded` on a self-serve one.","example":{"included":"Included","notIncluded":"—","tailorMade":"Tailor-made"}}},"required":["locale","features","common"]},"ListPlansResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"pro","description":"Chargebee item identifier for the plan (e.g. `starter`, `pro`, `corporate`). Stable key used to reconcile a subscription with its plan definition."},"name":{"type":"string","example":"Pro","description":"Commercial plan name shown on the pricing page and in the admin UI (e.g. \"Starter\", \"Pro\")."},"description":{"type":"string","example":"Advanced features for growing teams, including unlimited applications and priority support.","description":"Marketing description of the plan, rendered on the pricing page. May contain plain text; no HTML is expected."},"features":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"dpp-monthly","description":"Feature identifier as declared in Chargebee (e.g. `dpp-monthly`, `active-users-monthly`). Referenced by the backend to map feature entitlements to technical quotas."},"name":{"type":"string","example":"DPP support","description":"Internal Chargebee label, kept for traceability — NOT for display. Surfaces render `GET /v1/billing/feature-labels`, which serves the wording in the requested language and also covers features no plan carries an entitlement for. Scheduled for removal."},"value":{"example":"1000","description":"Quantitative allowance exposed by Chargebee for this feature (e.g. `\"1000\"`, `\"unlimited\"`). Absent when the feature is purely qualitative (on/off).","type":"string"}},"required":["id","name"]},"description":"Entitlements attached to the plan, sourced from Chargebee feature metadata. Order follows Chargebee configuration and is preserved for display."},"prices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"pro-EUR-Monthly","description":"Chargebee price point identifier (e.g. `pro-EUR-Monthly`). Stable across environments, used as the reference when creating a subscription."},"price":{"type":"number","example":4900,"description":"Recurring amount billed per period, expressed in the smallest unit of the currency (e.g. cents for EUR/USD). `0` is valid for free tiers."},"currency":{"type":"string","example":"EUR","description":"ISO 4217 currency code in upper case (e.g. `EUR`, `USD`). Must match the currency configured on the Chargebee price point."},"period":{"type":"string","example":"month","description":"Billing cadence for this price point, as configured in Chargebee (typically `month` or `year`). Used by the UI to group prices per plan."},"trialDays":{"type":"number","example":14,"description":"Length of the free trial granted when the subscription is created, in days. `0` means no trial."},"freeMonths":{"default":0,"example":3,"description":"Number of initial months billed at zero by the catalogue discount, on top of any trial. `0` for a price point carrying no discount. A plan whose `price` is non-zero but whose `freeMonths` is not must be presented as free for that many months, then at `price` — never at `price` alone.","type":"number"}},"required":["id","price","currency","period","trialDays"]},"description":"Available price points for the plan (one per currency × period combination). The UI lets the customer pick one before subscribing."},"contactSales":{"type":"boolean","description":"When `true`, the plan is gated behind a sales contact flow instead of self-serve checkout (typically used for the Corporate plan)."},"applicationFeatures":{"default":[],"description":"Product surfaces this plan unlocks (e.g. `dpp`, `agent-wallet`). Sourced from the backend plan catalog (PLAN_CONFIGS), not from Chargebee. Used by the pricing page to group plans per product.","type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]}}},"required":["id","name","description","features","prices","contactSales"]}},"total":{"type":"number"}},"required":["data","total"]},"ChangePlanRequestDto":{"type":"object","properties":{"planId":{"type":"string","pattern":"^[\\w-]+$"},"billingPeriod":{"type":"string","enum":["month","year"]},"desiredDate":{"type":"string"},"reason":{"type":"string","minLength":1,"maxLength":2000}},"required":["planId","billingPeriod","reason"]},"PortalSessionResponseDto":{"type":"object","properties":{"accessUrl":{"type":"string","format":"uri","description":"Single-use Chargebee-hosted URL for the self-service billing portal. Redirect the user to it so they can manage their subscription, invoices and payment methods; it expires after first use.","example":"https://mysite.chargebeeportal.com/portal/v2/access/cb-xyz123/portal_sessions"}},"required":["accessUrl"]},"UpgradeCheckoutRequestDto":{"type":"object","properties":{"itemPriceId":{"type":"string","minLength":1,"description":"Chargebee item-price ID of the target plan. Must be a strict upgrade of the organization's current plan, within the same vertical (Dpp / AgentWallet / Trust).","example":"agent-wallet-growth-plan-v2-eur-monthly"},"customer":{"description":"Billing identity of the organization. Required for the first paid plan of an organization that signed up to the free Agent Wallet trial (422 BILLING_UPGRADE_IDENTITY_REQUIRED when missing); ignored otherwise.","example":{"type":"company","legalName":"Acme Automations SAS","siren":"552032534","vatNumber":"FR32552032534","firstName":"Jane","lastName":"Doe","phone":"+33612345678","billingEmail":"billing@acme.example","address":{"line1":"10 Rue de Rivoli","city":"Paris","zip":"75004","country":"FR"}},"type":"object","properties":{"type":{"type":"string","description":"Billing identity of the organization owner. Only `company` is accepted today; it drives the required identifiers (SIREN/VAT) and the Chargebee `cf_customer_type` custom field.","example":"company","enum":["company"]},"legalName":{"description":"Registered legal name of the company. Required when `type` is `company`, ignored for an `individual`.","example":"Acme Automations SAS","type":"string","minLength":1,"maxLength":200},"siren":{"description":"9-digit French company identifier. Required for a French company, refused for an individual.","example":"552032534","type":"string","pattern":"^\\d{9}$"},"vatNumber":{"description":"EU VAT number. Required for a non-French company; when the billing country is France it must match the FRxx999999999 format.","example":"FR32552032534","type":"string","maxLength":20},"firstName":{"type":"string","minLength":1,"maxLength":100,"description":"Given name of the person completing onboarding.","example":"Jane"},"lastName":{"type":"string","minLength":1,"maxLength":100,"description":"Family name of the person completing onboarding.","example":"Doe"},"phone":{"type":"string","pattern":"^\\+[1-9]\\d{6,14}$","description":"Contact phone number in E.164 notation.","example":"+33612345678"},"billingEmail":{"description":"Invoice delivery address, when different from the account e-mail used to sign in.","example":"billing@acme.example","type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"address":{"type":"object","properties":{"line1":{"type":"string","minLength":1,"maxLength":100,"example":"12 Rue de la Paix","description":"First line of the postal address (street and number). Required, 1–100 characters."},"line2":{"example":"Bâtiment B, 3ᵉ étage","description":"Optional second line of the postal address (apartment, suite, building). Up to 100 characters.","type":"string","maxLength":100},"city":{"type":"string","minLength":1,"maxLength":100,"example":"Paris","description":"City or locality of the billing address. Required."},"state":{"example":"Île-de-France","description":"State, region, or province. Free-form text to accommodate heterogeneous tax jurisdictions; prefer ISO 3166-2 subdivision codes when known.","type":"string","maxLength":100},"zip":{"type":"string","minLength":1,"maxLength":20,"example":"75002","description":"Postal / ZIP code. Required. Kept as a string to preserve leading zeros and non-numeric formats (UK, Canada, …)."},"country":{"type":"string","enum":["FR","BE","DE","ES","IT"],"description":"ISO 3166-1 alpha-2 country code of the billing address, limited to the countries onboarding v3 supports at launch.","example":"FR"}},"required":["line1","city","zip","country"]}},"required":["type","firstName","lastName","phone","address"]}},"required":["itemPriceId"]},"UpgradeCheckoutResponseDto":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Chargebee-hosted page URL that changes the organization's existing subscription to the requested item price. Redirect the user to it.","example":"https://mysite.chargebee.com/pages/v3/abc123/checkout"},"hostedPageId":{"type":"string","minLength":1,"description":"Chargebee hosted page ID to submit to POST /billing/upgrade/complete once the checkout redirects back.","example":"hp_AzYy7hSFSDadZ4Rd"}},"required":["url","hostedPageId"]},"UpgradeCompleteRequestDto":{"type":"object","properties":{"hostedPageId":{"type":"string","minLength":1,"description":"Chargebee hosted page ID the upgrade checkout redirected back with, used to reconcile the completed plan change.","example":"hp_AzYy7hSFSDadZ4Rd"}},"required":["hostedPageId"]},"UpgradeCompleteResponseDto":{"type":"object","properties":{"planId":{"type":"string","minLength":1,"description":"Chargebee item ID of the plan now active on the subscription (e.g. \"agent-wallet-growth-plan-v2\").","example":"agent-wallet-growth-plan-v2"},"itemPriceId":{"type":"string","minLength":1,"description":"Chargebee item-price ID now active on the subscription (e.g. \"agent-wallet-growth-plan-v2-eur-monthly\").","example":"agent-wallet-growth-plan-v2-eur-monthly"}},"required":["planId","itemPriceId"]},"PaginatedMultisigWalletDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"label":{"type":"string","description":"Human-readable label for the wallet"},"address":{"type":"string","description":"On-chain address of the wallet. Empty until its signers hold keys and the deployment lands.","example":"0x36bc36646e0f00e567a126e116f0d1a0dc21c810"},"status":{"type":"string","enum":["awaiting_signer","deploying","active","failed"],"description":"Current deployment status of the wallet.","example":"active"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"],"description":"EVM network of the wallet.","example":"BaseSepolia"},"threshold":{"type":"integer","exclusiveMinimum":true,"maximum":255,"description":"Signatures required to authorize a transfer (M of N), as recorded at deployment. Not re-read from chain: an out-of-band operator change is not reflected here.","example":2,"minimum":0},"mayEnroll":{"type":"boolean","description":"**Relative to whoever reads this response — not a property of the treasury.** The same treasury serves `true` to one admin and `false` to another, and the value changes for a given reader over time. True when the session user holds a live (unconsumed) invitation on this treasury and has no live signer enrolment on it, i.e. exactly when `POST /multisig-wallets/{id}/signers` would get past the invitation guard. Enrolment is reserved to invitees, so a client should only offer the ceremony when this is true. Always `false` for an API key: there is no session user to be invited, and an API key can never enrol.","example":true},"awaitingMySignature":{"type":"boolean","description":"**Relative to whoever reads this response — not a property of the treasury.** Two signers of the same treasury legitimately read different values, and the value flips for a given reader as transfers come and go. True when the session user is an `active` signer here — a key already in the on-chain signer set, the only one the account accepts a signature from — **and** a transfer of this treasury is still `pending` without their own signature on it: exactly the state where `POST /multisig-wallets/{id}/intents/{intentId}/approvals` is waiting for them. It goes back to `false` the moment they sign, even while the lot keeps collecting the remaining signatures. A signer app can badge the treasuries that need its owner without opening each transfer list. Always `false` for an API key: there is no session user to owe a signature, and a key can never sign.","example":true}},"required":["id","createdAt","updatedAt","label","address","status","network","threshold","mayEnroll","awaitingMySignature"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"MultisigHoldingsHistoryDto":{"type":"object","properties":{"snapshots":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string","format":"date","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])))$","description":"UTC day the balances were captured (YYYY-MM-DD).","example":"2026-09-03"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"],"description":"EVM network the balances live on.","example":"BaseSepolia"},"treasuryUsdc":{"type":"string","pattern":"^[0-9]{1,30}$","description":"USDC held by the organization treasury on that network, base units (6 decimals). `0` when no treasury is deployed there.","example":"2500000000"},"agentsUsdc":{"type":"string","pattern":"^[0-9]{1,30}$","description":"Sum of the USDC held by the organization agent wallets on that network, base units (6 decimals).","example":"812500000"},"centiPerUsdc":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Centi-units of `currency` per 1 USDC at capture time; null when the rate oracle gave no quote.","example":92,"nullable":true},"currency":{"type":"string","enum":["EUR","USD","JPY"],"description":"Currency the rate was captured in.","example":"EUR"}},"required":["day","network","treasuryUsdc","agentsUsdc","centiPerUsdc","currency"]},"description":"Ordered by day then network, one row per day × network."}},"required":["snapshots"]},"TreasuryMovementsDto":{"type":"object","properties":{"movements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"direction":{"type":"string","enum":["out"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Treasury transfer (intent) id","example":"7d9c2f0a-3b84-4a47-8d0e-1f6a5b2c9e31"},"walletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Treasury the movement belongs to","example":"0b6f1c3e-5a1d-4d0e-9a52-6c1f2c7b9a10"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"],"description":"Network of the treasury"},"amount":{"type":"string","description":"USDC sub-units (6 decimals)","example":"100000000"},"date":{"type":"string","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))$","description":"Creation date (out) or block date (in)","example":"2026-09-21T10:00:00.000Z"},"status":{"type":"string","enum":["pending","broadcasting","unknown","executed","failed","cancelled","expired"],"description":"Transfer status"},"txHash":{"type":"string","description":"Execution transaction, once broadcast","example":"0x9f2c5d7a1b3e4c6d8f0a2b4c6d8e0f1a3b5c7d9e1f2a4b6c8d0e2f4a6b8c0d2e","nullable":true},"destinations":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"Name of the destination, when known","example":"Prospection","nullable":true},"address":{"type":"string","description":"Destination address","example":"0x1111111111111111111111111111111111111111"},"kind":{"type":"string","enum":["agent","contact","unknown"],"description":"Kind of destination","example":"agent"}},"required":["label","address","kind"]},"description":"One entry per leg"},"approvers":{"type":"array","items":{"type":"string"},"description":"Names of the signers who approved, in order"}},"required":["direction","id","walletId","network","amount","date","status","txHash","destinations","approvers"]},{"type":"object","properties":{"direction":{"type":"string","enum":["in"]},"id":{"type":"string","description":"Indexer transfer id","example":"0x9f2c5d7a1b3e-12"},"walletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Treasury the movement belongs to","example":"0b6f1c3e-5a1d-4d0e-9a52-6c1f2c7b9a10"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"],"description":"Network of the treasury"},"amount":{"type":"string","description":"USDC sub-units (6 decimals)","example":"100000000"},"date":{"type":"string","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))$","description":"Creation date (out) or block date (in)","example":"2026-09-21T10:00:00.000Z"},"txHash":{"type":"string","description":"Transaction that delivered the funds","example":"0x9f2c5d7a1b3e4c6d8f0a2b4c6d8e0f1a3b5c7d9e1f2a4b6c8d0e2f4a6b8c0d2e"},"source":{"type":"string","enum":["card","agent","external"],"description":"card = onramp delivery, agent = one of the organization agent wallets, external = anything else"},"fromAddress":{"type":"string","description":"Sender address","example":"0x2222222222222222222222222222222222222222"},"fromLabel":{"type":"string","description":"Agent wallet label when source is agent","example":"Prospection","nullable":true}},"required":["direction","id","walletId","network","amount","date","txHash","source","fromAddress","fromLabel"]}]}},"truncated":{"type":"boolean","description":"True when at least one source hit its cap, so older movements of the window are missing"},"failedNetworks":{"type":"array","items":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"]},"description":"Networks whose indexer could not be read: their incoming movements are missing"}},"required":["movements","truncated","failedNetworks"]},"MultisigWalletDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"label":{"type":"string","description":"Human-readable label for the wallet"},"address":{"type":"string","description":"On-chain address of the wallet. Empty until its signers hold keys and the deployment lands.","example":"0x36bc36646e0f00e567a126e116f0d1a0dc21c810"},"status":{"type":"string","enum":["awaiting_signer","deploying","active","failed"],"description":"Current deployment status of the wallet.","example":"active"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"],"description":"EVM network of the wallet.","example":"BaseSepolia"},"threshold":{"type":"integer","exclusiveMinimum":true,"maximum":255,"description":"Signatures required to authorize a transfer (M of N), as recorded at deployment. Not re-read from chain: an out-of-band operator change is not reflected here.","example":2,"minimum":0},"mayEnroll":{"type":"boolean","description":"**Relative to whoever reads this response — not a property of the treasury.** The same treasury serves `true` to one admin and `false` to another, and the value changes for a given reader over time. True when the session user holds a live (unconsumed) invitation on this treasury and has no live signer enrolment on it, i.e. exactly when `POST /multisig-wallets/{id}/signers` would get past the invitation guard. Enrolment is reserved to invitees, so a client should only offer the ceremony when this is true. Always `false` for an API key: there is no session user to be invited, and an API key can never enrol.","example":true},"awaitingMySignature":{"type":"boolean","description":"**Relative to whoever reads this response — not a property of the treasury.** Two signers of the same treasury legitimately read different values, and the value flips for a given reader as transfers come and go. True when the session user is an `active` signer here — a key already in the on-chain signer set, the only one the account accepts a signature from — **and** a transfer of this treasury is still `pending` without their own signature on it: exactly the state where `POST /multisig-wallets/{id}/intents/{intentId}/approvals` is waiting for them. It goes back to `false` the moment they sign, even while the lot keeps collecting the remaining signatures. A signer app can badge the treasuries that need its owner without opening each transfer list. Always `false` for an API key: there is no session user to owe a signature, and a key can never sign.","example":true}},"required":["id","createdAt","updatedAt","label","address","status","network","threshold","mayEnroll","awaitingMySignature"],"additionalProperties":false},"CreateMultisigWalletDto":{"type":"object","properties":{"label":{"type":"string","minLength":1,"description":"Admin-chosen display name shown in the treasury UI (not unique, never used for lookups)","example":"Main treasury"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet"],"description":"EVM network the wallet lives on. One multisig wallet per organization × network.","example":"BaseSepolia"},"threshold":{"type":"integer","minimum":1,"maximum":10,"description":"Signatures required to move funds (M of N). The account deploys once M signers are validated, and the value is fixed at initialization. Capped at 10 to keep the enrollment ceremony workable.","example":2},"invitedEmails":{"description":"Organization members invited to enrol a signing key on the freshly created treasury, one email per person. Each must already be an `admin` or `owner` of the organization — enrolment is the invitee’s own authenticated call, so an outsider could never complete it. Duplicates are ignored. Inviting is best-effort: a mail failure never undoes the treasury.","example":["jeanne.martin@example.com","karim.benali@example.com"],"maxItems":10,"type":"array","items":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}},"required":["label","network","threshold"]},"PaginatedMultisigSignerDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"status":{"type":"string","enum":["requested","validated","active","failed"],"description":"Enrollment status: `requested` (address bound, awaiting a peer validation), `validated` (counts towards the threshold), `active` (in the on-chain signer set, can sign), `failed` (on-chain add exhausted its retries).","example":"active"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User ID of the signer.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","description":"Display name of the signer, as set on their user profile.","example":"Jeanne Martin"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address of the signer.","example":"jeanne.martin@example.com"},"image":{"type":"string","description":"Avatar URL of the signer (from their sign-in provider); null without one.","example":"https://example.com/avatar.png","nullable":true}},"required":["id","name","email","image"],"additionalProperties":false,"description":"Organization member holding the TSS signing key. Null only when the user reference could not be populated.","nullable":true},"signerType":{"type":"string","enum":["eoa","webauthn"],"description":"Kind of key behind this signer: `eoa` (20-byte secp256k1 address) or `webauthn` (84-byte P-256 passkey signer). Derived from the identity, never stored.","example":"eoa"},"address":{"type":"string","description":"ERC-7913 identity of the signing key: a 20-byte EVM address for an `eoa` signer, the 84-byte `verifier ‖ qx ‖ qy` bytes for a `webauthn` one. **Withheld while `requested`**: the SAS a validator must type derives from it, so serving it here would let any client compute the code instead of reading it off the candidate's phone — the whole point of the comparison. Revealed once validated.","example":"0x36bc36646e0f00e567a126e116f0d1a0dc21c810","nullable":true},"validatorNonce":{"type":"string","description":"The challenge nonce, once a validator has challenged this enrollment. The candidate app reads it to derive the 4-digit SAS it displays; null before a challenge and after the ceremony settles.","example":"0x2222222222222222222222222222222222222222222222222222222222222222","nullable":true},"validatedAt":{"type":"string","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))$","description":"When a peer validated this enrollment. Null while requested.","nullable":true}},"required":["id","createdAt","updatedAt","status","user","signerType","validatedAt"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"EnrollMultisigSignerDto":{"type":"object","properties":{"address":{"description":"EVM address of a secp256k1 signing key held by the signer app — the ERC-7913 signer as-is (20 bytes). Exactly one of `address` and `publicKey` must be provided.","example":"0x36bc36646e0f00e567a126e116f0d1a0dc21c810","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"publicKey":{"description":"DER SubjectPublicKeyInfo (91 bytes) of a P-256 **passkey**, as returned by `getPublicKey()` at registration (require `getPublicKeyAlgorithm() === -7`). The server extracts the curve point, validates it, and composes the 84-byte ERC-7913 signer with the network's WebAuthn verifier — the signer bytes are never taken from the wire. Exactly one of `address` and `publicKey` must be provided.","example":"0x3059301306072a8648ce3d020106082a8648ce3d03010703420004abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab","type":"string","pattern":"^0x[0-9a-fA-F]{182}$"},"commitment":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"SAS engagement: `HMAC(nonceC ‖ signerBytes)`, 32 bytes. Binds the candidate's secret nonce before the validator's nonce is known, so the short code cannot be ground to a chosen value. The nonce itself is revealed later, never at enrollment. For a passkey, the app must commit over the composed 84-byte signer bytes.","example":"0xabababababababababababababababababababababababababababababababab"}},"required":["commitment"]},"MultisigSignerDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"status":{"type":"string","enum":["requested","validated","active","failed"],"description":"Enrollment status: `requested` (address bound, awaiting a peer validation), `validated` (counts towards the threshold), `active` (in the on-chain signer set, can sign), `failed` (on-chain add exhausted its retries).","example":"active"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User ID of the signer.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","description":"Display name of the signer, as set on their user profile.","example":"Jeanne Martin"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address of the signer.","example":"jeanne.martin@example.com"},"image":{"type":"string","description":"Avatar URL of the signer (from their sign-in provider); null without one.","example":"https://example.com/avatar.png","nullable":true}},"required":["id","name","email","image"],"additionalProperties":false,"description":"Organization member holding the TSS signing key. Null only when the user reference could not be populated.","nullable":true},"signerType":{"type":"string","enum":["eoa","webauthn"],"description":"Kind of key behind this signer: `eoa` (20-byte secp256k1 address) or `webauthn` (84-byte P-256 passkey signer). Derived from the identity, never stored.","example":"eoa"},"address":{"type":"string","description":"ERC-7913 identity of the signing key: a 20-byte EVM address for an `eoa` signer, the 84-byte `verifier ‖ qx ‖ qy` bytes for a `webauthn` one. **Withheld while `requested`**: the SAS a validator must type derives from it, so serving it here would let any client compute the code instead of reading it off the candidate's phone — the whole point of the comparison. Revealed once validated.","example":"0x36bc36646e0f00e567a126e116f0d1a0dc21c810","nullable":true},"validatorNonce":{"type":"string","description":"The challenge nonce, once a validator has challenged this enrollment. The candidate app reads it to derive the 4-digit SAS it displays; null before a challenge and after the ceremony settles.","example":"0x2222222222222222222222222222222222222222222222222222222222222222","nullable":true},"validatedAt":{"type":"string","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))$","description":"When a peer validated this enrollment. Null while requested.","nullable":true}},"required":["id","createdAt","updatedAt","status","user","signerType","validatedAt"],"additionalProperties":false},"ChallengeMultisigSignerDto_Output":{"type":"object","properties":{"validatorNonce":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"Fresh 32-byte nonce the challenge fixes. The candidate app combines it with its own nonce and signer bytes to display the 4-digit code.","example":"0x2222222222222222222222222222222222222222222222222222222222222222"}},"required":["validatorNonce"],"additionalProperties":false},"RevealMultisigSignerDto":{"type":"object","properties":{"nonceC":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"The 32-byte nonce whose HMAC the candidate published as the enrollment commitment. Accepted only after a challenge and only if it reproduces that commitment.","example":"0x1111111111111111111111111111111111111111111111111111111111111111"}},"required":["nonceC"]},"ValidateMultisigSignerDto":{"type":"object","properties":{"code":{"type":"string","pattern":"^\\d{4}$","description":"Four-digit SAS read off the candidate phone and compared out of band. A wrong code **burns** the enrollment (status `failed`): the short code buys a single online guess, not an offline search.","example":"6040"}},"required":["code"]},"CreateMultisigIntentDto":{"type":"object","properties":{"transfers":{"minItems":1,"maxItems":20,"type":"array","items":{"anyOf":[{"type":"object","properties":{"agentWalletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Agent wallet of the same organization and network to credit. Snapshotted on the intent, so renaming or deleting it later cannot change where the signed transfer goes.","example":"550e8400-e29b-41d4-a716-446655440000"},"amount":{"type":"string","pattern":"^[1-9][0-9]{0,29}$","description":"Amount in USDC sub-units (6 decimals), as a positive integer string. \"1500000\" is 1.50 USDC.","example":"1500000"}},"required":["agentWalletId","amount"]},{"type":"object","properties":{"contactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Contact of THIS treasury to pay. Naming a contact is the only way to reach an address outside the fleet: the API never accepts a raw address, so a destination is always one a signer vouched for first.","example":"550e8400-e29b-41d4-a716-446655440000"},"amount":{"type":"string","pattern":"^[1-9][0-9]{0,29}$","description":"Amount in USDC sub-units (6 decimals), as a positive integer string. \"1500000\" is 1.50 USDC.","example":"1500000"}},"required":["contactId","amount"]}]},"description":"Legs of the transfer lot, in the exact order the signers will see. Each leg names EITHER an agent wallet of the fleet OR a contact of this treasury. The lot is ONE signing subject — a single signature per signer covers all of it — and executes atomically: every leg lands or none does. 1 to 20 legs."}},"required":["transfers"]},"MultisigIntentDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"status":{"type":"string","enum":["pending","broadcasting","unknown","executed","failed","cancelled","expired"],"description":"Lifecycle: `pending` (collecting signatures), `broadcasting` (threshold reached, relay in progress), `executed` (mined, `txHash` set), `failed` (reverted or never broadcast), `unknown` (outcome undetermined — the transfer may have landed, and no new intent is accepted until it is reconciled), `cancelled`, `expired`.","example":"pending"},"transfers":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","properties":{"agentWalletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Agent wallet this leg credits, as resolved at creation. Null when the leg targets a contact of the treasury instead, and on rows migrated from the single-transfer era whose agent wallet had already been deleted.","example":"550e8400-e29b-41d4-a716-446655440000","nullable":true},"targetAddress":{"type":"string","description":"On-chain address of that agent wallet, snapshotted so the destination stays what the signers saw even if the wallet row is later renamed or deleted.","example":"0xcb0c0dca4246bb0f6b3309d64e7e35002cc3af1f"},"amount":{"type":"string","pattern":"^[1-9][0-9]{0,29}$","description":"Amount in USDC sub-units (6 decimals), as a positive integer string. \"1500000\" is 1.50 USDC.","example":"1500000"},"destinationLabel":{"type":"string","description":"Display name of this destination, resolved from the frozen `targetAddress` **at read time and never stored on the intent** — an agent wallet of the organization, else a contact of this treasury (archived ones included, so the history keeps its names). Null when the address resolves to neither. It is the frozen address above, not this label, that a signer verifies against.","example":"Prestataire Acme","nullable":true},"destinationKind":{"type":"string","enum":["agent","contact","unknown"],"description":"What the frozen address turned out to be: `agent` (a wallet of your own fleet — the leg is internal), `contact` (a named third party), `unknown` (neither, e.g. a wallet deleted since). Resolved from the address, so it stays true whatever path created the leg.","example":"contact"},"destinationFirstUse":{"type":"boolean","description":"True when no transfer to this contact has ever EXECUTED — the signal the signer app puts in front of the signers, since a brand-new destination is where a compromised-channel address lands. **Null on an `agent` or `unknown` destination**: a refill toward one’s own fleet needs no such warning.","nullable":true}},"required":["agentWalletId","targetAddress","amount","destinationLabel","destinationKind","destinationFirstUse"],"additionalProperties":false},"description":"Legs of the lot, in the exact order they were signed — the order is part of the signed preimage. The signer app displays the full list and re-derives every calldata from it."},"totalAmount":{"type":"string","pattern":"^[1-9][0-9]{0,29}$","description":"Sum of the leg amounts in USDC sub-units, as a decimal string. Derived, never stored.","example":"4000000"},"fiat":{"type":"object","properties":{"currency":{"type":"string","enum":["EUR","USD","JPY"],"description":"Display currency of the organization at read time.","example":"EUR"},"centiPerUsdc":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Centi-units of `currency` per 1 USDC when the lot was served. A leg converts as floor(amount × centiPerUsdc / 1e6) centi-units.","example":92,"minimum":0}},"required":["currency","centiPerUsdc"],"additionalProperties":false,"description":"Indicative rate for display only, resolved **at read time and never stored on the intent**: it is outside the signed preimage and must never enter its computation. Null when the organization has no display currency or the rate oracle is unavailable — the lot is still fully served and signable.","nullable":true},"relayNonce":{"type":"string","description":"Account relay nonce the signatures are bound to, as a decimal string. One nonce covers the whole lot. If the account moves past it, the intent fails without broadcasting.","example":"3"},"relayHash":{"type":"string","description":"What each signer signs. Single-leg lot: `keccak256(abi.encode(chainId, account, nonce, dest, value, keccak256(data)))`. Two legs or more: `keccak256(abi.encode(chainId, account, nonce, keccak256(abi.encode(calls))))` over the ordered `(dest, value, data)` legs. The app must recompute it locally from the other fields and refuse to sign on a mismatch.","example":"0x4d2f8c1e9b7a3d5f0c2e8a6b4d1f9c3e7a5b8d2f4c6e9a1b3d5f7c9e2a4b6d8f"},"approvalCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Signatures collected so far, out of the wallet threshold.","example":1},"expiresAt":{"type":"string","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))$","description":"End of the signing window. Past it the intent expires on its next touch and the collected signatures are purged."},"txHash":{"type":"string","description":"Hash of the relayed transaction. Null until executed — and can stay null on an intent reconciled as `executed` after an ambiguous broadcast, where only the consumed account nonce proves execution.","example":"0x4d2f8c1e9b7a3d5f0c2e8a6b4d1f9c3e7a5b8d2f4c6e9a1b3d5f7c9e2a4b6d8f","nullable":true},"error":{"type":"string","description":"Why the transfer failed, or what made its outcome undetermined. Null while pending or once executed.","nullable":true}},"required":["id","createdAt","updatedAt","status","transfers","totalAmount","fiat","relayNonce","relayHash","approvalCount","expiresAt"],"additionalProperties":false},"PaginatedMultisigIntentDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"status":{"type":"string","enum":["pending","broadcasting","unknown","executed","failed","cancelled","expired"],"description":"Lifecycle: `pending` (collecting signatures), `broadcasting` (threshold reached, relay in progress), `executed` (mined, `txHash` set), `failed` (reverted or never broadcast), `unknown` (outcome undetermined — the transfer may have landed, and no new intent is accepted until it is reconciled), `cancelled`, `expired`.","example":"pending"},"transfers":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"agentWalletId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Agent wallet this leg credits, as resolved at creation. Null when the leg targets a contact of the treasury instead, and on rows migrated from the single-transfer era whose agent wallet had already been deleted.","example":"550e8400-e29b-41d4-a716-446655440000","nullable":true},"targetAddress":{"type":"string","description":"On-chain address of that agent wallet, snapshotted so the destination stays what the signers saw even if the wallet row is later renamed or deleted.","example":"0xcb0c0dca4246bb0f6b3309d64e7e35002cc3af1f"},"amount":{"type":"string","pattern":"^[1-9][0-9]{0,29}$","description":"Amount in USDC sub-units (6 decimals), as a positive integer string. \"1500000\" is 1.50 USDC.","example":"1500000"},"destinationLabel":{"type":"string","description":"Display name of this destination, resolved from the frozen `targetAddress` **at read time and never stored on the intent** — an agent wallet of the organization, else a contact of this treasury (archived ones included, so the history keeps its names). Null when the address resolves to neither. It is the frozen address above, not this label, that a signer verifies against.","example":"Prestataire Acme","nullable":true},"destinationKind":{"type":"string","enum":["agent","contact","unknown"],"description":"What the frozen address turned out to be: `agent` (a wallet of your own fleet — the leg is internal), `contact` (a named third party), `unknown` (neither, e.g. a wallet deleted since). Resolved from the address, so it stays true whatever path created the leg.","example":"contact"},"destinationFirstUse":{"type":"boolean","description":"True when no transfer to this contact has ever EXECUTED — the signal the signer app puts in front of the signers, since a brand-new destination is where a compromised-channel address lands. **Null on an `agent` or `unknown` destination**: a refill toward one’s own fleet needs no such warning.","nullable":true}},"required":["agentWalletId","targetAddress","amount","destinationLabel","destinationKind","destinationFirstUse"],"additionalProperties":false},"description":"Legs of the lot, in the exact order they were signed — the order is part of the signed preimage. The signer app displays the full list and re-derives every calldata from it."},"totalAmount":{"type":"string","pattern":"^[1-9][0-9]{0,29}$","description":"Sum of the leg amounts in USDC sub-units, as a decimal string. Derived, never stored.","example":"4000000"},"fiat":{"type":"object","properties":{"currency":{"type":"string","enum":["EUR","USD","JPY"],"description":"Display currency of the organization at read time.","example":"EUR"},"centiPerUsdc":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Centi-units of `currency` per 1 USDC when the lot was served. A leg converts as floor(amount × centiPerUsdc / 1e6) centi-units.","example":92,"minimum":0}},"required":["currency","centiPerUsdc"],"additionalProperties":false,"description":"Indicative rate for display only, resolved **at read time and never stored on the intent**: it is outside the signed preimage and must never enter its computation. Null when the organization has no display currency or the rate oracle is unavailable — the lot is still fully served and signable.","nullable":true},"relayNonce":{"type":"string","description":"Account relay nonce the signatures are bound to, as a decimal string. One nonce covers the whole lot. If the account moves past it, the intent fails without broadcasting.","example":"3"},"relayHash":{"type":"string","description":"What each signer signs. Single-leg lot: `keccak256(abi.encode(chainId, account, nonce, dest, value, keccak256(data)))`. Two legs or more: `keccak256(abi.encode(chainId, account, nonce, keccak256(abi.encode(calls))))` over the ordered `(dest, value, data)` legs. The app must recompute it locally from the other fields and refuse to sign on a mismatch.","example":"0x4d2f8c1e9b7a3d5f0c2e8a6b4d1f9c3e7a5b8d2f4c6e9a1b3d5f7c9e2a4b6d8f"},"approvalCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Signatures collected so far, out of the wallet threshold.","example":1},"expiresAt":{"type":"string","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))$","description":"End of the signing window. Past it the intent expires on its next touch and the collected signatures are purged."},"txHash":{"type":"string","description":"Hash of the relayed transaction. Null until executed — and can stay null on an intent reconciled as `executed` after an ambiguous broadcast, where only the consumed account nonce proves execution.","example":"0x4d2f8c1e9b7a3d5f0c2e8a6b4d1f9c3e7a5b8d2f4c6e9a1b3d5f7c9e2a4b6d8f","nullable":true},"error":{"type":"string","description":"Why the transfer failed, or what made its outcome undetermined. Null while pending or once executed.","nullable":true}},"required":["id","createdAt","updatedAt","status","transfers","totalAmount","fiat","relayNonce","relayHash","approvalCount","expiresAt"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"ApproveMultisigIntentDto":{"type":"object","properties":{"signature":{"type":"string","pattern":"^0x(?:[0-9a-fA-F]{2}){65,2048}$","description":"Signature over `relayHash`, in the form the enrolled key produces. For an `eoa` signer: secp256k1 `r‖s‖v`, exactly 65 bytes, over the **raw** hash — not an EIP-191 personal_sign digest. For a `webauthn` signer: the abi-encoded assertion `(r, s, challengeIndex, typeIndex, authenticatorData, clientDataJSON)` whose clientDataJSON challenge is `base64url(relayHash)`, low-s normalized, UV flag set. Capped at 2048 bytes.","example":"0x111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222221b"}},"required":["signature"]},"PaginatedMultisigSignerInvitationDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User ID of the signer.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","description":"Display name of the signer, as set on their user profile.","example":"Jeanne Martin"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address of the signer.","example":"jeanne.martin@example.com"},"image":{"type":"string","description":"Avatar URL of the signer (from their sign-in provider); null without one.","example":"https://example.com/avatar.png","nullable":true}},"required":["id","name","email","image"],"additionalProperties":false,"description":"Organization member holding the TSS signing key. Null only when the user reference could not be populated.","nullable":true},"consumedAt":{"type":"string","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))$","description":"When the invitee enrolled a signing key, which closes the invitation. Null while it still stands. Consumed invitations are kept and still listed: they are the trace of who was asked to hold a key.","nullable":true}},"required":["id","createdAt","updatedAt","user","consumedAt"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"InviteMultisigSignerDto":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email of the organization member to invite. Must match an existing `admin` or `owner` of the organization: enrolment is the invitee’s own authenticated call, so anyone else would be handed an invitation they could never complete.","example":"jeanne.martin@example.com"}},"required":["email"]},"MultisigSignerInvitationDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"User ID of the signer.","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","description":"Display name of the signer, as set on their user profile.","example":"Jeanne Martin"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address of the signer.","example":"jeanne.martin@example.com"},"image":{"type":"string","description":"Avatar URL of the signer (from their sign-in provider); null without one.","example":"https://example.com/avatar.png","nullable":true}},"required":["id","name","email","image"],"additionalProperties":false,"description":"Organization member holding the TSS signing key. Null only when the user reference could not be populated.","nullable":true},"consumedAt":{"type":"string","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))$","description":"When the invitee enrolled a signing key, which closes the invitation. Null while it still stands. Consumed invitations are kept and still listed: they are the trace of who was asked to hold a key.","nullable":true}},"required":["id","createdAt","updatedAt","user","consumedAt"],"additionalProperties":false},"PaginatedMultisigContactDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"label":{"type":"string","description":"Name a signer gave this destination. What one picks in the transfer form, and what the signer app shows instead of a bare address.","example":"Prestataire Acme"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Destination address, 0x-prefixed 20 bytes. Stored lowercase; a mixed-case input has its EIP-55 checksum verified on the way in.","example":"0xcb0c0dca4246bb0f6b3309d64e7e35002cc3af1f"},"archivedAt":{"type":"string","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))$","description":"When the contact was retired. An archived contact can no longer receive a transfer, but still names the past transfers that went to it. Null while it stands.","nullable":true},"lastUsedAt":{"type":"string","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))$","description":"When a transfer to this contact last EXECUTED — never when one was merely opened, so a cancelled transfer does not make an address look familiar. Null means never used, which the signer app calls out.","nullable":true}},"required":["id","createdAt","updatedAt","label","address","archivedAt","lastUsedAt"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"CreateMultisigContactDto":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120,"description":"Name to give this destination.","example":"Prestataire Acme"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Destination address, 0x-prefixed 20 bytes. Stored lowercase; a mixed-case input has its EIP-55 checksum verified on the way in.","example":"0xcb0c0dca4246bb0f6b3309d64e7e35002cc3af1f"}},"required":["label","address"]},"MultisigContactDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"label":{"type":"string","description":"Name a signer gave this destination. What one picks in the transfer form, and what the signer app shows instead of a bare address.","example":"Prestataire Acme"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Destination address, 0x-prefixed 20 bytes. Stored lowercase; a mixed-case input has its EIP-55 checksum verified on the way in.","example":"0xcb0c0dca4246bb0f6b3309d64e7e35002cc3af1f"},"archivedAt":{"type":"string","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))$","description":"When the contact was retired. An archived contact can no longer receive a transfer, but still names the past transfers that went to it. Null while it stands.","nullable":true},"lastUsedAt":{"type":"string","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))$","description":"When a transfer to this contact last EXECUTED — never when one was merely opened, so a cancelled transfer does not make an address look familiar. Null means never used, which the signer app calls out.","nullable":true}},"required":["id","createdAt","updatedAt","label","address","archivedAt","lastUsedAt"],"additionalProperties":false},"RenameMultisigContactDto":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120,"description":"Name to give this destination.","example":"Prestataire Acme"}},"required":["label"]},"RegisterPushTokenDto":{"type":"object","properties":{"token":{"type":"string","pattern":"^Expo(nent)?PushToken\\[[A-Za-z0-9_-]+\\]$","description":"Expo push token of this device, as returned by expo-notifications' getExpoPushTokenAsync. Registering the same token again refreshes its lastSeenAt and re-binds it to the calling user.","example":"ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]"},"platform":{"type":"string","enum":["ios","android"],"description":"OS of the device holding the token.","example":"ios"}},"required":["token","platform"]},"PushTokenDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"token":{"type":"string","description":"The registered Expo push token.","example":"ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]"},"platform":{"type":"string","enum":["ios","android"],"description":"OS of the device holding the token.","example":"ios"}},"required":["id","createdAt","updatedAt","token","platform"]},"ExchangeRateConversionDto_Output":{"type":"object","properties":{"asset":{"type":"string","enum":["USDC","ETH"],"description":"On-chain asset that was converted.","example":"USDC"},"amount":{"type":"string","description":"Raw on-chain amount that was converted, in the asset base units (USDC has 6 decimals, ETH 18). Echoed back from the request.","example":"1250500000"},"currency":{"type":"string","enum":["EUR","USD","JPY"],"description":"Fiat currency (ISO 4217) the amount was converted to.","example":"EUR"},"valueRef":{"type":"string","description":"Converted value in reference sub-units of `currency` (centi-units — divide by 100 for the major amount, uniform across currencies incl. JPY). Live quote from the rate oracle; subject to a short cache.","example":"118750"}},"required":["asset","amount","currency","valueRef"],"additionalProperties":false},"PaginatedApplicationDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"organization":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","description":"Unique identifier of the organization (UUID v4)."},"createdAt":{"type":"string","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))$","example":"2024-01-15T09:30:00.000Z","description":"Creation date (ISO 8601)."},"name":{"type":"string","example":"Keyban SAS","description":"Legal or commercial name of the organization (e.g. `Keyban SAS`). Displayed in the admin UI and on invoices."},"slug":{"type":"string","example":"keyban-sas","description":"URL-safe unique identifier of the organization in kebab-case (e.g. `keyban-sas`). Used in API paths and subdomains. Distinct from `name`."},"logo":{"type":"string","format":"uri","example":"https://cdn.example.com/logos/keyban.png","description":"HTTPS URL of the organization logo (PNG or SVG). `null` when no logo has been uploaded.","nullable":true},"defaultLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the organization's default locale (e.g. `fr-FR`). Null when not set; falls back to Accept-Language header.","nullable":true},"preferredCurrency":{"type":"string","enum":["EUR","USD","JPY",null],"example":"EUR","description":"Fiat currency (ISO 4217) the organization displays monetary values in: wallet and treasury balances are converted to it, transfer amounts are quoted in it for signers, and agent spending policies are authored in it. Chosen once, at the creation of the first application or treasury, and immutable afterwards (a change is refused with `ORG_PREFERRED_CURRENCY_IMMUTABLE`; sending `null` or omitting the field leaves it untouched). Null until chosen.","nullable":true},"agentRoles":{"maxItems":6,"type":"array","items":{"type":"string","enum":["sales","analyst","content","compliance","support","recruit"]},"example":["sales","analyst"],"description":"What the organization's agents do, as picked during the agent-wallet onboarding. Selects the example prompts offered for the first payment. Null until picked.","nullable":true},"acquisitionChannel":{"type":"string","enum":["n8n","trial",null],"example":"n8n","description":"Third-party channel the organization signed up through (e.g. the n8n node listing). Null for an organic/direct signup, never attributed to a specific channel.","nullable":true},"settings":{"type":"object","properties":{"authConfig":{"type":"object","properties":{"email-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"phone-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"google":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"auth0":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]},"clientId":{"type":"string","example":"abc123xyz","description":"OAuth 2.0 / OIDC client identifier issued by the Auth0 tenant. Required when Auth0 is enabled."},"domain":{"type":"string","example":"keyban.eu.auth0.com","description":"Auth0 tenant domain used as the OIDC issuer base URL (e.g. `keyban.eu.auth0.com`). Required when Auth0 is enabled."}},"required":["enabled","clientId","domain"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]}},"required":["email-otp","phone-otp","google","auth0"],"additionalProperties":false}},"required":["authConfig"],"additionalProperties":false}},"required":["id","createdAt","name","slug","logo","settings"],"additionalProperties":false},"name":{"type":"string","minLength":1,"description":"Human-readable name of the application."},"slug":{"type":"string","pattern":"^[a-z0-9-]+$","description":"URL-safe identifier of the application (kebab-case, unique within the organization). Used in URLs and API paths.","example":"my-shop-app"},"features":{"type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]},"description":"List of enabled features for this application."},"domains":{"type":"array","items":{"type":"string"},"description":"List of authorized domains for this application."},"websiteUrl":{"description":"Public website URL.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"preferredCurrency":{"type":"string","enum":["EUR","USD","JPY",null],"description":"Fiat currency (ISO 4217) the application displays monetary values in: wallet balances are converted to it, and spending policies are authored in it. Read-only mirror of the organization's `preferredCurrency`, chosen once for the whole organization. Null until the organization picks it.","example":"EUR","nullable":true},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet",null],"description":"Blockchain network the application runs on. One network per application: agent wallets, balances and spending policies all assume a single chain, and creating a wallet on another network is rejected. Declared once from the agent-wallet onboarding step of the dashboard, then immutable — its wallets are deployed on that chain, so changing it would orphan them; a different network means a different application. The declaration is also checked against the organization quota (`allowedNetworks`). Null on applications that never declared it.","example":"BaseMainnet","nullable":true},"theme":{"type":"object","properties":{"title":{"description":"Title for the application.","type":"string"},"mode":{"type":"string","enum":["light","dark"]},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"secondaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"logoUrl":{"description":"URL for the logo image. Supported format: PNG. Recommended size: 512×512 px (square). Max file size: 500 KB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"bgImageUrl":{"description":"URL for the background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"googleFont":{"description":"Google Font name to be used.","type":"string"},"customFontUrl":{"description":"Optional font URL. When provided, the loyalty app will use this font file (even if a Google font is specified).","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]}},"additionalProperties":false,"description":"Visual branding configuration for the application, including appearance (colors, fonts, images) and page metadata."},"dppSettings":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network where the token contract is deployed. DPP token contracts are EVM-only (e.g. BaseMainnet)."},"address":{"type":"string","example":"0x04ceB44e3b6E4aC4C14f29F7e0Ee40DAFcb3A0e1","description":"Blockchain address of the token contract on the specified network (EVM checksummed 0x... address)."},"name":{"type":"string","example":"DPP Certification Token","description":"Human-readable token name (e.g., \"DPP Certification Token\"). Displayed on explorers and wallets."},"symbol":{"type":"string","example":"DPP","description":"Token symbol, typically uppercase and under 10 characters (e.g., \"DPP\", \"CERT\"). Used for brevity on UI."}},"required":["network","address","name","symbol"],"additionalProperties":false,"description":"Token contract reference on a single blockchain network, used for DPP operations (minting, anchoring, verification)."},"description":"Token contracts available for the application, across all enabled networks. At least one per supported network should be configured."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"additionalProperties":false,"description":"A single public action button rendered on the passport viewer page."},"description":"Public action buttons rendered on the passport viewer page (e.g. authenticity proof link, care guide). Each action appears as a clickable button under the passport."},"heroTitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized headline shown in the passport viewer hero, keyed by BCP 47 locale. When set, it replaces the built-in default copy on both the product (model) and item passport heroes. The DPP App resolves the active locale and falls back to the application default locale; the hero title is hidden when no value matches.","nullable":true},"heroSubtitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized sub-headline shown under the hero title in the passport viewer, keyed by BCP 47 locale. Resolved with the same locale rules as `heroTitle`. Hidden when no value matches the active or default locale.","nullable":true}},"required":["tokens","actions"],"additionalProperties":false,"description":"Digital Product Passport application configuration, including token contracts and action endpoints.","nullable":true},"loyaltySettings":{"type":"object","properties":{"currency":{"description":"Currency used to express the monetary value of loyalty points","type":"string","enum":["EUR","USD"]},"visitsWindowDays":{"description":"Sliding window in days used to evaluate loyalty tier progression. At most one visit is counted per day (multiple purchases in the same day count as one). If a higher tier is defined, customers may be auto-upgraded based on visits within this period.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currencyToPointRatio":{"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThreshold":{"description":"Minimum number of points required to unlock a fixed monetary discount. Redemption is available only once the threshold is reached and can then be applied in multiples of this threshold (e.g., with threshold = 100, 200 points can redeem 2× the discount).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThresholdValue":{"description":"Monetary discount granted each time the threshold is redeemed, expressed in the selected currency. Example: threshold = 100 and value = 5 ⇒ 100 pts → 5 (currency units), 200 pts → 10, etc. No partial redemption occurs below the threshold.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"welcomeBonus":{"description":"Applied to the customer's first purchase. Equivalent to the monetary amount at the current conversion rate.","type":"integer","minimum":0,"maximum":9007199254740991},"tokens":{"type":"array","items":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network where the loyalty token contract is deployed."},"address":{"type":"string","example":"0x9F8a7c2AEE85E24b2B3b58C20B9A46c83E2c7a12","description":"Blockchain address of the token contract on the specified network. Format: network-specific (EVM checksummed 0x..., Stellar native asset code)."},"name":{"type":"string","example":"Acme Loyalty Points","description":"Human-readable token name shown on explorers and wallets (e.g., \"Acme Loyalty Points\")."},"symbol":{"type":"string","example":"ACME-LP","description":"Token symbol, typically uppercase and under 10 characters (e.g., \"ACME-LP\"). Used for brevity on UI."}},"required":["network","address","name","symbol"],"additionalProperties":false,"description":"Blockchain token contract representing loyalty points on a single network, used for on-chain settlement and transfers."},"description":"Blockchain tokens representing loyalty points associated with the program."},"app":{"type":"object","properties":{"pointName":{"type":"string","description":"Human-readable name for a single loyalty point (e.g., “point”, “mile”, “star”).","nullable":true},"pointSymbol":{"type":"string","description":"Short symbol for the loyalty point (e.g., “pt”, “⭐”).","nullable":true},"onboarding":{"type":"object","properties":{"showTexts":{"description":"When `true`, onboarding text blocks (title, subtitle) are displayed on the customer welcome screen.","type":"boolean"},"fontColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"HEX color code applied to all onboarding text, allowing brand-consistency without requiring multiple asset versions. `null` when left at the default text color.","nullable":true},"title":{"type":"string","description":"Primary heading shown during onboarding (e.g., \"Welcome to our loyalty program\"). `null`/omitted when no custom title is set.","nullable":true},"subtitle":{"type":"string","description":"Secondary heading or introductory message displayed under the title. `null`/omitted when no subtitle is set.","nullable":true},"qrCodeText":{"type":"string","description":"Label displayed alongside the QR code that links the customer to the loyalty app or claim page. `null`/omitted when no custom label is set.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for the onboarding background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true},"carousel":{"description":"Onboarding carousel configuration, including slide images and auto-play interval. Omitted when no carousel is desired.","type":"object","properties":{"interval":{"type":"number","description":"Time in milliseconds between automatic carousel slides (e.g., `5000` for 5 seconds). Used only when the carousel is in auto-play mode."},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"URL for carousel image. Supported format: PNG. Recommended size: 800×600 px (4:3 ratio). Max file size: 300 KB."},"title":{"type":"string","description":"Short caption shown above or overlaid on the carousel slide. `null`/omitted when the slide has no caption.","nullable":true},"description":{"type":"string","description":"Longer text describing the slide content, displayed below or beside the image. `null`/omitted when the slide has no description.","nullable":true}},"required":["url"],"additionalProperties":false,"description":"A single slide in the onboarding carousel."},"description":"Ordered list of carousel slides shown during onboarding."}},"required":["interval","images"],"additionalProperties":false}},"additionalProperties":false,"description":"Onboarding flow configuration, including welcome messages, carousel, and visual styling."}},"required":["onboarding"],"additionalProperties":false,"description":"Configuration for the loyalty application, including appearance (colors, fonts, images) and page metadata."},"googleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Google Wallet logo. Supported format: PNG. Minimum dimensions: 660×660 px (square). Max file size: 500 KB. Keep key elements within a safe zone (15% margin) due to circular masking.","type":"string","format":"uri"},"title":{"type":"string","description":"Display name of the loyalty card shown in the Google Wallet pass list (e.g., \"Acme Rewards\")."},"header":{"type":"string","description":"Header text displayed at the top of the loyalty card face (e.g., program name or subtitle)."},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the card face, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Google Wallet background image. Supported format: PNG (mandatory). Recommended dimensions: 1032×336 px (3:1 ratio). Maximum file size: 5 MB.","nullable":true},"detailsHeader":{"type":"string","description":"Section heading shown in the card details view (e.g., \"Your Balance\"). Limited to brief labels due to space constraints. `null`/omitted when no details section is configured.","nullable":true},"detailsBody":{"type":"string","description":"Body text in the card details view (e.g., account number, current balance, program tier). Supports multi-line content. `null`/omitted when no details section is configured.","nullable":true}},"required":["logoUrl","title","header"],"additionalProperties":false,"description":"Google Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Google Wallet integration.","nullable":true},"appleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Apple Wallet logo. Supported format: PNG only. Recommended sizes: 160×50 (1x), 320×100 (2x), 480×150 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"iconUrl":{"description":"URL for Apple Wallet icon (shown in Wallet app icon picker). Supported format: PNG only. Recommended sizes: 29×29 (1x), 58×58 (2x), 87×87 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"title":{"type":"string","description":"Optional short text shown next to the logo in the Wallet app (e.g., \"Acme Rewards Card\"). `null`/omitted when the pass should display the logo only.","nullable":true},"labelColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Color applied to field labels (e.g., \"Balance\", \"Member ID\") on the pass, as a HEX code. Improves readability against the background. `null` when left at the Wallet default.","nullable":true},"fgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Foreground (text) color of dynamic pass content, as a HEX code. Used for balance amounts and other variable data. `null` when left at the Wallet default.","nullable":true},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the pass strip, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Apple Wallet background image (strip). Supported format: PNG only. Recommended sizes: 624×168 (2x), 936×252 (3x). Max file size: 100 KB.","nullable":true}},"required":["logoUrl","iconUrl"],"additionalProperties":false,"description":"Apple Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Apple Wallet integration.","nullable":true}},"required":["tokens","app"],"additionalProperties":false,"description":"Global configuration schema for a loyalty program, including earning/redeeming rules, associated token, and visual customizations.","nullable":true},"shopifyShop":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]},"name":{"type":"string","description":"Display name of the shopify shop"},"domain":{"type":"string","description":"Display domain of the shopify shop"},"hasSession":{"type":"boolean"}},"required":["id","createdAt","updatedAt","network","name","domain","hasSession"],"additionalProperties":false,"nullable":true},"cloudflareSession":{"type":"object","properties":{},"additionalProperties":false,"nullable":true}},"required":["id","createdAt","updatedAt","organization","name","slug","features","domains","preferredCurrency","network","theme","dppSettings","loyaltySettings"],"additionalProperties":false,"description":"An application is a Keyban application. It is required to use the SDK and the API endpoints. It serves as the entry point to access and interact with the Keyban platform."},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"ApplicationDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"organization":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","description":"Unique identifier of the organization (UUID v4)."},"createdAt":{"type":"string","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))$","example":"2024-01-15T09:30:00.000Z","description":"Creation date (ISO 8601)."},"name":{"type":"string","example":"Keyban SAS","description":"Legal or commercial name of the organization (e.g. `Keyban SAS`). Displayed in the admin UI and on invoices."},"slug":{"type":"string","example":"keyban-sas","description":"URL-safe unique identifier of the organization in kebab-case (e.g. `keyban-sas`). Used in API paths and subdomains. Distinct from `name`."},"logo":{"type":"string","format":"uri","example":"https://cdn.example.com/logos/keyban.png","description":"HTTPS URL of the organization logo (PNG or SVG). `null` when no logo has been uploaded.","nullable":true},"defaultLocale":{"type":"string","enum":["en-US","fr-FR","es-ES","it-IT",null],"example":"fr-FR","description":"BCP 47 language tag for the organization's default locale (e.g. `fr-FR`). Null when not set; falls back to Accept-Language header.","nullable":true},"preferredCurrency":{"type":"string","enum":["EUR","USD","JPY",null],"example":"EUR","description":"Fiat currency (ISO 4217) the organization displays monetary values in: wallet and treasury balances are converted to it, transfer amounts are quoted in it for signers, and agent spending policies are authored in it. Chosen once, at the creation of the first application or treasury, and immutable afterwards (a change is refused with `ORG_PREFERRED_CURRENCY_IMMUTABLE`; sending `null` or omitting the field leaves it untouched). Null until chosen.","nullable":true},"agentRoles":{"maxItems":6,"type":"array","items":{"type":"string","enum":["sales","analyst","content","compliance","support","recruit"]},"example":["sales","analyst"],"description":"What the organization's agents do, as picked during the agent-wallet onboarding. Selects the example prompts offered for the first payment. Null until picked.","nullable":true},"acquisitionChannel":{"type":"string","enum":["n8n","trial",null],"example":"n8n","description":"Third-party channel the organization signed up through (e.g. the n8n node listing). Null for an organic/direct signup, never attributed to a specific channel.","nullable":true},"settings":{"type":"object","properties":{"authConfig":{"type":"object","properties":{"email-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"phone-otp":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"google":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]}},"required":["enabled"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]},"auth0":{"oneOf":[{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is active for this organization.","enum":[true]},"clientId":{"type":"string","example":"abc123xyz","description":"OAuth 2.0 / OIDC client identifier issued by the Auth0 tenant. Required when Auth0 is enabled."},"domain":{"type":"string","example":"keyban.eu.auth0.com","description":"Auth0 tenant domain used as the OIDC issuer base URL (e.g. `keyban.eu.auth0.com`). Required when Auth0 is enabled."}},"required":["enabled","clientId","domain"],"additionalProperties":false},{"type":"object","properties":{"enabled":{"type":"boolean","description":"Authentication method is disabled for this organization.","enum":[false]}},"required":["enabled"],"additionalProperties":false}]}},"required":["email-otp","phone-otp","google","auth0"],"additionalProperties":false}},"required":["authConfig"],"additionalProperties":false}},"required":["id","createdAt","name","slug","logo","settings"],"additionalProperties":false},"name":{"type":"string","minLength":1,"description":"Human-readable name of the application."},"slug":{"type":"string","pattern":"^[a-z0-9-]+$","description":"URL-safe identifier of the application (kebab-case, unique within the organization). Used in URLs and API paths.","example":"my-shop-app"},"features":{"type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]},"description":"List of enabled features for this application."},"domains":{"type":"array","items":{"type":"string"},"description":"List of authorized domains for this application."},"websiteUrl":{"description":"Public website URL.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"preferredCurrency":{"type":"string","enum":["EUR","USD","JPY",null],"description":"Fiat currency (ISO 4217) the application displays monetary values in: wallet balances are converted to it, and spending policies are authored in it. Read-only mirror of the organization's `preferredCurrency`, chosen once for the whole organization. Null until the organization picks it.","example":"EUR","nullable":true},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet",null],"description":"Blockchain network the application runs on. One network per application: agent wallets, balances and spending policies all assume a single chain, and creating a wallet on another network is rejected. Declared once from the agent-wallet onboarding step of the dashboard, then immutable — its wallets are deployed on that chain, so changing it would orphan them; a different network means a different application. The declaration is also checked against the organization quota (`allowedNetworks`). Null on applications that never declared it.","example":"BaseMainnet","nullable":true},"theme":{"type":"object","properties":{"title":{"description":"Title for the application.","type":"string"},"mode":{"type":"string","enum":["light","dark"]},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"secondaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"logoUrl":{"description":"URL for the logo image. Supported format: PNG. Recommended size: 512×512 px (square). Max file size: 500 KB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"bgImageUrl":{"description":"URL for the background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"googleFont":{"description":"Google Font name to be used.","type":"string"},"customFontUrl":{"description":"Optional font URL. When provided, the loyalty app will use this font file (even if a Google font is specified).","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]}},"additionalProperties":false,"description":"Visual branding configuration for the application, including appearance (colors, fonts, images) and page metadata."},"dppSettings":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network where the token contract is deployed. DPP token contracts are EVM-only (e.g. BaseMainnet)."},"address":{"type":"string","example":"0x04ceB44e3b6E4aC4C14f29F7e0Ee40DAFcb3A0e1","description":"Blockchain address of the token contract on the specified network (EVM checksummed 0x... address)."},"name":{"type":"string","example":"DPP Certification Token","description":"Human-readable token name (e.g., \"DPP Certification Token\"). Displayed on explorers and wallets."},"symbol":{"type":"string","example":"DPP","description":"Token symbol, typically uppercase and under 10 characters (e.g., \"DPP\", \"CERT\"). Used for brevity on UI."}},"required":["network","address","name","symbol"],"additionalProperties":false,"description":"Token contract reference on a single blockchain network, used for DPP operations (minting, anchoring, verification)."},"description":"Token contracts available for the application, across all enabled networks. At least one per supported network should be configured."},"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"additionalProperties":false,"description":"A single public action button rendered on the passport viewer page."},"description":"Public action buttons rendered on the passport viewer page (e.g. authenticity proof link, care guide). Each action appears as a clickable button under the passport."},"heroTitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized headline shown in the passport viewer hero, keyed by BCP 47 locale. When set, it replaces the built-in default copy on both the product (model) and item passport heroes. The DPP App resolves the active locale and falls back to the application default locale; the hero title is hidden when no value matches.","nullable":true},"heroSubtitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized sub-headline shown under the hero title in the passport viewer, keyed by BCP 47 locale. Resolved with the same locale rules as `heroTitle`. Hidden when no value matches the active or default locale.","nullable":true}},"required":["tokens","actions"],"additionalProperties":false,"description":"Digital Product Passport application configuration, including token contracts and action endpoints.","nullable":true},"loyaltySettings":{"type":"object","properties":{"currency":{"description":"Currency used to express the monetary value of loyalty points","type":"string","enum":["EUR","USD"]},"visitsWindowDays":{"description":"Sliding window in days used to evaluate loyalty tier progression. At most one visit is counted per day (multiple purchases in the same day count as one). If a higher tier is defined, customers may be auto-upgraded based on visits within this period.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currencyToPointRatio":{"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThreshold":{"description":"Minimum number of points required to unlock a fixed monetary discount. Redemption is available only once the threshold is reached and can then be applied in multiples of this threshold (e.g., with threshold = 100, 200 points can redeem 2× the discount).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThresholdValue":{"description":"Monetary discount granted each time the threshold is redeemed, expressed in the selected currency. Example: threshold = 100 and value = 5 ⇒ 100 pts → 5 (currency units), 200 pts → 10, etc. No partial redemption occurs below the threshold.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"welcomeBonus":{"description":"Applied to the customer's first purchase. Equivalent to the monetary amount at the current conversion rate.","type":"integer","minimum":0,"maximum":9007199254740991},"tokens":{"type":"array","items":{"type":"object","properties":{"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"],"description":"Blockchain network where the loyalty token contract is deployed."},"address":{"type":"string","example":"0x9F8a7c2AEE85E24b2B3b58C20B9A46c83E2c7a12","description":"Blockchain address of the token contract on the specified network. Format: network-specific (EVM checksummed 0x..., Stellar native asset code)."},"name":{"type":"string","example":"Acme Loyalty Points","description":"Human-readable token name shown on explorers and wallets (e.g., \"Acme Loyalty Points\")."},"symbol":{"type":"string","example":"ACME-LP","description":"Token symbol, typically uppercase and under 10 characters (e.g., \"ACME-LP\"). Used for brevity on UI."}},"required":["network","address","name","symbol"],"additionalProperties":false,"description":"Blockchain token contract representing loyalty points on a single network, used for on-chain settlement and transfers."},"description":"Blockchain tokens representing loyalty points associated with the program."},"app":{"type":"object","properties":{"pointName":{"type":"string","description":"Human-readable name for a single loyalty point (e.g., “point”, “mile”, “star”).","nullable":true},"pointSymbol":{"type":"string","description":"Short symbol for the loyalty point (e.g., “pt”, “⭐”).","nullable":true},"onboarding":{"type":"object","properties":{"showTexts":{"description":"When `true`, onboarding text blocks (title, subtitle) are displayed on the customer welcome screen.","type":"boolean"},"fontColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"HEX color code applied to all onboarding text, allowing brand-consistency without requiring multiple asset versions. `null` when left at the default text color.","nullable":true},"title":{"type":"string","description":"Primary heading shown during onboarding (e.g., \"Welcome to our loyalty program\"). `null`/omitted when no custom title is set.","nullable":true},"subtitle":{"type":"string","description":"Secondary heading or introductory message displayed under the title. `null`/omitted when no subtitle is set.","nullable":true},"qrCodeText":{"type":"string","description":"Label displayed alongside the QR code that links the customer to the loyalty app or claim page. `null`/omitted when no custom label is set.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for the onboarding background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true},"carousel":{"description":"Onboarding carousel configuration, including slide images and auto-play interval. Omitted when no carousel is desired.","type":"object","properties":{"interval":{"type":"number","description":"Time in milliseconds between automatic carousel slides (e.g., `5000` for 5 seconds). Used only when the carousel is in auto-play mode."},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"URL for carousel image. Supported format: PNG. Recommended size: 800×600 px (4:3 ratio). Max file size: 300 KB."},"title":{"type":"string","description":"Short caption shown above or overlaid on the carousel slide. `null`/omitted when the slide has no caption.","nullable":true},"description":{"type":"string","description":"Longer text describing the slide content, displayed below or beside the image. `null`/omitted when the slide has no description.","nullable":true}},"required":["url"],"additionalProperties":false,"description":"A single slide in the onboarding carousel."},"description":"Ordered list of carousel slides shown during onboarding."}},"required":["interval","images"],"additionalProperties":false}},"additionalProperties":false,"description":"Onboarding flow configuration, including welcome messages, carousel, and visual styling."}},"required":["onboarding"],"additionalProperties":false,"description":"Configuration for the loyalty application, including appearance (colors, fonts, images) and page metadata."},"googleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Google Wallet logo. Supported format: PNG. Minimum dimensions: 660×660 px (square). Max file size: 500 KB. Keep key elements within a safe zone (15% margin) due to circular masking.","type":"string","format":"uri"},"title":{"type":"string","description":"Display name of the loyalty card shown in the Google Wallet pass list (e.g., \"Acme Rewards\")."},"header":{"type":"string","description":"Header text displayed at the top of the loyalty card face (e.g., program name or subtitle)."},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the card face, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Google Wallet background image. Supported format: PNG (mandatory). Recommended dimensions: 1032×336 px (3:1 ratio). Maximum file size: 5 MB.","nullable":true},"detailsHeader":{"type":"string","description":"Section heading shown in the card details view (e.g., \"Your Balance\"). Limited to brief labels due to space constraints. `null`/omitted when no details section is configured.","nullable":true},"detailsBody":{"type":"string","description":"Body text in the card details view (e.g., account number, current balance, program tier). Supports multi-line content. `null`/omitted when no details section is configured.","nullable":true}},"required":["logoUrl","title","header"],"additionalProperties":false,"description":"Google Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Google Wallet integration.","nullable":true},"appleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Apple Wallet logo. Supported format: PNG only. Recommended sizes: 160×50 (1x), 320×100 (2x), 480×150 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"iconUrl":{"description":"URL for Apple Wallet icon (shown in Wallet app icon picker). Supported format: PNG only. Recommended sizes: 29×29 (1x), 58×58 (2x), 87×87 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"title":{"type":"string","description":"Optional short text shown next to the logo in the Wallet app (e.g., \"Acme Rewards Card\"). `null`/omitted when the pass should display the logo only.","nullable":true},"labelColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Color applied to field labels (e.g., \"Balance\", \"Member ID\") on the pass, as a HEX code. Improves readability against the background. `null` when left at the Wallet default.","nullable":true},"fgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Foreground (text) color of dynamic pass content, as a HEX code. Used for balance amounts and other variable data. `null` when left at the Wallet default.","nullable":true},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the pass strip, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Apple Wallet background image (strip). Supported format: PNG only. Recommended sizes: 624×168 (2x), 936×252 (3x). Max file size: 100 KB.","nullable":true}},"required":["logoUrl","iconUrl"],"additionalProperties":false,"description":"Apple Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Apple Wallet integration.","nullable":true}},"required":["tokens","app"],"additionalProperties":false,"description":"Global configuration schema for a loyalty program, including earning/redeeming rules, associated token, and visual customizations.","nullable":true},"shopifyShop":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet"]},"name":{"type":"string","description":"Display name of the shopify shop"},"domain":{"type":"string","description":"Display domain of the shopify shop"},"hasSession":{"type":"boolean"}},"required":["id","createdAt","updatedAt","network","name","domain","hasSession"],"additionalProperties":false,"nullable":true},"cloudflareSession":{"type":"object","properties":{},"additionalProperties":false,"nullable":true}},"required":["id","createdAt","updatedAt","organization","name","slug","features","domains","preferredCurrency","network","theme","dppSettings","loyaltySettings"],"description":"An application is a Keyban application. It is required to use the SDK and the API endpoints. It serves as the entry point to access and interact with the Keyban platform.","additionalProperties":false},"CreateApplicationDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable name of the application."},"slug":{"type":"string","pattern":"^[a-z0-9-]+$","description":"URL-safe identifier of the application (kebab-case, unique within the organization). Used in URLs and API paths.","example":"my-shop-app"},"features":{"type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]},"description":"List of enabled features for this application."},"domains":{"type":"array","items":{"type":"string"},"description":"List of authorized domains for this application."},"websiteUrl":{"description":"Public website URL.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"theme":{"type":"object","properties":{"title":{"description":"Title for the application.","type":"string"},"mode":{"type":"string","enum":["light","dark"]},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"secondaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"logoUrl":{"description":"URL for the logo image. Supported format: PNG. Recommended size: 512×512 px (square). Max file size: 500 KB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"bgImageUrl":{"description":"URL for the background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"googleFont":{"description":"Google Font name to be used.","type":"string"},"customFontUrl":{"description":"Optional font URL. When provided, the loyalty app will use this font file (even if a Google font is specified).","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]}},"description":"Visual branding configuration for the application, including appearance (colors, fonts, images) and page metadata."},"dppSettings":{"type":"object","properties":{"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public action buttons rendered on the passport viewer page (e.g. authenticity proof link, care guide). Each action appears as a clickable button under the passport."},"heroTitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized headline shown in the passport viewer hero, keyed by BCP 47 locale. When set, it replaces the built-in default copy on both the product (model) and item passport heroes. The DPP App resolves the active locale and falls back to the application default locale; the hero title is hidden when no value matches.","nullable":true},"heroSubtitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized sub-headline shown under the hero title in the passport viewer, keyed by BCP 47 locale. Resolved with the same locale rules as `heroTitle`. Hidden when no value matches the active or default locale.","nullable":true}}},"loyaltySettings":{"type":"object","properties":{"currency":{"description":"Currency used to express the monetary value of loyalty points","type":"string","enum":["EUR","USD"]},"visitsWindowDays":{"description":"Sliding window in days used to evaluate loyalty tier progression. At most one visit is counted per day (multiple purchases in the same day count as one). If a higher tier is defined, customers may be auto-upgraded based on visits within this period.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currencyToPointRatio":{"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThreshold":{"description":"Minimum number of points required to unlock a fixed monetary discount. Redemption is available only once the threshold is reached and can then be applied in multiples of this threshold (e.g., with threshold = 100, 200 points can redeem 2× the discount).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThresholdValue":{"description":"Monetary discount granted each time the threshold is redeemed, expressed in the selected currency. Example: threshold = 100 and value = 5 ⇒ 100 pts → 5 (currency units), 200 pts → 10, etc. No partial redemption occurs below the threshold.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"welcomeBonus":{"description":"Applied to the customer's first purchase. Equivalent to the monetary amount at the current conversion rate.","type":"integer","minimum":0,"maximum":9007199254740991},"app":{"type":"object","properties":{"pointName":{"type":"string","description":"Human-readable name for a single loyalty point (e.g., “point”, “mile”, “star”).","nullable":true},"pointSymbol":{"type":"string","description":"Short symbol for the loyalty point (e.g., “pt”, “⭐”).","nullable":true},"onboarding":{"type":"object","properties":{"showTexts":{"description":"When `true`, onboarding text blocks (title, subtitle) are displayed on the customer welcome screen.","type":"boolean"},"fontColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"HEX color code applied to all onboarding text, allowing brand-consistency without requiring multiple asset versions. `null` when left at the default text color.","nullable":true},"title":{"type":"string","description":"Primary heading shown during onboarding (e.g., \"Welcome to our loyalty program\"). `null`/omitted when no custom title is set.","nullable":true},"subtitle":{"type":"string","description":"Secondary heading or introductory message displayed under the title. `null`/omitted when no subtitle is set.","nullable":true},"qrCodeText":{"type":"string","description":"Label displayed alongside the QR code that links the customer to the loyalty app or claim page. `null`/omitted when no custom label is set.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for the onboarding background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true},"carousel":{"description":"Onboarding carousel configuration, including slide images and auto-play interval. Omitted when no carousel is desired.","type":"object","properties":{"interval":{"type":"number","description":"Time in milliseconds between automatic carousel slides (e.g., `5000` for 5 seconds). Used only when the carousel is in auto-play mode."},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"URL for carousel image. Supported format: PNG. Recommended size: 800×600 px (4:3 ratio). Max file size: 300 KB."},"title":{"type":"string","description":"Short caption shown above or overlaid on the carousel slide. `null`/omitted when the slide has no caption.","nullable":true},"description":{"type":"string","description":"Longer text describing the slide content, displayed below or beside the image. `null`/omitted when the slide has no description.","nullable":true}},"required":["url"],"description":"A single slide in the onboarding carousel."},"description":"Ordered list of carousel slides shown during onboarding."}},"required":["interval","images"]}},"description":"Onboarding flow configuration, including welcome messages, carousel, and visual styling."}}},"googleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Google Wallet logo. Supported format: PNG. Minimum dimensions: 660×660 px (square). Max file size: 500 KB. Keep key elements within a safe zone (15% margin) due to circular masking.","type":"string","format":"uri"},"title":{"type":"string","description":"Display name of the loyalty card shown in the Google Wallet pass list (e.g., \"Acme Rewards\")."},"header":{"type":"string","description":"Header text displayed at the top of the loyalty card face (e.g., program name or subtitle)."},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the card face, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Google Wallet background image. Supported format: PNG (mandatory). Recommended dimensions: 1032×336 px (3:1 ratio). Maximum file size: 5 MB.","nullable":true},"detailsHeader":{"type":"string","description":"Section heading shown in the card details view (e.g., \"Your Balance\"). Limited to brief labels due to space constraints. `null`/omitted when no details section is configured.","nullable":true},"detailsBody":{"type":"string","description":"Body text in the card details view (e.g., account number, current balance, program tier). Supports multi-line content. `null`/omitted when no details section is configured.","nullable":true}},"required":["title","header"],"description":"Google Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Google Wallet integration.","nullable":true},"appleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Apple Wallet logo. Supported format: PNG only. Recommended sizes: 160×50 (1x), 320×100 (2x), 480×150 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"iconUrl":{"description":"URL for Apple Wallet icon (shown in Wallet app icon picker). Supported format: PNG only. Recommended sizes: 29×29 (1x), 58×58 (2x), 87×87 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"title":{"type":"string","description":"Optional short text shown next to the logo in the Wallet app (e.g., \"Acme Rewards Card\"). `null`/omitted when the pass should display the logo only.","nullable":true},"labelColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Color applied to field labels (e.g., \"Balance\", \"Member ID\") on the pass, as a HEX code. Improves readability against the background. `null` when left at the Wallet default.","nullable":true},"fgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Foreground (text) color of dynamic pass content, as a HEX code. Used for balance amounts and other variable data. `null` when left at the Wallet default.","nullable":true},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the pass strip, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Apple Wallet background image (strip). Supported format: PNG only. Recommended sizes: 624×168 (2x), 936×252 (3x). Max file size: 100 KB.","nullable":true}},"description":"Apple Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Apple Wallet integration.","nullable":true}}}},"required":["name","slug"]},"UpdateApplicationDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable name of the application."},"slug":{"type":"string","pattern":"^[a-z0-9-]+$","description":"URL-safe identifier of the application (kebab-case, unique within the organization). Used in URLs and API paths.","example":"my-shop-app"},"features":{"type":"array","items":{"type":"string","enum":["dpp","loyalty","invest","agent-wallet","trust","onramp","treasury"]},"description":"List of enabled features for this application."},"domains":{"type":"array","items":{"type":"string"},"description":"List of authorized domains for this application."},"websiteUrl":{"description":"Public website URL.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"theme":{"type":"object","properties":{"title":{"description":"Title for the application.","type":"string"},"mode":{"type":"string","enum":["light","dark"]},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"secondaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"logoUrl":{"description":"URL for the logo image. Supported format: PNG. Recommended size: 512×512 px (square). Max file size: 500 KB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"bgImageUrl":{"description":"URL for the background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]},"googleFont":{"description":"Google Font name to be used.","type":"string"},"customFontUrl":{"description":"Optional font URL. When provided, the loyalty app will use this font file (even if a Google font is specified).","anyOf":[{"type":"string","format":"uri"},{"type":"string","enum":[""]}]}},"description":"Visual branding configuration for the application, including appearance (colors, fonts, images) and page metadata."},"dppSettings":{"type":"object","properties":{"actions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stable UUID v4 assigned server-side. Unique per application. Used to identify and update a specific action button."},"enabled":{"type":"boolean","description":"When `false`, the button is hidden on the public passport viewer. The `url` and `icon` fields are ignored."},"type":{"type":"string","enum":["circularity","marketing"],"example":"circularity","description":"Functional family of the action. The passport viewer renders one card per type (circularity services vs commercial offers)."},"url":{"example":"https://example.com/authenticity-proof","description":"Absolute HTTPS URL the button points to. When empty or absent, the action is rendered as a non-clickable informational row on the passport viewer.","type":"string"},"label":{"description":"Localized label displayed on the button, keyed by BCP 47 locale code. The DPP App resolves the active locale and falls back to the application default locale. The button is hidden when no label matches.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"description":{"description":"Localized secondary line displayed under the label on the passport viewer, keyed by BCP 47 locale code (e.g. the program or offer the action belongs to). Resolved with the same locale rules as `label`. The line is omitted when absent.","type":"object","additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"}},"icon":{"example":"recycle","description":"Icon identifier for the button. Accepts a Lucide icon name in kebab-case (e.g. `\"recycle\"`, `\"wrench\"` — the viewer supports a curated subset and renders unknown names as plain text, so emojis also work) or an absolute HTTPS URL pointing to an SVG asset.","type":"string"}},"required":["id","enabled","type"],"description":"A single public action button rendered on the passport viewer page."},"description":"Public action buttons rendered on the passport viewer page (e.g. authenticity proof link, care guide). Each action appears as a clickable button under the passport."},"heroTitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized headline shown in the passport viewer hero, keyed by BCP 47 locale. When set, it replaces the built-in default copy on both the product (model) and item passport heroes. The DPP App resolves the active locale and falls back to the application default locale; the hero title is hidden when no value matches.","nullable":true},"heroSubtitle":{"type":"object","propertyNames":{"type":"string","enum":["en-US","fr-FR"]},"additionalProperties":{"type":"string","minLength":1},"example":{"en-US":"Verify authenticity","fr-FR":"Vérifier l'authenticité"},"description":"Localized sub-headline shown under the hero title in the passport viewer, keyed by BCP 47 locale. Resolved with the same locale rules as `heroTitle`. Hidden when no value matches the active or default locale.","nullable":true}},"nullable":true},"loyaltySettings":{"type":"object","properties":{"currency":{"description":"Currency used to express the monetary value of loyalty points","type":"string","enum":["EUR","USD"]},"visitsWindowDays":{"description":"Sliding window in days used to evaluate loyalty tier progression. At most one visit is counted per day (multiple purchases in the same day count as one). If a higher tier is defined, customers may be auto-upgraded based on visits within this period.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currencyToPointRatio":{"description":"Number of loyalty points earned for each 1 unit of currency spent (e.g., if the ratio is 2 and currency is EUR, spending €1 earns 2 points). Used to calculate point accruals from transaction amounts.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThreshold":{"description":"Minimum number of points required to unlock a fixed monetary discount. Redemption is available only once the threshold is reached and can then be applied in multiples of this threshold (e.g., with threshold = 100, 200 points can redeem 2× the discount).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pointsConversionThresholdValue":{"description":"Monetary discount granted each time the threshold is redeemed, expressed in the selected currency. Example: threshold = 100 and value = 5 ⇒ 100 pts → 5 (currency units), 200 pts → 10, etc. No partial redemption occurs below the threshold.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"welcomeBonus":{"description":"Applied to the customer's first purchase. Equivalent to the monetary amount at the current conversion rate.","type":"integer","minimum":0,"maximum":9007199254740991},"app":{"type":"object","properties":{"pointName":{"type":"string","description":"Human-readable name for a single loyalty point (e.g., “point”, “mile”, “star”).","nullable":true},"pointSymbol":{"type":"string","description":"Short symbol for the loyalty point (e.g., “pt”, “⭐”).","nullable":true},"onboarding":{"type":"object","properties":{"showTexts":{"description":"When `true`, onboarding text blocks (title, subtitle) are displayed on the customer welcome screen.","type":"boolean"},"fontColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"HEX color code applied to all onboarding text, allowing brand-consistency without requiring multiple asset versions. `null` when left at the default text color.","nullable":true},"title":{"type":"string","description":"Primary heading shown during onboarding (e.g., \"Welcome to our loyalty program\"). `null`/omitted when no custom title is set.","nullable":true},"subtitle":{"type":"string","description":"Secondary heading or introductory message displayed under the title. `null`/omitted when no subtitle is set.","nullable":true},"qrCodeText":{"type":"string","description":"Label displayed alongside the QR code that links the customer to the loyalty app or claim page. `null`/omitted when no custom label is set.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for the onboarding background image. Supported format: PNG. Recommended size: 1920×1080 px (landscape). Max file size: 1 MB.","nullable":true},"carousel":{"description":"Onboarding carousel configuration, including slide images and auto-play interval. Omitted when no carousel is desired.","type":"object","properties":{"interval":{"type":"number","description":"Time in milliseconds between automatic carousel slides (e.g., `5000` for 5 seconds). Used only when the carousel is in auto-play mode."},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"URL for carousel image. Supported format: PNG. Recommended size: 800×600 px (4:3 ratio). Max file size: 300 KB."},"title":{"type":"string","description":"Short caption shown above or overlaid on the carousel slide. `null`/omitted when the slide has no caption.","nullable":true},"description":{"type":"string","description":"Longer text describing the slide content, displayed below or beside the image. `null`/omitted when the slide has no description.","nullable":true}},"required":["url"],"description":"A single slide in the onboarding carousel."},"description":"Ordered list of carousel slides shown during onboarding."}},"required":["interval","images"]}},"description":"Onboarding flow configuration, including welcome messages, carousel, and visual styling."}}},"googleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Google Wallet logo. Supported format: PNG. Minimum dimensions: 660×660 px (square). Max file size: 500 KB. Keep key elements within a safe zone (15% margin) due to circular masking.","type":"string","format":"uri"},"title":{"type":"string","description":"Display name of the loyalty card shown in the Google Wallet pass list (e.g., \"Acme Rewards\")."},"header":{"type":"string","description":"Header text displayed at the top of the loyalty card face (e.g., program name or subtitle)."},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the card face, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Google Wallet background image. Supported format: PNG (mandatory). Recommended dimensions: 1032×336 px (3:1 ratio). Maximum file size: 5 MB.","nullable":true},"detailsHeader":{"type":"string","description":"Section heading shown in the card details view (e.g., \"Your Balance\"). Limited to brief labels due to space constraints. `null`/omitted when no details section is configured.","nullable":true},"detailsBody":{"type":"string","description":"Body text in the card details view (e.g., account number, current balance, program tier). Supports multi-line content. `null`/omitted when no details section is configured.","nullable":true}},"required":["title","header"],"description":"Google Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Google Wallet integration.","nullable":true},"appleWallet":{"type":"object","properties":{"logoUrl":{"description":"URL for Apple Wallet logo. Supported format: PNG only. Recommended sizes: 160×50 (1x), 320×100 (2x), 480×150 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"iconUrl":{"description":"URL for Apple Wallet icon (shown in Wallet app icon picker). Supported format: PNG only. Recommended sizes: 29×29 (1x), 58×58 (2x), 87×87 (3x). Max file size: 100 KB.","type":"string","format":"uri"},"title":{"type":"string","description":"Optional short text shown next to the logo in the Wallet app (e.g., \"Acme Rewards Card\"). `null`/omitted when the pass should display the logo only.","nullable":true},"labelColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Color applied to field labels (e.g., \"Balance\", \"Member ID\") on the pass, as a HEX code. Improves readability against the background. `null` when left at the Wallet default.","nullable":true},"fgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Foreground (text) color of dynamic pass content, as a HEX code. Used for balance amounts and other variable data. `null` when left at the Wallet default.","nullable":true},"bgColor":{"type":"string","pattern":"^#[0-9a-f]{6}$","description":"Background color of the pass strip, as a HEX code. Fallback when `bgImageUrl` is not provided. `null` when left at the Wallet default.","nullable":true},"bgImageUrl":{"type":"string","format":"uri","description":"URL for Apple Wallet background image (strip). Supported format: PNG only. Recommended sizes: 624×168 (2x), 936×252 (3x). Max file size: 100 KB.","nullable":true}},"description":"Apple Wallet configuration for loyalty card issuance. When omitted or `null`, the loyalty app does not support Apple Wallet integration.","nullable":true}},"nullable":true},"network":{"type":"string","enum":["EthereumAnvil","BaseSepolia","BaseMainnet","XdcApothem","XdcMainnet","StellarQuickstart","StellarTestnet","StellarMainnet",null],"nullable":true}}},"LoyaltyMetricsByOrgDto":{"type":"object","properties":{"organizationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Organization UUID"},"organizationName":{"type":"string","description":"Organization display name"},"applications":{"type":"array","items":{"type":"object","properties":{"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application UUID"},"applicationName":{"type":"string","description":"Application display name"},"metrics":{"type":"object","properties":{"pointsInCirculation":{"type":"string","description":"Total loyalty points minted during the period (sum of mint transactions from the blockchain indexer). Returned as a BigInt string for JSON compatibility.","example":"1250000"},"pointsBurned":{"type":"string","description":"Total loyalty points burned/redeemed during the period (sum of burn transactions from the blockchain indexer). Returned as a BigInt string for JSON compatibility.","example":"150000"},"netCirculation":{"type":"string","description":"Net points change during the period, computed as (pointsInCirculation - pointsBurned). A positive value means more points were minted than burned in the selected date range. This is a period delta, not a historical total supply. Returned as a BigInt string for JSON compatibility.","example":"1100000"},"activeAccounts":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of customer accounts with point balance > 0 and activity during the period","example":214},"totalVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of customer visits tracked in the date range","example":873},"tierDistribution":{"type":"array","items":{"type":"object","properties":{"tierName":{"type":"string","description":"Display name of the reward tier","example":"Gold"},"requiredVisits":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of visits required to achieve this tier","example":15},"accountCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of customer accounts at this tier level","example":48}},"required":["tierName","requiredVisits","accountCount"]},"description":"Distribution of customers across loyalty tiers (Bronze, Silver, Gold, etc.)"},"walletInstallation":{"type":"object","properties":{"googleInstalled":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of customer accounts with Google Wallet pass installed (tracked by first click on \"Add to Google Wallet\" button)","example":1287},"googlePercentage":{"type":"number","minimum":0,"maximum":100,"description":"Percentage of total accounts with Google Wallet installed (0-100, or 0 if total accounts = 0)","example":52.5},"appleInstalled":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of customer accounts with Apple Wallet pass installed (tracked by active device registrations)","example":934},"applePercentage":{"type":"number","minimum":0,"maximum":100,"description":"Percentage of total accounts with Apple Wallet installed (0-100, or 0 if total accounts = 0)","example":38.1},"combinedInstalled":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of distinct customer accounts with at least one wallet pass (Google OR Apple). Accounts with both passes are counted once.","example":2021},"combinedPercentage":{"type":"number","minimum":0,"maximum":100,"description":"Percentage of total accounts with at least one wallet pass (0-100, or 0 if total accounts = 0)","example":82.5},"totalAccounts":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total accounts in the application (the account table has no soft-delete, so every row is counted). Denominator for every percentage above.","example":2450}},"required":["googleInstalled","googlePercentage","appleInstalled","applePercentage","combinedInstalled","combinedPercentage","totalAccounts"],"description":"Digital wallet pass installation metrics (Google and Apple Wallet). Optional so that a newly deployed frontend can still parse responses from a backend rolling out this field; will become required once the backend is fully deployed."}},"required":["pointsInCirculation","pointsBurned","netCirculation","activeAccounts","totalVisits","tierDistribution"],"description":"Loyalty metrics for this application"}},"required":["applicationId","applicationName","metrics"]},"description":"Metrics for each loyalty-enabled application in the organization"}},"required":["organizationId","organizationName","applications"]},"DppMetricsByOrgDto":{"type":"object","properties":{"organizationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Organization UUID"},"organizationName":{"type":"string","description":"Organization display name"},"applications":{"type":"array","items":{"type":"object","properties":{"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application UUID"},"applicationName":{"type":"string","description":"Application display name"},"metrics":{"type":"object","properties":{"totalOwned":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of passports with an assigned owner (minted to an account)","example":1089},"totalMultiOwners":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of accounts that own more than one passport","example":89},"totalPassports":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of passport items for this application","example":1250},"totalAccounts":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of accounts for this application","example":342},"totalActiveUsers":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total number of distinct users with a wallet quota event in the date range","example":89},"trustScoreAverage":{"type":"integer","minimum":0,"maximum":100,"description":"Mean Trust Score (0–100, ADR 0093) of the application's model passports, a snapshot of the current catalogue that ignores the date range. Only computed when the request is scoped to one application (`applicationId`); null otherwise, and null when the application has no model passport.","example":54,"nullable":true},"trustScoreDimensions":{"type":"object","properties":{"completeness":{"type":"integer","minimum":0,"maximum":40,"description":"Mean points earned on the completeness dimension (share of the applicable fields filled in), out of its 40-point weight.","example":31},"richness":{"type":"integer","minimum":0,"maximum":20,"description":"Mean points earned on the richness dimension (extracted characteristics, saturating), out of its 20-point weight.","example":8},"signature":{"type":"integer","minimum":0,"maximum":40,"description":"Mean points earned on the signature dimension (certified passports), out of its 40-point weight.","example":15}},"required":["completeness","richness","signature"],"description":"How `trustScoreAverage` splits across the three dimensions of ADR 0093; the three always add up to `trustScoreAverage`. Null whenever `trustScoreAverage` is null.","nullable":true}},"required":["totalOwned","totalMultiOwners","totalPassports","totalAccounts","totalActiveUsers","trustScoreAverage","trustScoreDimensions"],"description":"DPP metrics for this application"}},"required":["applicationId","applicationName","metrics"]},"description":"Metrics for each DPP-enabled application in the organization"}},"required":["organizationId","organizationName","applications"]},"TrustMetricsDto":{"type":"object","properties":{"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application the metrics are scoped to. Trust audits track one application's product catalogue, so this is never aggregated across applications.","example":"550e8400-e29b-41d4-a716-446655440000"},"sampleSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of tracked products (audit subjects) currently `active` for this application — recruited, baseline captured, and re-audited weekly. This is the population `current`, `deltaSinceBaseline` and `series` are computed over. Subjects still awaiting their baseline, or archived, are excluded.","example":42},"quotaUsed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Non-archived audit subjects across the whole organization (all applications, including `baseline_pending`) — the same tally the recruitment quota is checked against. Wider than `sampleSize`: it is organization-scoped, not application-scoped, and it counts subjects not yet active.","example":57},"quotaLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Maximum non-archived audit subjects the organization may hold across all its applications before recruitment stops (`OrganizationQuotas.trustAuditLimit`, defaulting to 10 when the organization has no explicit override).","example":10},"current":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"required":["visibility","competitive","technicalReadiness","answerability","geo"],"description":"Per-axis mean, across every active subject, of that subject's most recent snapshot within the queried date range. An axis is null when no active subject has a snapshot inside the range — not the same as a score of 0.","example":{"visibility":62,"competitive":48,"technicalReadiness":71,"answerability":55,"geo":61}},"deltaSinceBaseline":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Mean, over active subjects that carry both a baseline snapshot and a snapshot within the queried range, of (latest geo score − baseline geo score). Subjects recruited without a captured baseline yet are excluded from the average, not treated as a zero movement. Null when no subject qualifies.","example":9,"nullable":true},"series":{"type":"array","items":{"type":"object","properties":{"weekStart":{"type":"string","format":"date","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])))$","description":"Monday (UTC, ISO week start) of the calendar week the snapshots below were audited in.","example":"2026-07-06"},"axes":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"required":["visibility","competitive","technicalReadiness","answerability","geo"],"description":"Per-axis mean of every snapshot audited during this week, across all active subjects that were audited that week.","example":{"visibility":60,"competitive":45,"technicalReadiness":70,"answerability":52,"geo":58}}},"required":["weekStart","axes"]},"description":"One entry per ISO week that had at least one audit in the queried range, oldest first. Weeks with no audit are omitted entirely — never zero-filled — since the audit cadence is weekly per subject and subjects are recruited on a rolling basis."}},"required":["applicationId","sampleSize","quotaUsed","quotaLimit","current","deltaSinceBaseline","series"]},"PaginatedPointOfSaleDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"organization":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the organization that owns this point of sale"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID reference to the Keyban application linked to this point of sale (optional)","nullable":true},"name":{"type":"string","description":"Display name of the point of sale (optional)","nullable":true},"zeltyRestaurantId":{"type":"number","description":"Zelty system restaurant identifier (optional)","nullable":true}},"required":["id","createdAt","updatedAt","organization"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"PointOfSaleDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"organization":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the organization that owns this point of sale"},"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID reference to the Keyban application linked to this point of sale (optional)","nullable":true},"name":{"type":"string","description":"Display name of the point of sale (optional)","nullable":true},"zeltyRestaurantId":{"type":"number","description":"Zelty system restaurant identifier (optional)","nullable":true}},"required":["id","createdAt","updatedAt","organization"]},"CreatePointOfSaleDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID reference to the Keyban application linked to this point of sale (optional)","nullable":true},"name":{"type":"string","description":"Display name of the point of sale (optional)","nullable":true},"zeltyRestaurantId":{"type":"number","description":"Zelty system restaurant identifier (optional)","nullable":true}}},"UpdatePointOfSaleDto":{"type":"object","properties":{"application":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID reference to the Keyban application linked to this point of sale (optional)","nullable":true},"name":{"type":"string","description":"Display name of the point of sale (optional)","nullable":true},"zeltyRestaurantId":{"type":"number","description":"Zelty system restaurant identifier (optional)","nullable":true}}},"WalletPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"Reference currency the caps are denominated in, as an ISO 4217 code (e.g. EUR, USD, JPY). Any code the rate oracle can quote works — no enum."},"maxAmountPerPaymentRef":{"type":"string","pattern":"^\\d+$","description":"Per-signature ceiling, expressed as a non-negative integer in the smallest sub-unit of the policy reference currency. Null = no cap.","nullable":true},"requireHumanAboveRef":{"type":"string","pattern":"^\\d+$","description":"Threshold (same encoding as maxAmountPerPaymentRef) above which evaluateIntent returns require_human. Null = never require human approval.","nullable":true},"volatilityMarginBps":{"type":"integer","minimum":0,"maximum":10000,"description":"Volatility tolerance in basis points (100 = 1%, max 10000 = 100%) applied when re-validating an already-approved intent against a freshly re-priced amount. Absorbs rate drift between the human approval and the signature: a retry is honored while the value stays within this margin of the approved value, otherwise it is re-escalated for a fresh human decision. Null/0 = strict (no tolerance).","nullable":true},"timezone":{"type":"string","description":"IANA time zone the budget windows are computed in (e.g. Europe/Paris). Null = UTC.","nullable":true},"maxAmountPerDayRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar day (in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no daily envelope.","nullable":true},"maxAmountPerWeekRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar week (Monday→Sunday, in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no weekly envelope.","nullable":true},"maxAmountPerMonthRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar month (in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no monthly envelope.","nullable":true},"emergencyStop":{"type":"boolean","description":"Per-wallet emergency stop (\"kill switch\"). When true, all payment requests for this wallet are denied until an operator releases it."}},"required":["id","createdAt","updatedAt","currency","emergencyStop"]},"UpsertWalletPolicyDto":{"type":"object","properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"Reference currency the caps are denominated in, as an ISO 4217 code (e.g. EUR, USD, JPY). Any code the rate oracle can quote works — no enum."},"maxAmountPerPaymentRef":{"type":"string","pattern":"^\\d+$","description":"Per-signature ceiling, expressed as a non-negative integer in the smallest sub-unit of the policy reference currency. Null = no cap.","nullable":true},"requireHumanAboveRef":{"type":"string","pattern":"^\\d+$","description":"Threshold (same encoding as maxAmountPerPaymentRef) above which evaluateIntent returns require_human. Null = never require human approval.","nullable":true},"volatilityMarginBps":{"type":"integer","minimum":0,"maximum":10000,"description":"Volatility tolerance in basis points (100 = 1%, max 10000 = 100%) applied when re-validating an already-approved intent against a freshly re-priced amount. Absorbs rate drift between the human approval and the signature: a retry is honored while the value stays within this margin of the approved value, otherwise it is re-escalated for a fresh human decision. Null/0 = strict (no tolerance).","nullable":true},"timezone":{"type":"string","description":"IANA time zone the budget windows are computed in (e.g. Europe/Paris). Null = UTC.","nullable":true},"maxAmountPerDayRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar day (in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no daily envelope.","nullable":true},"maxAmountPerWeekRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar week (Monday→Sunday, in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no weekly envelope.","nullable":true},"maxAmountPerMonthRef":{"type":"string","pattern":"^\\d+$","description":"Spend envelope over the current calendar month (in the policy timezone). Same encoding as maxAmountPerPaymentRef. Null = no monthly envelope.","nullable":true}},"required":["currency"],"additionalProperties":false},"WalletPolicyIntentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Canonical hash of the signing request the intent authorises. 0x-prefixed, 32-byte (64 hex chars). Unique per subject — the same hash is never re-signed (ADR-86 anti-replay).","example":"0xa3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1"},"kind":{"type":"string","description":"Payment kind label emitted by the payment extractor (opaque to the engine).","example":"usdc-transfer"},"recipient":{"type":"string","description":"Case-normalised (lowercased) recipient: an on-chain address for relay payments, or the seller host for x402.","example":"0x4f6e8b129fa2c1b3d5e7a9c0b2d4f6e8a0c2e4f6"},"resource":{"type":"string","description":"x402 resource the payment unlocks: seller host + path only (query string and fragment stripped, so no per-request secret is stored). Null for relay payments, which target an on-chain address rather than a URL.","example":"api.shop.example.com/premium/report","nullable":true},"asset":{"type":"string","description":"Asset symbol/label the amount is denominated in.","example":"USDC"},"amountNative":{"type":"string","pattern":"^\\d+$","description":"Raw transfer amount as a decimal integer string, in the asset's smallest unit (wei for ETH, base units for USDC).","example":"12500000"},"amountRef":{"type":"string","pattern":"^\\d+$","description":"Reference-currency value at intent creation, as a decimal integer string in centi-units of the policy currency (e.g. 1180 = 11.80).","example":"1180"},"approvedAmountRef":{"type":"string","pattern":"^\\d+$","description":"Reference value the human approved — the anchor a later re-validation tolerates volatility drift around (#4254). Null until the first decision.","example":"1180","nullable":true},"currentAmountRef":{"type":"string","pattern":"^\\d+$","description":"Reference value re-priced at read time (#4254), so a human deciding now judges the current worth, not the stale stored one. Present on reads that re-price; absent when not recomputed.","example":"1185","nullable":true},"state":{"type":"string","enum":["pending_human_approval","approved","declined","abandoned","consumed","expired","failed"],"description":"Lifecycle state: pending_human_approval → approved → consumed, or pending_human_approval → declined. Only consumed is terminal; declined is reversible.","example":"pending_human_approval"},"decidedAt":{"type":"string","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))$","description":"When a human approved or declined the intent (RFC 3339). Null while still pending.","example":"2026-06-17T14:32:00Z","nullable":true},"decidedBy":{"type":"string","description":"Account (email) of the human who approved or declined the intent, captured at decision time. Null for auto-approved intents (no human in the loop) or those still pending.","example":"jane.doe@example.com","nullable":true},"consumedAt":{"type":"string","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))$","description":"When the signature consumed the intent at /sign (RFC 3339). Null until executed.","example":"2026-06-17T14:33:10Z","nullable":true},"expiresAt":{"type":"string","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))$","description":"x402 EIP-3009 validBefore as a wall-clock instant (RFC 3339). Null for relay payments (no time window).","example":"2026-06-17T14:33:00Z","nullable":true},"events":{"default":[],"description":"Append-only lifecycle timeline, oldest first (#4254): one entry per decision point so a reviewer can see how the value moved across the intent → approval → signature window.","type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["created","human_approved","human_declined","agent_abandoned","revalidated","revalidation_required","consumed","expired","settlement_failed"],"description":"Lifecycle checkpoint this entry records (created, human decision, revalidation, or consumption).","example":"human_approved"},"amountRef":{"type":"string","pattern":"^\\d+$","description":"Reference-currency value priced at this checkpoint, as a decimal integer string in centi-units of the policy currency (same encoding as the intent amountRef).","example":"1180"},"at":{"type":"string","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))$","description":"When the checkpoint happened (RFC 3339), taken from the event row creation time.","example":"2026-06-17T14:32:00Z"}},"required":["kind","amountRef","at"]}}},"required":["id","createdAt","updatedAt","hash","kind","recipient","asset","amountNative","amountRef","state"]},"PolicyInputDto":{"type":"object","properties":{"channel":{"type":"string","enum":["relay","x402"]},"relay":{"type":"object","properties":{"chainId":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"account":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"nonce":{"type":"string","pattern":"^\\d+$"},"dest":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"value":{"type":"string","pattern":"^\\d+$"},"data":{"type":"string","pattern":"^0x[a-fA-F0-9]*$"}},"required":["chainId","account","nonce","dest","value","data"]},"x402":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"accountAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"maxValue":{"type":"string","pattern":"^\\d+$"},"chainId":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"method":{"type":"string"},"body":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["url","accountAddress"]},"clientHash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"capabilities":{"type":"array","items":{"type":"string"}}},"required":["channel"]},"PolicyDecisionDto":{"type":"object","properties":{"decision":{"type":"string","enum":["allow","deny","require_human"]},"reasons":{"type":"array","items":{"type":"string"}},"obligations":{"type":"array","items":{"type":"string"}},"intentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"x402Authorization":{"type":"object","properties":{"network":{"type":"string"},"scheme":{"type":"string"},"x402Version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"chainId":{"type":"string","pattern":"^\\d+$"},"asset":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"primaryType":{"type":"string","enum":["TransferWithAuthorization","ReceiveWithAuthorization"]},"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"authorization":{"type":"object","properties":{"from":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"to":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"value":{"type":"string","pattern":"^\\d+$"},"validAfter":{"type":"string","pattern":"^\\d+$"},"validBefore":{"type":"string","pattern":"^\\d+$"},"nonce":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"}},"required":["from","to","value","validAfter","validBefore","nonce"]},"accepted":{"type":"object","properties":{"scheme":{"type":"string"},"network":{"type":"string"},"amount":{"type":"string","pattern":"^\\d+$"},"asset":{"type":"string"},"payTo":{"type":"string"},"maxTimeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"extra":{"type":"object","additionalProperties":{}}},"required":["scheme","network","amount","asset","payTo","maxTimeoutSeconds"]}},"required":["network","scheme","x402Version","chainId","asset","primaryType","hash","authorization","accepted"]},"sponsored":{"type":"boolean"}},"required":["decision","reasons","obligations"]},"CancelIntentDto":{"type":"object","properties":{"intentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the in-flight intent the agent wants to abandon","example":"550e8400-e29b-41d4-a716-446655440000"}},"required":["intentId"]},"SponsoredSignatureDto_Output":{"type":"object","properties":{"signature":{"type":"string","pattern":"^0x([0-9a-fA-F]{2})+$","description":"EIP-3009 TransferWithAuthorization signature of the Keyban sponsor wallet, to send as the x402 payment payload signature","example":"0xababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab"}},"required":["signature"],"additionalProperties":false},"DestinationRuleDto_Output":{"type":"object","properties":{"scope":{"type":"string","enum":["organization","application","wallet"]},"scopeId":{"type":"string"},"mode":{"type":"string","enum":["allow","deny"]},"recipients":{"type":"array","items":{"type":"string"},"nullable":true},"domains":{"type":"array","items":{"type":"string"},"nullable":true}},"required":["scope","scopeId","mode","recipients","domains"],"additionalProperties":false},"UpsertDestinationRuleDto":{"type":"object","properties":{"mode":{"type":"string","enum":["allow","deny"],"description":"Whether the lists below are allow-lists (only these are permitted) or deny-lists (these are forbidden)."},"recipients":{"type":"array","items":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"EVM addresses (case-insensitive) gating relay/USDC transfers at this level. Null = relay not restricted here.","nullable":true},"domains":{"type":"array","items":{"type":"string","pattern":"^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$"},"description":"Bare domain names gating x402 payments at this level, normalized to lowercase. A domain also matches its sub-domains. Null = x402 not restricted here.","nullable":true}},"required":["mode"],"additionalProperties":false},"PaginatedX402ResourceDto_Output":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"resource":{"type":"string","description":"Absolute URL of the x402-protected service endpoint.","example":"https://x402.ottoai.services/crypto-news"},"serviceName":{"type":"string","description":"Human-friendly service name from the upstream directory.","example":"Otto AI","nullable":true},"description":{"type":"string","description":"Vendor-supplied description of what the service does.","example":"Real-time crypto market news with sentiment analysis.","nullable":true},"iconUrl":{"type":"string","description":"Absolute URL of the service icon.","example":"https://res.cloudinary.com/bdb-prod/image/upload/icon.png","nullable":true},"type":{"type":"string","description":"Resource transport type from the directory.","example":"http"},"x402Version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"x402 protocol version the service implements.","example":2},"tags":{"type":"array","items":{"type":"string"},"description":"Free-form keywords from the directory; drive tag filter + search.","example":["crypto news","market news"]},"networks":{"type":"array","items":{"type":"string"},"description":"Distinct CAIP-2 chain ids derived from accepts[].network; drives the network filter.","example":["eip155:8453"]},"accepts":{"type":"array","items":{"type":"object","properties":{"scheme":{"type":"string","description":"x402 payment scheme the service uses for this option.","example":"exact"},"network":{"type":"string","description":"CAIP-2 chain id the payment settles on.","example":"eip155:8453"},"amount":{"type":"string","description":"Price in the asset base units as a decimal string (preserves bigint precision). Divide by 10^assetDecimals for the human amount.","example":"1000"},"asset":{"type":"string","description":"ERC-20 token contract address used to pay.","example":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"payTo":{"type":"string","description":"Recipient address the payment is sent to.","example":"0x0E84dDEdAaE6A779c462C22a59F301EC31B6b808"},"maxTimeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Seconds the payer has to settle before the quote expires.","example":300}},"required":["scheme","network","amount","asset","payTo","maxTimeoutSeconds"],"additionalProperties":false},"description":"Payment options the service accepts (one per scheme/network/asset)."},"httpMethod":{"type":"string","description":"HTTP method the endpoint answers on, from the directory metadata. Probing a POST-only service with a GET never reaches its x402 middleware: it answers 404/405 instead of the payment terms.","example":"POST","nullable":true},"requestHint":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Vendor-supplied call hint (method, bodyType, example body, query and path params). The shape varies per service — treat it as an opaque hint, not a contract.","nullable":true},"quality":{"type":"object","properties":{"l30DaysTotalCalls":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Paid calls in the last 30 days (popularity signal).","example":1284,"nullable":true},"l30DaysUniquePayers":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct paying wallets in the last 30 days.","example":73,"nullable":true},"lastCalledAt":{"type":"string","description":"ISO 8601 timestamp of the most recent paid call.","example":"2026-06-24T13:19:49.520Z","nullable":true}},"additionalProperties":false,"description":"Usage/popularity stats from the directory. Null when unreported.","nullable":true},"source":{"type":"string","enum":["coinbase","orthogonal"],"description":"Upstream directory this entry is mirrored from.","example":"orthogonal"},"host":{"type":"string","description":"Lowercase host of `resource`; destination rules match on it.","example":"x402.orthogonal.com"},"via":{"type":"string","description":"Gateway that resells the provider and collects the payment (e.g. Orthogonal). Null when the provider is paid directly.","example":"Orthogonal","nullable":true},"priceVariable":{"type":"boolean","description":"True when the price is set per request rather than by the directory: `accepts` is then empty and x402_info gives the actual price.","example":false},"payable":{"type":"boolean","description":"Whether the service offers a payment scheme the Keyban agent wallet can settle (today: exact). Unpayable services are listed last.","example":true},"operation":{"type":"string","description":"Short endpoint label from the last path segments (gateway slug and version prefix dropped).","example":"people/count","nullable":true}},"required":["id","createdAt","updatedAt","resource","type","x402Version","tags","networks","accepts","source","host","priceVariable","payable"],"additionalProperties":false},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"],"additionalProperties":false},"X402ResourceDto_Output":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"resource":{"type":"string","description":"Absolute URL of the x402-protected service endpoint.","example":"https://x402.ottoai.services/crypto-news"},"serviceName":{"type":"string","description":"Human-friendly service name from the upstream directory.","example":"Otto AI","nullable":true},"description":{"type":"string","description":"Vendor-supplied description of what the service does.","example":"Real-time crypto market news with sentiment analysis.","nullable":true},"iconUrl":{"type":"string","description":"Absolute URL of the service icon.","example":"https://res.cloudinary.com/bdb-prod/image/upload/icon.png","nullable":true},"type":{"type":"string","description":"Resource transport type from the directory.","example":"http"},"x402Version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"x402 protocol version the service implements.","example":2},"tags":{"type":"array","items":{"type":"string"},"description":"Free-form keywords from the directory; drive tag filter + search.","example":["crypto news","market news"]},"networks":{"type":"array","items":{"type":"string"},"description":"Distinct CAIP-2 chain ids derived from accepts[].network; drives the network filter.","example":["eip155:8453"]},"accepts":{"type":"array","items":{"type":"object","properties":{"scheme":{"type":"string","description":"x402 payment scheme the service uses for this option.","example":"exact"},"network":{"type":"string","description":"CAIP-2 chain id the payment settles on.","example":"eip155:8453"},"amount":{"type":"string","description":"Price in the asset base units as a decimal string (preserves bigint precision). Divide by 10^assetDecimals for the human amount.","example":"1000"},"asset":{"type":"string","description":"ERC-20 token contract address used to pay.","example":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"payTo":{"type":"string","description":"Recipient address the payment is sent to.","example":"0x0E84dDEdAaE6A779c462C22a59F301EC31B6b808"},"maxTimeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Seconds the payer has to settle before the quote expires.","example":300}},"required":["scheme","network","amount","asset","payTo","maxTimeoutSeconds"],"additionalProperties":false},"description":"Payment options the service accepts (one per scheme/network/asset)."},"httpMethod":{"type":"string","description":"HTTP method the endpoint answers on, from the directory metadata. Probing a POST-only service with a GET never reaches its x402 middleware: it answers 404/405 instead of the payment terms.","example":"POST","nullable":true},"requestHint":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Vendor-supplied call hint (method, bodyType, example body, query and path params). The shape varies per service — treat it as an opaque hint, not a contract.","nullable":true},"quality":{"type":"object","properties":{"l30DaysTotalCalls":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Paid calls in the last 30 days (popularity signal).","example":1284,"nullable":true},"l30DaysUniquePayers":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct paying wallets in the last 30 days.","example":73,"nullable":true},"lastCalledAt":{"type":"string","description":"ISO 8601 timestamp of the most recent paid call.","example":"2026-06-24T13:19:49.520Z","nullable":true}},"additionalProperties":false,"description":"Usage/popularity stats from the directory. Null when unreported.","nullable":true},"source":{"type":"string","enum":["coinbase","orthogonal"],"description":"Upstream directory this entry is mirrored from.","example":"orthogonal"},"host":{"type":"string","description":"Lowercase host of `resource`; destination rules match on it.","example":"x402.orthogonal.com"},"via":{"type":"string","description":"Gateway that resells the provider and collects the payment (e.g. Orthogonal). Null when the provider is paid directly.","example":"Orthogonal","nullable":true},"priceVariable":{"type":"boolean","description":"True when the price is set per request rather than by the directory: `accepts` is then empty and x402_info gives the actual price.","example":false},"payable":{"type":"boolean","description":"Whether the service offers a payment scheme the Keyban agent wallet can settle (today: exact). Unpayable services are listed last.","example":true},"operation":{"type":"string","description":"Short endpoint label from the last path segments (gateway slug and version prefix dropped).","example":"people/count","nullable":true}},"required":["id","createdAt","updatedAt","resource","type","x402Version","tags","networks","accepts","source","host","priceVariable","payable"],"additionalProperties":false},"X402ServicesPageDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"resource":{"type":"string","description":"Absolute URL of the x402-protected service endpoint.","example":"https://x402.ottoai.services/crypto-news"},"serviceName":{"type":"string","description":"Human-friendly service name from the upstream directory.","example":"Otto AI","nullable":true},"description":{"type":"string","description":"Vendor-supplied description of what the service does.","example":"Real-time crypto market news with sentiment analysis.","nullable":true},"iconUrl":{"type":"string","description":"Absolute URL of the service icon.","example":"https://res.cloudinary.com/bdb-prod/image/upload/icon.png","nullable":true},"type":{"type":"string","description":"Resource transport type from the directory.","example":"http"},"x402Version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"x402 protocol version the service implements.","example":2},"tags":{"type":"array","items":{"type":"string"},"description":"Free-form keywords from the directory; drive tag filter + search.","example":["crypto news","market news"]},"networks":{"type":"array","items":{"type":"string"},"description":"Distinct CAIP-2 chain ids derived from accepts[].network; drives the network filter.","example":["eip155:8453"]},"accepts":{"type":"array","items":{"type":"object","properties":{"scheme":{"type":"string","description":"x402 payment scheme the service uses for this option.","example":"exact"},"network":{"type":"string","description":"CAIP-2 chain id the payment settles on.","example":"eip155:8453"},"amount":{"type":"string","description":"Price in the asset base units as a decimal string (preserves bigint precision). Divide by 10^assetDecimals for the human amount.","example":"1000"},"asset":{"type":"string","description":"ERC-20 token contract address used to pay.","example":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"payTo":{"type":"string","description":"Recipient address the payment is sent to.","example":"0x0E84dDEdAaE6A779c462C22a59F301EC31B6b808"},"maxTimeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Seconds the payer has to settle before the quote expires.","example":300}},"required":["scheme","network","amount","asset","payTo","maxTimeoutSeconds"]},"description":"Payment options the service accepts (one per scheme/network/asset)."},"httpMethod":{"type":"string","description":"HTTP method the endpoint answers on, from the directory metadata. Probing a POST-only service with a GET never reaches its x402 middleware: it answers 404/405 instead of the payment terms.","example":"POST","nullable":true},"requestHint":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Vendor-supplied call hint (method, bodyType, example body, query and path params). The shape varies per service — treat it as an opaque hint, not a contract.","nullable":true},"quality":{"type":"object","properties":{"l30DaysTotalCalls":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Paid calls in the last 30 days (popularity signal).","example":1284,"nullable":true},"l30DaysUniquePayers":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct paying wallets in the last 30 days.","example":73,"nullable":true},"lastCalledAt":{"type":"string","description":"ISO 8601 timestamp of the most recent paid call.","example":"2026-06-24T13:19:49.520Z","nullable":true}},"description":"Usage/popularity stats from the directory. Null when unreported.","nullable":true},"source":{"type":"string","enum":["coinbase","orthogonal"],"description":"Upstream directory this entry is mirrored from.","example":"orthogonal"},"host":{"type":"string","description":"Lowercase host of `resource`; destination rules match on it.","example":"x402.orthogonal.com"},"via":{"type":"string","description":"Gateway that resells the provider and collects the payment (e.g. Orthogonal). Null when the provider is paid directly.","example":"Orthogonal","nullable":true},"priceVariable":{"type":"boolean","description":"True when the price is set per request rather than by the directory: `accepts` is then empty and x402_info gives the actual price.","example":false},"payable":{"type":"boolean","description":"Whether the service offers a payment scheme the Keyban agent wallet can settle (today: exact). Unpayable services are listed last.","example":true},"operation":{"type":"string","description":"Short endpoint label from the last path segments (gateway slug and version prefix dropped).","example":"people/count","nullable":true},"authorized":{"type":"boolean","description":"True when the host passes the organization and application destination rules. A per-agent-wallet rule can still refuse a payment."},"orgRule":{"type":"string","enum":["allowed","denied","covered","none"],"description":"State of the organization destination rule for this host: listed as allowed or denied, decided by a broader domain entry (covered), or no organization rule (none).","example":"allowed"},"blockedByApplication":{"type":"boolean","description":"True when the application rule alone refuses this host."},"usage":{"type":"object","properties":{"agents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"]},"description":"Agent wallets of the application that paid this service this month."},"amountRef":{"type":"string","description":"Total paid this month, in centi-units of the application display currency.","example":"7810"}},"required":["agents","amountRef"],"description":"This month spend and agents; null when unused.","nullable":true}},"required":["id","createdAt","updatedAt","resource","type","x402Version","tags","networks","accepts","source","host","priceVariable","payable","authorized","orgRule","blockedByApplication","usage"]}},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"summary":{"type":"object","properties":{"catalogueTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of services in the whole x402 catalogue.","example":24545},"authorizedTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of catalogue services explicitly allowed by the organization rule; null when no allow rule applies.","example":12,"nullable":true},"gatewayProviders":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"description":"Distinct provider count per gateway (via), excluding the Coinbase directory.","example":{"Orthogonal":120}}},"required":["catalogueTotal","authorizedTotal","gatewayProviders"],"description":"Catalogue-wide counters, independent of the page filters."}},"required":["data","total","summary"]},"DppCharacteristicReviewDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Characteristic key (camelCase), as stored in `product.characteristics`.","example":"color"},"currentValue":{"description":"Value currently published in `product.characteristics`. Absent when the extraction is only parked in provenance (`suggested`/`conflict` without a source value)."},"provenance":{"description":"AI provenance of the characteristic. Absent for source data (badge « Structuré »).","type":"object","properties":{"source":{"type":"string","description":"Origin of the extraction. Only `ai` exists today (LLM extraction from the passport free text); source-data characteristics carry no provenance entry at all.","example":"ai","enum":["ai"]},"status":{"type":"string","enum":["verified","suggested","conflict"],"description":"Review status: `verified` = grounded in the source text and published to characteristics; `suggested` = not grounded, pending review; `conflict` = a different value already existed, pending arbitration.","example":"verified"},"value":{"description":"Extracted value awaiting review. Present only for `suggested` and `conflict` (a `verified` value lives in `product.characteristics`)."},"sourceTextHash":{"type":"string","description":"SHA-256 (hex) of the source text (name + description) at extraction time. Lets later runs detect that the text changed and the grounding is stale.","example":"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"},"extractedAt":{"type":"string","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))$","description":"RFC 3339 timestamp of the extraction.","example":"2026-07-13T12:00:00.000Z"}},"required":["source","status","sourceTextHash","extractedAt"]}},"required":["key"]}},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of review entries (published + parked characteristics).","example":12}},"required":["data","total"]},"PaginatedAuditSubjectsDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the audit subject (the tracked product), distinct from the UUID of the passport it wraps.","example":"550e8400-e29b-41d4-a716-446655440000"},"passportId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the DPP passport this subject tracks. A passport is tracked by at most one subject.","example":"6ba7b810-9dad-11d1-80b4-00c04fd430c8"},"productName":{"type":"string","description":"Commercial name of the tracked product, read live from the passport (not frozen at recruitment, unlike `category`).","example":"Recycled cotton hoodie"},"webPageUrl":{"type":"string","description":"Merchant product page (PDP) the audits crawl, read live from the passport. Never null in practice — a passport without a parsable URL is not recruited — but nullable to survive a passport edited after recruitment.","example":"https://shop.example/products/recycled-cotton-hoodie","nullable":true},"category":{"type":"string","description":"Product category the subject was classified under at recruitment time (`schemeID:code`), or `uncategorized` when the passport had none. Frozen: later edits to the passport category do not change it. Drives the stratified sampling across the catalogue.","example":"unspsc:53102400"},"language":{"type":"string","description":"ISO 639-1 code of the language the frozen audit prompts are written in, resolved at baseline from the merchant page (`<html lang>` cross-checked against the page text, product data as fallback). Null while `baseline_pending`, or when no signal allowed a decision.","example":"fr","nullable":true},"state":{"type":"string","enum":["baseline_pending","active","archived"],"description":"Lifecycle state: `baseline_pending` (recruited, T0 audit not captured yet, passport still held back as draft), `active` (T0 captured, passport live, re-audited weekly), `archived` (audits stopped, quota slot freed).","example":"active"},"recruitedAt":{"type":"string","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))$","description":"When the product was recruited as an audit subject (at its publish attempt).","example":"2026-06-24T10:00:00.000Z"},"baseline":{"type":"object","properties":{"auditedAt":{"type":"string","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))$","description":"When this snapshot was captured (audit run completion time), not when this response was generated.","example":"2026-07-01T08:00:00.000Z"},"geo":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Composite GEO (Generative Engine Optimization) score of this snapshot, the weighted combination of the four axes.","example":62}},"required":["auditedAt","geo"],"description":"The T0 snapshot (first audit, captured before the passport went live). Null while the subject is still `baseline_pending`.","nullable":true},"latest":{"type":"object","properties":{"auditedAt":{"type":"string","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))$","description":"When this snapshot was captured (audit run completion time), not when this response was generated.","example":"2026-07-01T08:00:00.000Z"},"geo":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Composite GEO (Generative Engine Optimization) score of this snapshot, the weighted combination of the four axes.","example":62}},"required":["auditedAt","geo"],"description":"Most recent snapshot (the baseline itself, or a later weekly re-audit). Null while the subject is still `baseline_pending`.","nullable":true},"delta":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"`latest.geo` minus `baseline.geo`. Null only when there is no baseline yet — a delta of 0 (no movement since T0) is a real, distinct value.","example":8,"nullable":true}},"required":["id","passportId","productName","webPageUrl","category","language","state","recruitedAt","baseline","latest","delta"]},"description":"Page of audit subjects for the requested application, most recently recruited first."},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total subjects recruited for the application, independent of `limit`/`offset`.","example":42},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Page size applied (echo of the request).","example":20},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of subjects skipped before this page (echo of the request).","example":0}},"required":["data","total","limit","offset"]},"AuditSubjectDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the audit subject (the tracked product), distinct from the UUID of the passport it wraps.","example":"550e8400-e29b-41d4-a716-446655440000"},"passportId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the DPP passport this subject tracks. A passport is tracked by at most one subject.","example":"6ba7b810-9dad-11d1-80b4-00c04fd430c8"},"productName":{"type":"string","description":"Commercial name of the tracked product, read live from the passport (not frozen at recruitment, unlike `category`).","example":"Recycled cotton hoodie"},"webPageUrl":{"type":"string","description":"Merchant product page (PDP) the audits crawl, read live from the passport. Never null in practice — a passport without a parsable URL is not recruited — but nullable to survive a passport edited after recruitment.","example":"https://shop.example/products/recycled-cotton-hoodie","nullable":true},"category":{"type":"string","description":"Product category the subject was classified under at recruitment time (`schemeID:code`), or `uncategorized` when the passport had none. Frozen: later edits to the passport category do not change it. Drives the stratified sampling across the catalogue.","example":"unspsc:53102400"},"language":{"type":"string","description":"ISO 639-1 code of the language the frozen audit prompts are written in, resolved at baseline from the merchant page (`<html lang>` cross-checked against the page text, product data as fallback). Null while `baseline_pending`, or when no signal allowed a decision.","example":"fr","nullable":true},"state":{"type":"string","enum":["baseline_pending","active","archived"],"description":"Lifecycle state: `baseline_pending` (recruited, T0 audit not captured yet, passport still held back as draft), `active` (T0 captured, passport live, re-audited weekly), `archived` (audits stopped, quota slot freed).","example":"active"},"recruitedAt":{"type":"string","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))$","description":"When the product was recruited as an audit subject (at its publish attempt).","example":"2026-06-24T10:00:00.000Z"},"baseline":{"type":"object","properties":{"auditedAt":{"type":"string","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))$","description":"When this snapshot was captured (audit run completion time), not when this response was generated.","example":"2026-07-01T08:00:00.000Z"},"geo":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Composite GEO (Generative Engine Optimization) score of this snapshot, the weighted combination of the four axes.","example":62}},"required":["auditedAt","geo"],"description":"The T0 snapshot (first audit, captured before the passport went live). Null while the subject is still `baseline_pending`.","nullable":true},"latest":{"type":"object","properties":{"auditedAt":{"type":"string","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))$","description":"When this snapshot was captured (audit run completion time), not when this response was generated.","example":"2026-07-01T08:00:00.000Z"},"geo":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Composite GEO (Generative Engine Optimization) score of this snapshot, the weighted combination of the four axes.","example":62}},"required":["auditedAt","geo"],"description":"Most recent snapshot (the baseline itself, or a later weekly re-audit). Null while the subject is still `baseline_pending`.","nullable":true},"delta":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"`latest.geo` minus `baseline.geo`. Null only when there is no baseline yet — a delta of 0 (no movement since T0) is a real, distinct value.","example":8,"nullable":true},"snapshots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of this snapshot.","example":"9a5e8c6e-2b1a-4a3e-8c5a-2f6d1e9b0a3c"},"kind":{"type":"string","enum":["baseline","scheduled"],"description":"`baseline`: the T0, captured before go-live, at most one per subject. `scheduled`: a later weekly re-audit.","example":"scheduled"},"visibility":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Visibility axis (0-100): how often and how highly the product surfaces in generative-engine answers for its frozen queries.","example":55},"competitive":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Competitive axis (0-100): the product's share of visibility relative to the competitor domains found on the same queries.","example":40},"technicalReadiness":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Technical-readiness axis (0-100): page exploitability by crawlers/agents (passing technical checks minus missing schema.org markup).","example":70},"answerability":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Answerability axis (0-100): how well the page content pre-answers buyer questions (specs, reviews, FAQ, comparisons).","example":58},"geo":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Composite GEO score (0-100), the weighted combination of the four axes above.","example":61},"sources":{"type":"array","items":{"type":"string","enum":["firecrawl","exa"]},"description":"External engines that actually served this audit. An engine down at audit time is simply absent here rather than failing the audit, as long as at least one engine answered each query.","example":["firecrawl","exa"]},"auditedAt":{"type":"string","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))$","description":"When this snapshot was captured.","example":"2026-07-01T08:00:00.000Z"}},"required":["id","kind","visibility","competitive","technicalReadiness","answerability","geo","sources","auditedAt"]},"description":"Every snapshot ever captured for this subject (the baseline plus every weekly re-audit since), oldest first."},"details":{"type":"object","properties":{"queries":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":3,"maxLength":200,"description":"Purchase-intent prompt, phrased as a shopper would ask an AI assistant, frozen at recruitment so weekly scores stay comparable.","example":"Quelle canne à carpe choisir pour débuter, autour de 3,60 m ?"},"intent":{"type":"string","enum":["category","brand","comparison","problem","quality","origin","warranty","certification"],"description":"Shopping intent family the query covers. One query per family max, frozen at recruitment. Generic purchase intents: `category` (the product type or use case), `brand` (this brand specifically), `comparison` (this product against alternatives), `problem` (a need the product solves). Proof-seeking intents — where certified product data has a chance to weigh: `quality` (proven quality or reliability), `origin` (provenance, made-in), `warranty` (guarantee, after-sales), `certification` (certified or verified product claims).","example":"certification"},"ranks":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"description":"Rank of the tracked product in each engine that answered this query (null = the engine answered but the product domain was absent from its results). An engine missing from this object did not answer the query at all.","example":{"firecrawl":2,"exa":null}},"visibility":{"description":"Visibility score (0-100) this single query earned: 100 when the product ranked in the top 3, 50 in the top 10, 0 beyond. The snapshot `visibility` axis is the mean of these. Absent on snapshots captured before per-query scores were recorded.","example":100,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"competitive":{"description":"Competitive score (0-100) this single query earned: the product's rank weight divided by the summed rank weights of every domain seen on the query. The snapshot `competitive` axis is the mean of these. Absent on snapshots captured before per-query scores were recorded.","example":42,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"top":{"description":"The three best-ranked domains on this query, the tracked product included when it made the cut, merged across engines by best rank (ties broken alphabetically). Absent on snapshots captured before leaders were recorded.","type":"array","items":{"type":"object","properties":{"domain":{"type":"string","description":"Domain of one of the best-ranked results, the audited product's own domain included when it made the cut.","example":"competitor-brand.example"},"rank":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Best rank the domain reached on this query across the engines that answered it.","example":1}},"required":["domain","rank"]}}},"required":["text","intent","ranks"]},"description":"Per-query results for the frozen query set, one entry per query."},"competitors":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string","description":"Competitor domain (distinct from the subject own domain) seen in at least one query result.","example":"competitor-brand.example"},"bestRank":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Best (lowest) rank this domain achieved across all queries.","example":1},"queries":{"type":"array","items":{"type":"string"},"description":"Query texts where this competitor domain appeared.","example":["meilleur sweat en coton recyclé"]}},"required":["domain","bestRank","queries"]},"description":"Competitor domains found across the query set, capped to the 15 best-ranked, sorted by best rank first."},"pageChecks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable identifier of the technical check.","example":"has-title"},"status":{"type":"string","enum":["pass","warn","fail"],"description":"Outcome of the check: `pass` (no issue), `warn` (suboptimal but not disqualifying), `fail` (missing or broken).","example":"pass"}},"required":["id","status"]},"description":"Individual technical-readiness checks run against the product page, backing the `technicalReadiness` axis."},"answerabilitySignals":{"type":"object","additionalProperties":{"type":"boolean"},"description":"Individual content signals detected on the page (e.g. presence of specs, reviews, FAQ), backing the `answerability` axis.","example":{"hasFaq":true,"hasAggregateRating":false}},"recommendations":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"string","enum":["high","medium","low"],"description":"Urgency of the recommended fix.","example":"high"},"action":{"type":"string","description":"Human-readable action to take.","example":"Add a meta description tag to the page."}},"required":["priority","action"]},"description":"Suggested actions to improve the score, derived from the failed/warned checks and missing answerability signals. Capped to the 5 most urgent."}},"required":["queries","competitors","pageChecks","answerabilitySignals","recommendations"],"description":"Raw audit material (per-query ranks, competitors, technical checks, recommendations) of the most recent snapshot only — not repeated for every historical snapshot in `snapshots`. Null when the subject has no snapshot yet.","nullable":true}},"required":["id","passportId","productName","webPageUrl","category","language","state","recruitedAt","baseline","latest","delta","snapshots","details"]},"AuditPromptRankingDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":3,"maxLength":200,"description":"Purchase-intent prompt, phrased as a shopper would ask an AI assistant, frozen at recruitment so weekly scores stay comparable.","example":"Quelle canne à carpe choisir pour débuter, autour de 3,60 m ?"},"intent":{"type":"string","enum":["category","brand","comparison","problem","quality","origin","warranty","certification"],"description":"Shopping intent family the query covers. One query per family max, frozen at recruitment. Generic purchase intents: `category` (the product type or use case), `brand` (this brand specifically), `comparison` (this product against alternatives), `problem` (a need the product solves). Proof-seeking intents — where certified product data has a chance to weigh: `quality` (proven quality or reliability), `origin` (provenance, made-in), `warranty` (guarantee, after-sales), `certification` (certified or verified product claims).","example":"certification"},"subjectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the audit subject the prompt belongs to.","example":"550e8400-e29b-41d4-a716-446655440000"},"passportId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the DPP passport of the audited product.","example":"6ba7b810-9dad-11d1-80b4-00c04fd430c8"},"productName":{"type":"string","description":"Commercial name of the audited product.","example":"Recycled cotton hoodie"},"visibility":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Visibility score (0-100) the prompt earned in the latest audit: 100 when the product ranked in the top 3, 50 in the top 10, 0 beyond.","example":100},"competitive":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Competitive score (0-100) the prompt earned in the latest audit: the product's rank weight against every domain seen on the prompt.","example":42},"bestRank":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Best (lowest) rank the product achieved on this prompt across the engines that answered it. Null when no engine surfaced the product at all.","example":2,"nullable":true},"leader":{"type":"object","properties":{"domain":{"type":"string","description":"Domain ranked first on this prompt across the engines that answered it.","example":"competitor-brand.example"},"isSelf":{"type":"boolean","description":"True when the tracked product itself holds the first place.","example":false}},"required":["domain","isSelf"],"description":"Who holds the first place on this prompt. The tracked product itself whenever its best rank across the engines ties the best rank seen — the same reading as `bestRank` — otherwise the best-ranked competitor. Null when the snapshot predates leader tracking or when no engine returned a result.","nullable":true},"auditedAt":{"type":"string","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))$","description":"When the snapshot carrying these results was captured.","example":"2026-08-31T08:00:00.000Z"}},"required":["text","intent","subjectId","passportId","productName","visibility","competitive","bestRank","leader","auditedAt"]},"description":"Prompts of the latest snapshot of every active subject, best-performing first (visibility, then competitive). Capped by `limit`."},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total prompts available across the latest snapshots, independent of `limit`/`offset`.","example":126},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Page size applied (echo of the request).","example":10},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of prompts skipped before this page (echo of the request).","example":0}},"required":["data","total","limit","offset"]},"AuditRecommendationsDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"string","enum":["high","medium","low"],"description":"Urgency of the recommended fix.","example":"high"},"action":{"type":"string","description":"Human-readable action to take.","example":"Add a meta description tag to the page."},"subjects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the audit subject (the tracked product), distinct from the UUID of the passport it wraps.","example":"550e8400-e29b-41d4-a716-446655440000"},"passportId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the DPP passport this subject tracks. A passport is tracked by at most one subject.","example":"6ba7b810-9dad-11d1-80b4-00c04fd430c8"},"productName":{"type":"string","description":"Commercial name of the tracked product, read live from the passport (not frozen at recruitment, unlike `category`).","example":"Recycled cotton hoodie"},"webPageUrl":{"type":"string","description":"Merchant product page (PDP) the audits crawl, read live from the passport. Never null in practice — a passport without a parsable URL is not recruited — but nullable to survive a passport edited after recruitment.","example":"https://shop.example/products/recycled-cotton-hoodie","nullable":true},"category":{"type":"string","description":"Product category the subject was classified under at recruitment time (`schemeID:code`), or `uncategorized` when the passport had none. Frozen: later edits to the passport category do not change it. Drives the stratified sampling across the catalogue.","example":"unspsc:53102400"},"geo":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Composite GEO score of the latest snapshot of the product, the audit that flagged this recommendation.","example":58}},"required":["id","passportId","productName","webPageUrl","category","geo"]},"description":"Active tracked products whose latest audit flagged this action, sorted by product name."}},"required":["priority","action","subjects"]},"description":"Every action flagged by the latest audit of at least one active tracked product, highest priority first, then most impacted products first. Not paginated: the rule catalogue bounds the list."},"auditedSubjects":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of active tracked products with at least one audit — the population each `subjects` list is drawn from.","example":42}},"required":["data","auditedSubjects"]},"WebhookEndpointListDto":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (tenant) that owns this endpoint.","example":"550e8400-e29b-41d4-a716-446655440000"},"url":{"type":"string","format":"uri","description":"HTTPS URL that receives the deliveries.","example":"https://api.example.com/hooks/keyban"},"eventTypes":{"type":"array","items":{"type":"string","enum":["dpp.passport.created","dpp.passport.updated","dpp.passport.published"]},"description":"Event types this endpoint is subscribed to.","example":["dpp.passport.updated"]},"enabled":{"type":"boolean","description":"Whether deliveries are currently sent to this endpoint.","example":true}},"required":["id","createdAt","updatedAt","applicationId","url","eventTypes","enabled"]},"description":"Array of items for the current page"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Total count of items matching the query"}},"required":["data","total"]},"CreateWebhookEndpointDto":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Absolute HTTPS URL that receives the POST deliveries. HTTP is rejected; private, loopback and link-local hosts and cloud metadata endpoints are blocked server-side (SSRF protection).","example":"https://api.example.com/hooks/keyban"},"eventTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["dpp.passport.created","dpp.passport.updated","dpp.passport.published"]},"description":"Event types this endpoint subscribes to. A delivery is sent only when the event type is in this list.","example":["dpp.passport.created","dpp.passport.updated"]},"enabled":{"type":"boolean","description":"When false, no delivery is sent — the endpoint (and its secrets) are kept so it can be re-enabled later.","example":true}},"required":["url","eventTypes","enabled"]},"WebhookEndpointWithSecretDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (tenant) that owns this endpoint.","example":"550e8400-e29b-41d4-a716-446655440000"},"url":{"type":"string","format":"uri","description":"HTTPS URL that receives the deliveries.","example":"https://api.example.com/hooks/keyban"},"eventTypes":{"type":"array","items":{"type":"string","enum":["dpp.passport.created","dpp.passport.updated","dpp.passport.published"]},"description":"Event types this endpoint is subscribed to.","example":["dpp.passport.updated"]},"enabled":{"type":"boolean","description":"Whether deliveries are currently sent to this endpoint.","example":true},"secret":{"type":"string","description":"Standard Webhooks signing secret (`whsec_<base64>`). Returned ONCE at creation or rotation and never again — store it now. The receiver verifies the `webhook-signature` header with it (e.g. the `standardwebhooks` library).","example":"whsec_MfKQ9rG3xX0m9V2s1qv4b7Yc8d0e2f4g"}},"required":["id","createdAt","updatedAt","applicationId","url","eventTypes","enabled","secret"]},"UpdateWebhookEndpointDto":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Absolute HTTPS URL that receives the POST deliveries. HTTP is rejected; private, loopback and link-local hosts and cloud metadata endpoints are blocked server-side (SSRF protection).","example":"https://api.example.com/hooks/keyban"},"eventTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["dpp.passport.created","dpp.passport.updated","dpp.passport.published"]},"description":"Event types this endpoint subscribes to. A delivery is sent only when the event type is in this list.","example":["dpp.passport.created","dpp.passport.updated"]},"enabled":{"type":"boolean","description":"When false, no delivery is sent — the endpoint (and its secrets) are kept so it can be re-enabled later.","example":true}},"required":["url","eventTypes","enabled"]},"WebhookEndpointDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Entity UUID"},"createdAt":{"type":"string","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))$","description":"Creation date (ISO 8601)"},"updatedAt":{"type":"string","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))$","description":"Last update date (ISO 8601)"},"applicationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Application (tenant) that owns this endpoint.","example":"550e8400-e29b-41d4-a716-446655440000"},"url":{"type":"string","format":"uri","description":"HTTPS URL that receives the deliveries.","example":"https://api.example.com/hooks/keyban"},"eventTypes":{"type":"array","items":{"type":"string","enum":["dpp.passport.created","dpp.passport.updated","dpp.passport.published"]},"description":"Event types this endpoint is subscribed to.","example":["dpp.passport.updated"]},"enabled":{"type":"boolean","description":"Whether deliveries are currently sent to this endpoint.","example":true}},"required":["id","createdAt","updatedAt","applicationId","url","eventTypes","enabled"]}}},"security":[{"X-Api-Key":[]}]}