- OIDC:
GET /userinfo - REST API:
GET /verifications/{id}/userinfo
Provenance (shape)
Copy
type ProvenanceShape = {
presentation: {
channel?: {
type: 'centralized_idp' | 'chip_based' | 'wallet' | string
transport: 'internet' | 'nfc' | 'ble' | 'qr_code' | string
}
credentials: Array<{
type: string // providerId used when starting the verification (e.g., smartid, bankidse)
issuer?: { id: string; authority_name?: string; is_government?: boolean }
claims: Record<string, unknown>
evidence?: {
token?: Record<string, unknown>
names?: string // semicolon-delimited list of keys present under token
}
}>
}
_metadata: { verification_id: string; verified_at?: string }
}
Learn more: Provenance
Copy & Paste Types
- TypeScript
- Go
- C#
- Java
Copy
export interface Proof {
presentation: Presentation
_metadata: Metadata
}
export interface Presentation {
channel?: Channel
credentials: Credential[]
}
export interface Channel {
type: 'centralized_idp' | 'chip_based' | 'wallet' | string
transport: 'internet' | 'nfc' | 'ble' | 'qr_code' | string
}
export interface Credential {
type: string // providerId used when starting the verification (e.g., smartid, bankidse)
issuer?: Issuer
claims: Record<string, unknown>
evidence?: Evidence // may or may not be present
}
export interface Issuer {
id: string
authority_name?: string
is_government?: boolean
}
export interface Evidence {
token?: Record<string, unknown>
names?: string // semicolon-delimited list of keys under token
}
export interface Metadata {
verification_id: string
verified_at?: string // ISO8601
}
Copy
package models
type Proof struct {
Presentation Presentation `json:"presentation"`
Metadata Metadata `json:"_metadata"`
}
type Presentation struct {
Channel *Channel `json:"channel,omitempty"`
Credentials []Credential `json:"credentials"`
}
type Channel struct {
Type string `json:"type"`
Transport string `json:"transport"`
}
type Credential struct {
Type string `json:"type"` // providerId used when starting the verification (e.g., smartid, bankidse)
Issuer *Issuer `json:"issuer,omitempty"`
Claims map[string]any `json:"claims"`
Evidence *Evidence `json:"evidence,omitempty"`
}
type Issuer struct {
ID string `json:"id"`
AuthorityName string `json:"authority_name,omitempty"`
IsGovernment *bool `json:"is_government,omitempty"`
}
type Evidence struct {
Token map[string]any `json:"token,omitempty"` // provider-supplied key/value pairs
Names string `json:"names,omitempty"` // semicolon-delimited key list
}
type Metadata struct {
VerificationID string `json:"verification_id"`
VerifiedAt string `json:"verified_at,omitempty"`
}
Copy
using System.Collections.Generic;
using System.Text.Json.Serialization;
public class Proof {
[JsonPropertyName("presentation")] public Presentation Presentation { get; set; } = default!;
[JsonPropertyName("_metadata")] public Metadata Metadata { get; set; } = default!;
}
public class Presentation {
[JsonPropertyName("channel")] public Channel? Channel { get; set; }
[JsonPropertyName("credentials")] public List<Credential> Credentials { get; set; } = new();
}
public class Channel {
[JsonPropertyName("type")] public string? Type { get; set; }
[JsonPropertyName("transport")] public string? Transport { get; set; }
}
public class Credential {
[JsonPropertyName("type")] public string Type { get; set; } = default!; // providerId used when starting the verification (e.g., smartid, bankidse)
[JsonPropertyName("issuer")] public Issuer? Issuer { get; set; }
[JsonPropertyName("claims")] public Dictionary<string, object>? Claims { get; set; }
[JsonPropertyName("evidence")] public Evidence? Evidence { get; set; } // may or may not be present
}
public class Issuer {
[JsonPropertyName("id")] public string Id { get; set; } = default!;
[JsonPropertyName("authority_name")] public string? AuthorityName { get; set; }
[JsonPropertyName("is_government")] public bool? IsGovernment { get; set; }
}
public class Evidence {
[JsonPropertyName("token")] public Dictionary<string, object>? Token { get; set; } // provider-supplied key/value pairs
[JsonPropertyName("names")] public string? Names { get; set; } // semicolon-delimited key list
}
public class Metadata {
[JsonPropertyName("verification_id")] public string VerificationId { get; set; } = default!;
[JsonPropertyName("verified_at")] public string? VerifiedAt { get; set; }
}
Copy
import java.util.List;
import java.util.Map;
public class Proof {
public Presentation presentation;
public Metadata _metadata;
}
public class Presentation {
public Channel channel;
public List<Credential> credentials;
}
public class Channel {
public String type; // centralized_idp | chip_based | wallet | string
public String transport; // internet | nfc | ble | qr_code | string
}
public class Credential {
public String type; // providerId used when starting the verification (e.g., smartid, bankidse)
public Issuer issuer;
public Map<String, Object> claims; // Raw upstream provider claims
public Evidence evidence; // May or may not be present
}
public class Issuer {
public String id; // e.g., urn:hopae:issuer:ee:smartid
public String authority_name;
public Boolean is_government;
}
public class Evidence {
public Map<String, Object> token; // Provider-supplied key/value pairs
public String names; // Semicolon-delimited list of keys under token
}
public class Metadata {
public String verification_id;
public String verified_at; // ISO8601
}
Notes
- Issuer and claims can vary by credential type; treat unknown fields as opaque.

