PingOne Credentials
Verifiable credentials are cryptographically secure digital proofs containing any identity data, issued to users’ biometrically secured device wallets. They contain important information about the issuer, who it was issued to, specific identity attributes, and expiration, ensuring the provenance of the credential and a chain of trust. Verifiable credentials are used for any data that necessitates real-time verification.
Use the Credentials service to create custom verifiable credentials for users. The resulting credentials can then be shared with compatible wallet apps. The Credentials service enables you to:
-
Revoke credentials or expire credentials issued to PingOne users
Credential Issuers
Use the Credential Issuers operations to retrieve or update the credential issuer information. A credential issuer profile, which enables issuance of credentials, is automatically created when the credential service is added to an environment.
Credential Issuers data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
applicationInstance.id |
String | N/A | Read-only | Identifier (UUID) of the application instance registered with the PingOne platform service. This enables the client to send messages to the service. |
createdAt |
DateTime | N/A | Read-only | Date and time the issuer profile was created. |
id |
String | N/A | Read-only | Identifier (UUID) of the credential issuer. |
logo |
String | Optional | Mutable | A URI containing the logo for the issuer. Restricted to a valid URL with a scheme of https: or a scheme of data: with a base64-encoded image. Included in credentials issued. |
name |
String | Required | Immutable | The name of the credential issuer. Included in credentials issued. |
siteUrl |
String | Optional | Mutable | URL, chosen by the issuer, that references the issuer in issued credentials. |
updatedAt |
DateTime | N/A | Read-only | Date and time the credential issuer profile was last updated; can be null. |
The logo and name can be shown to the user when indicating the credential issuer by the wallet app using using the PingOne Neo Native SDKs with getIssuerMetadata for Android and getCredentialIssuerMetadataFromClaim(_:) for iOS.
Response codes
| Code | Message |
|---|---|
| 200 | Successful operation. |
| 400 | The request could not be completed. |
| 401 | You do not have access to this resource. |
| 403 | You do not have permissions or are not licensed to make this request. |
| 404 | The requested resource was not found. |
| 500 | Unexpected server error. |
Read Credential Issuer Profile
Update Credential Issuer Profile
Credential Types
Use the Credentials Types operations to create, read, and update the credential types used by compatible wallet apps.
Versioning
If the updated credential type differs from the existing credential type, the service saves the existing credential type as a Credential Type Version and increments version.number in the updated credential type. Credential Type Versions can be read with Read All Credential Type Versions.
Automatic deletion and revocation
Typical behavior for credential types is to automatically revoke user credentials when a credential type, user, or environment is deleted. However, some credential types, such as birth certificates, university degrees, or marriage certificates, should never be automatically revoked even if the user or environment is deleted. You control this using onDelete.revokeIssuedCredentials on the credential type.
The selected deletion and revocation behavior cascades over all resources managed by the service: credential types, issuance rules, staged changes, digital wallet applications, digital wallets, and user credentials.
Environment deleted:
-
Delete all credential types
-
Delete all issuance rules
-
Delete all staged changes
-
Delete all digital wallet applications
-
Delete all digital wallets
-
Delete all user credentials
-
Delete all provisioned credentials
-
Delete all credential type counts
-
Delete environment credential count
Population deleted:
- Remove population from existing issuance rules
Group deleted:
- Remove group from existing issuance rules
User deleted:
-
Delete user credential
-
Delete digital wallets
Application (associated with digital wallet applications) deleted:
- No impact
Credential type deleted:
-
Revoke issued credentials based on delete flag
-
Delete issuance rule
Issuance rule deleted
- Delete staged changes
Digital wallet application deleted:
- Disable digital wallets that are of this type
Digital wallet deleted:
- Revoke credentials that were provisioned to the digital wallet based on credential type delete flag
User credential deleted:
- Revoke provisioned credentials based on credential type delete flag
Regardless of the setting of onDelete.revokeIssuedCredentials, the service always deletes any pending credentials. (Pending credentials are staged for issue but not provisioned to a wallet because no paired digital wallet exists.)
Credential schema
When the service creates a credential from a credential type, it maintains the full credential schema, including attributes without corresponding values in the Create a User Credential request, so that the credential structure is consistent and predictable. It assigns an empty string ("") to any attribute without a value in the request body.
Credential Types data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
cardDesignTemplate |
String | Required | Immutable | An SVG formatted image containing placeholders for the credentials fields that need to be displayed in the image. Refer to warning following this table. Not returned with Read All Credential Types. You must Read One Credential Type with the id of the credential type you want to review. |
cardType |
String | Optional | Mutable | A descriptor of the credential type. Can be non-identity types such as proof of employment or proof of insurance. |
createdAt |
DateTime | N/A | Read-only | Date and time the credential type was created. |
deletedAt |
DateTime | N/A | Read-only | Date and time the credential type was deleted. Returned only with Read One Credential Type. |
description |
String | Optional | Mutable | A description of the credential type. |
environment.id |
String | N/A | Read-only | PingOne environment identifier (UUID) in which the credential type exists. |
expiration |
Object | Optional | Mutable | Object that identifies how to evaluate the expiration date. Requires one and only one of after, timestamp, or expression. Permitted only when management.mode is AUTOMATED. |
expiration.after |
Object | Required/Optional | Mutable | Contains the numeric duration and its time unit for calculating an expiration date. |
expiration.after.duration |
Integer | Required | Mutable | Length of time before transaction timeout expires; range is from a 1 hour minimum (or equivalent) to an (effectively) unbounded maximum. |
expiration.after.timeUnit |
String | Required | Mutable | Time unit of transaction timeout; can be SECONDS, MINUTES, HOURS, or DAYS. |
expiration.expression |
String | Required/Optional | Mutable | PingOne Expression Language (PEL) expression that evaluates to an ISO 8601 date. For more information on PEL, refer to PingOne expression language. |
expiration.fieldName |
String | Required/Optional | Mutable | On issuance, name of the field in the credential to hold the expiration that, when evaluated, returns an expiration date. Must be unique from all fields defined in the metadata object of Create Credential Type. Required when expiration.type is SOFT. Optional when expiration.type is HARD and ignored if used. |
expiration.timestamp |
DateTime | Required/Optional | Mutable | The date and time to expire in ISO 8601 YYYY-MM-DDTHH:MM:SS.sssZ format (milliseconds optional). |
expiration.type |
String | Required | Mutable | Indicates how expiration of the credential is presented. Can be SOFT or HARD. A SOFT expiration appears as a user-defined field (named in fieldName) in the credential but returns no expiration date in Read One User Credential. A HARD expiration appears as a standards-based expiration field in the credential and returns an expiration date in Read One User Credential. |
id |
String | N/A | Read-only | Identifier (UUID) associated with the credential type. |
issuer.id |
String | N/A | Read-only | The identifier (UUID) of the issuer. |
issuerName |
String | Optional | Mutable | Issuer name associated with the card, can differ from title. |
management.mode |
String | Optional | Mutable | Management mode of the credential type. Can be AUTOMATED (the default) or MANAGED. Refer to the note following this table. |
metadata |
Object | Required | Mutable | Contains the names, data types, and other metadata related to the credential; refer to metadata object data model. |
multiple |
Object | Optional | Mutable | Object containing directives that enable you to Issue multiple credentials to a user based on a directory attribute. |
multiple.expression |
String | Required | Mutable | A PingOne Expression Language (PEL) expression that evaluates to a number or array. If an array, calculates the array length for the count. Populates the limit to a variable, __ITERATOR__, available to PEL expressions in metadata.fields.attribute. |
onDelete.revokeIssuedCredentials |
Boolean | Optional | Mutable | Whether user credentials are automatically revoked when a credential type, user, or environment is deleted. Defaults to true. For credential types (such as birth certificates, university degrees, or marriage certificates) that should never be automatically revoked even if the user or environment is deleted, set this to false. |
title |
String | Required | Immutable | Title of the credential. Verification sites are expected to be able to request the issued credential from the compatible wallet app using the title. |
updatedAt |
DateTime | N/A | Read-only | Date and time the credential type was last updated; can be null. |
version.id |
String | N/A | Read-only | Identifier (UUID) of this version of the credential type. The service assigns identifiers. |
version.number |
Integer | N/A | Read-only | Version of this credential type. The service assigns versions. |
version.uri |
String | N/A | Read-only | A URI to of this version of the credential type. The service assigns URIs. |
If management.mode is AUTOMATED, the credential type is only issued by its associated credential issuance rule. If management.mode is MANAGED, the credential type is only issued by Create a User Credential or Update a User Credential API requests. If you change management.mode from AUTOMATED to MANAGED and an associated issuance rule exists, the rule is disabled, but not deleted.
If management.mode is AUTOMATED, you can value one and only one of the three properties in the expiration object and the associated credential issuance rule automatically assigns an expiration date when it issues the credential. If management.mode is MANAGED and an expiration object is present, it causes an error.
If you want to change management.mode from AUTOMATED to MANAGED, but one of the three properties in the expiration object is valued, you must remove the expiration object. Use Update the Credential Type with no expiration object, which removes it from the credential type, and with management.mode set to MANAGED.
metadata object data model
The metadata object is not returned with Read All Credential Types. You must Read One Credential Type with the id of the credential type you want to review.
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
backgroundImage |
String | Optional | Mutable | URL to an image of the background to show in the credential. Must be no more than 50 KB in size. |
bgOpacityPercent |
String | Optional | Mutable | Percent opacity of the background image in the credential. High percentage opacity may make reading text difficult. |
cardColor |
String | Optional | Mutable | Color to show on the credential. |
columns |
Integer | Optional | Mutable | Number of columns of visible fields to use when displaying the credential. Must be between 1 and 3. Defaults to 1. |
description |
String | Optional | Mutable | Description of the credential. |
fields |
Object[] | Optional | Mutable | Array of objects representing the fields. |
fields.attribute |
String | Required/Optional | Mutable | Name of the PingOne Directory attribute. Required if field.type is Directory Attribute, otherwise optional and ignored if used. Refer to fields.attribute definition. |
fields.default |
String | Optional | Mutable | Assigns a default value if a PingOne Expression Language (PEL) in the fields.attribute evaluates to no value. |
fields.id |
String | Required | Mutable | Identifier of the field. Ping Identity recommends that id is text formatted as "<fields.type> -> <fields.title>" to show the type of data expected as well as for what it is used. Examples include: "Alphanumeric Text -> Department" or "Directory Attribute -> Username". |
fields.fileSupport |
String | Optional | Mutable | Specifies how an image is stored in the credential; refer to fields.fileSupport types. |
fields.isVisible |
Boolean | Required | Mutable | Whether the field should be visible to viewers of the credential. |
fields.required |
Boolean | Optional | Mutable | Whether the field is required for the credential. Defaults to false. |
fields.title |
String | Required | Mutable | Descriptive text when showing the field. |
fields.type |
String | Required | Mutable | Type of data in the field; refer to fields.type types. |
fields.value |
String | Required/Optional | Mutable | The text to appear on the credential for a type of Alphanumeric Text. Required if type is Alphanumeric Text and management.mode is AUTOMATED, optional if type is Alphanumeric Text and management.mode is MANAGED (effectively a default that can be overridden by a data value in Create a User Credential or Update a User Credential), and otherwise ignored if present. |
logoImage |
String | Optional | Mutable | URL to an image of the logo to show in the credential. Must be no more than 25 KB in size. |
name |
String | Optional | Mutable | Name of the credential. |
textColor |
String | Optional | Mutable | Color of the text to show on the credential. |
version |
Integer | Optional | Mutable | Version of this credential metadata. If not provided, the service assigns a version. |
fields.attribute definition
Although fields.attribute is always a string type, the service supports two interpretations of its string.
If the string begins with ${ and ends with }, the string is interpreted as a PingOne Expression Language (PEL) expression. As a PEL expression, the string must have user. before any attribute names. A PEL expression is essential to Issue multiple credentials to a user based on a directory attribute. The PEL expression extracts specific elements from the multiple potential credentials found in the attribute.
If the string does not have ${ and }, the string is interpreted as the traditional pointer to an attribute name in the directory. That is, you supply an attribute name as the string and the service supplies the value of that attribute to the credential. When used as a pointer, the string does not need user. to reference an attribute.
fields.fileSupport types
A credential field that uses a type of Directory Attribute can contain a URL that references a JPEG, PNG, or GIF image file uploaded with Create Image. The credential type is limited to 5 fields that have fileSupport set to BASE64_STRING or INCLUDE_FILE. For credentials, an image file has a maximum size of 2 MB. A credential cannot exceed 2.5 MB including all images.
| Type | Description |
|---|---|
| BASE64_STRING | Image is base64-encoded to a string in the credential. |
| INCLUDE_FILE | Image binary is included in the credential. |
| REFERENCE_FILE | Only a URL referencing the image is in the credential. The image binary remains stored external to the credential. |
fields.type types
| Type | Description |
|---|---|
| Alphanumeric Text | A static text string of letters, numbers, or punctuation set on fields.value. |
| Issued Timestamp | Date and time the credential was issued. |
| Directory Attribute | Any PingOne Directory standard or custom attribute. When used in a credential for a user, the service reads that attribute from the user and puts the value in the credential. The name of the attribute is in fields.attribute. |
Automatic deletion and revocation
Typical behavior for credential types is to automatically revoke user credentials when a credential type, user, or environment is deleted. However, some credential types, such as birth certificates, university degrees, or marriage certificates, should never be automatically revoked even if the user or environment is deleted. You control this using onDelete.revokeIssuedCredentials on the credential type.
The selected deletion and revocation behavior cascades over all resources managed by the service: credential types, issuance rules, staged changes, digital wallet applications, digital wallets, and user credentials.
If onDelete.revokeIssuedCredentials is true:
-
User credentials are revoked and deleted when the credential type is deleted.
-
Provisioned credentials are revoked when a user credential is deleted, its credential type is deleted, or its digital wallet is disabled or deleted.
If onDelete.revokeIssuedCredentials is false:
-
User credentials are only revoked if the issuance rule causes it to be revoked or if Update a User Credential sets the expiration date.
-
Provisioned credentials are revoked if the user credential is revoked (refer to previous item).
Issue multiple credentials to a user based on a directory attribute
Some customers must issue multiple credentials to a user based on a directory attribute. For example, a bank might issue credit cards in their own name while also issuing credit cards branded for their customers. A user may have more than one of these credit cards in their wallet. The directory service requires an attribute that contains all the credit cards for that user and the service must support credential issuance to any or all of that user's credit cards.
The customer can define a single directory attribute for each user to hold a data object that contains the different accounts owned by the user. Our hypothetical bank wants to support the end user being able to present a verifiable credential that contains only the information from one of these accounts. Although issuance of multiple credentials is initiated by a single directory attribute, definition of the credential type can reference any directory attributes for its fields.
The definition of the data object is up to the customer. They then use PingOne Expression Language (PEL) expressions to retrieve any information as required. The Credential Types multiple.expression contains a PEL expression that counts qualifying entries in the data object. The Credential Types metadata.fields.attribute contains a PEL expression to retrieve individual data elements that populates a field in the credit type definition.
When you Apply Credential Issuance Rule Staged Changes for a user for a credential type that has multiple configured, the service creates multiple, separate user credentials for the credential type.
An example may better illustrate applying these concepts.
Example data object
Our hypothetical bank customer, BigBank, uses this JSON object, stored as a JSON binary large object (blob), as the source for credit card information.
{
"credit_cards": {
"branded": [
{
"oem_merchant": "ChainRetailer",
"customer_id": "0010380",
"user_id": "1506980157738"
},
{
"oem_merchant": "GlobalOil",
"customer_id": "0475932",
"user_id": "1506980157739"
}
],
"owned": [
{
"customer_id": "0010380",
"int_id" : "03918203198"
},
{
"customer_id": "0475932",
"int_id" : "03918203100"
}
]
}
}
An administrator at BigBank creates two different credential types, one each for branded and owned. Each credential type is configured to issue a credential for each JSON object in that array.
Example API
This demonstrates the API using the branded array. An administrator at BigBank created this credential type for branded.
A body for Create a credential type (automated) that creates multiple credentials from the data object for the credit_cards.branded is:
{
"title": "Branded Cards",
"description": "Example for branded cards attribute for BigBank",
"metadata": {
"fields": [
{
"id": "title",
"title": "oem_merchant",
"attribute": "${user.credit_cards['branded'][__ITERATOR__].oem_merchant}",
"isVisible": true,
"type": "Directory Attribute",
"default": "Use this if missing"
},
{
"id": "Directory Attribute -> user_id",
"title": "user_id",
"attribute": "${user.credit_cards['branded'][__ITERATOR__].user_id}",
"isVisible": true,
"type": "Directory Attribute"
},
{
"id": "Directory Attribute -> customer_id",
"title": "customer_id",
"attribute": "${user.credit_cards['branded'][__ITERATOR__].customer_id}",
"isVisible": true,
"type": "Directory Attribute"
}
]
},
"cardDesignTemplate": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 740 480\">...</svg>",
"multiple": {
"expression": "${user.credit_cards['branded']}"
}
}
The PEL expression in multiple.expression returns the count of objects in the credit_cards.branded object array of the data object. This populates the iteration limit of the system __ITERATOR__ variable seen in the PEL expressions of the three metadata.fields.attribute values.
A body for Create a credential type (automated) that creates multiple credentials from the data object for the credit_cards.owned is:
{
"title": "Owned",
"description": "Example for owned attribute for BigBank",
"metadata": {
"fields": [
{
"id": "Directory Attribute -> int_id",
"title": "int_id",
"attribute": "${user.credit_cards['owned'][__ITERATOR__].int_id}",
"isVisible": true,
"type": "Directory Attribute"
},
{
"id": "Directory Attribute -> customer_id",
"title": "customer_id",
"attribute": "${user.credit_cards['owned'][__ITERATOR__].customer_id}",
"isVisible": true,
"type": "Directory Attribute"
}
],
"textColor": "#000000",
"version": 4
},
"cardDesignTemplate": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 740 480\">...</svg>",
"multiple": {
"expression": "${user.credit_cards['owned']}"
}
}
The PEL expression in multiple.expression returns the count of objects in the credit_cards.owned object array of the data object. This populates the iteration limit of the system __ITERATOR__ variable seen in the PEL expressions of the two metadata.fields.attribute values.
Important considerations
-
Do not use a multi-valued attribute type. Use a single JSON attribute that contains the necessary arrays.
When configuring a custom JSON attribute for issuing multiple credentials for a user, the administrator can set it to a multi-valued type, which allows the attribute to be an array of JSON blobs. The PingOne Directory does not guarantee ordering for multi-valued attributes. Multi-valued attributes values are treated as a set rather than a list. This conflicts with how the service determines if a credential has changed, where order is essential. For example, a user has three credentials issued using a multi-valued type of [A, B, C]. If you add another JSON blob to the user attribute, one might expect the change to look like [A, B, C, D] (where each letter is a different credential) and issue one more credential to the user. However, with a multi-valued custom JSON attribute, the change may look like [A, C, D, B]. When the service compares the order, it interprets that two credentials have been updated and one more credential has been added.
Due to this involuntary re-ordering behavior, multi-valued custom JSON attributes are strongly discouraged.
-
Revocation can be affected by re-ordering.
If the user has an array like [A, B, C] so that the service issues three credentials and an administrator then revokes the credential B, credential B remains revoked. If the user is updated to change some values in A, B, and C, A and C update while B remains revoked. However, if the user is updated with a new object or value added to the array such that it becomes [A, D, B, C], credential C updates to the values of B and a new credential issues for C. No credential will be issued or updated to have the values of D because it is in the second place and the credential for second place was revoked.
To mitigate this behavior, always add new entries to the end of the arrays in the JSON blob.
Response codes
| Code | Message |
|---|---|
| 200 | Successful operation. |
| 400 | The request could not be completed. |
| 401 | You do not have access to this resource. |
| 403 | You do not have permissions or are not licensed to make this request. |
| 404 | The requested resource was not found. |
| 500 | Unexpected server error. |
Create Credential Type (automated)
Create Credential Type (managed)
Read All Credential Types
Read All Credential Type Versions
Read One Credential Type
Read One Credential Type Version
Update a Credential Type
Delete a Credential Type
Credential Issuance Rules
Use the Credentials Issuance Rules operations to create, read, and update rules for issuing, updating, and revoking credentials by credential type. Rules are defined for:
-
A specific Credential Type in the endpoint
-
A specific Digital Wallet App in the request body
-
A specific set of users defined by one, and only one, of these filters in the request body:
-
Membership in one or more Groups.
-
Membership in one or more Populations.
-
Satisfying a SCIM query. For information about SCIM syntax and operators, refer to Filtering collections.
-
A credential rule contains an automation object with available actions as keys: issue, revoke, and update. If an action is set to PERIODIC, the service performs the action at the end of the period. If an action is set to ON_DEMAND, you must use Apply Credential Issuance Rule Staged Changes to perform staged changes for those ON_DEMAND actions.
The general procedure for rules is:
-
Create - create a new rule to stage actions for for the credential by user
-
Update - update an existing rule to stage actions for the credential by user
-
Staged Changes - show actions staged for execution
-
Apply - act upon credentials staged for actions.
You can also monitor credential rules:
-
All Rules - view all rules defined for a credential type
-
One Rule - view a specific rule for a credential
-
Usage Counts - show counts by action applied to the credential by user
-
Usage Details - show details by action applied to the credential by user
You can, finally, remove a rule for a credential type:
- Delete - remove a rule from a credential type
For actions set to PERIODIC, an improper credential could cause endless repetitious errors. The service monitors staged changes for errors. When an error occurs during processing, the service adds details of the error to the staged change so that errors can be tracked, counted, and returned to the user. If more than 3 errors occur for the same scheduled staged change, the service unschedules (changes stagedChanges.scheduled from true to false) that staged change so that the service no longer attempts to process it. The user can manually trigger the staged change with Apply Credential Issuance Rule Staged Changes.
Credentials unscheduled due to errors are reported. Some errors are known but there can also be unexpected errors. The errors.errorDetail object provides an error code and message. If the error was related to processing a specific credential field, the field name will be in errors.errorDetail.target. This includes the staged changes that exist when the request is made with 1 or more errors. It does not include a staged change that was failed in the past, but has since completed successfully or was deleted (because the user no longer matches the issuance rule). Requests that report errors include:
Credential Issuance Rules data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
automation |
Object | Required | Mutable | Contains a list of actions, as key names, and the update method for each action. |
automation.issue |
String | Required | Mutable | The method the service uses to issue credentials with the credential issuance rule. Can be PERIODIC or ON_DEMAND. |
automation.revoke |
String | Required | Mutable | The method the service uses to revoke credentials with the credential issuance rule. Can be PERIODIC or ON_DEMAND. |
automation.update |
String | Required | Mutable | The method the service uses to update credentials with the credential issuance rule. Can be PERIODIC or ON_DEMAND. |
createdAt |
DateTime | N/A | Read-only | Date and time the credential issuance rule was created. |
credentialType.id |
String | N/A | Read-only | Identifier (UUID) of the credential type with which this credential issuance rule is associated. |
digitalWalletApplication.id |
String | Optional | Mutable | Identifier (UUID) of the customer's Digital Wallet App that will interact with the user's Digital Wallet. Optional, and if present, digital wallet pairing automatically starts when a user matches the credential issuance rule. |
environment.id |
String | N/A | Read-only | PingOne environment identifier (UUID) in which the credential issuance rule exists. |
filter |
Object | Optional | Mutable | Contains one and only one filter (.groupIds, .populationIds, or .scim) that selects the users to which the credential issuance rule applies. |
filter.groupIds |
String[] | Required/Optional | Mutable | Array of one or more identifiers (UUIDs) of groups, any of which a user must belong for the credential issuance rule to apply. One and only one filter is required in filter, others are optional and cause an error if used. |
filter.populationIds |
String[] | Required/Optional | Mutable | Array of one or more identifiers (UUIDs) of populations, any of which a user must belong for the credential issuance rule to apply. One and only one filter is required in filter, others are optional and cause an error if used. |
filter.scim |
String | Required/Optional | Mutable | A SCIM query that selects users to which the credential issuance rule applies. One and only one filter is required in filter, others are optional and cause an error if used. For more information about SCIM syntax and operators, refer to Filtering collections. |
id |
String | N/A | Read-only | Identifier (UUID) of the credential issuance rule. |
notification |
Object | Optional | Immutable | Contains notification information. When this property is supplied, the information within is used to create a custom notification. |
notification.methods |
String[] | Optional | Immutable | Array of methods for notifying the user; can be EMAIL, SMS, or both. |
notification.template |
Object | Optional | Immutable | Contains template parameters. |
notification.template.locale |
String | Optional | Immutable | The ISO 2-character language code used for the notification; for example, en. |
notification.template.variables |
Object[] | Required/Optional | Immutable | An object of name-value pairs that defines the dynamic variables used by the content variant. Required if the template requires variables, otherwise ignored. For more information on dynamic variables, refer to Dynamic variables. |
notification.template.variant |
String | Optional | Immutable | The unique user-defined name for the content variant that contains the message text used for the notification. For more information on variants, refer to Creating custom contents. |
status |
String | Required | Mutable | Status of the credential issuance rule. Can be ACTIVE or DISABLED. |
updatedAt |
DateTime | N/A | Read-only | Date and time the credential issuance rule was last updated; can be null. |
Actions within automation (.issue, .update, and .revoke) can be PERIODIC, the service applies the rule frequently every hour, or ON_DEMAND, the service applies the rule only with an Apply Credential Issuance Rule Staged Changes request. For ON_DEMAND, use Read Credential Issuance Rule Staged Changes to determine staged changes.
The one notification.template object applies a variant and locale to all three credential notification templates: credential_issued, credential_updated, and credential_revoked. When adding a variant or locale to any of the three notification templates, consider adding the same variant or locale to the other notification templates. If a requested variant is not defined, the notification uses the default notification template. If a requested locale is not defined, the notification uses the user's preferred language or, if the user has no preferred language, the default language of the environment.
Credential Issuance Rules staged changes data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
stagedChanges.action |
String | N/A | Read-only | Action determined by the service that should be taken for the credential based on the request that staged it. Can be ISSUE, UPDATE, or REVOKE. |
stagedChanges.createdAt |
DateTime | N/A | Read-only | Date and time the change was staged by the service. |
stagedChanges.credentialType.id |
String | N/A | Read-only | Identifier (UUID) of the credential type with which this credential issuance rule is associated. |
stagedChanges.environment.id |
String | N/A | Read-only | PingOne environment identifier (UUID) in which the credential issuance rule exists. |
stagedChanges.issuanceRule.id |
String | N/A | Read-only | Identifier (UUID) of the credential issuance rule. |
stagedChanges.scheduled |
String | N/A | Read-only | Whether or not the staged change is scheduled: true if the action on the credential issuance rule is set to PERIODIC and false if the action is set to ON_DEMAND. |
stagedChanges.user.id |
String | N/A | Read-only | Identifier (UUID) of the user identified by the filter on the credential issuance rule. |
stagedChanges.errors |
Object[] | N/A | Read-only | Array of objects representing credentials that had errors when attempting an action on it. Refer to Credential Issuance Rules errors object. |
Credential Issuance Rules apply staged changes data model
This data model applies only to Read Credential Issuance Rule Staged Changes and Apply Credential Issuance Rule Staged Changes.
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
issue |
String[] | Optional | Mutable | Array of one or more identifiers (UUIDs) of users whose credentials are in an issue action state and should be issued. |
revoke |
String[] | Optional | Mutable | Array of one or more identifiers (UUIDs) of users whose credentials are in a revoke action state and should be revoked. Used only in the body of Apply Credential Issuance Rule Staged Changes. |
update |
String[] | Optional | Mutable | Array of one or more identifiers (UUIDs) of users whose credentials are in an update action state and should be updated. Used only in the body of Apply Credential Issuance Rule Staged Changes. |
errors |
Object[] | N/A | Read-only | Array of objects representing credentials that had errors when attempting an action on it. Refer to Credential Issuance Rules errors object. |
Credential Issuance Rules usage counts data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
issued |
Integer | N/A | Read-only | Count of credentials issued by the rule since the time the credential issuance rule was created. |
accepted |
Integer | N/A | Read-only | Count of credentials accepted by users of credentials issued by the credential issuance rule since the time the credential issuance rule was created. |
updated |
Integer | N/A | Read-only | Count of credentials updated by the rule since the time the credential issuance rule was created. |
revoked |
Integer | N/A | Read-only | Count of credentials revoked by the rule since the time the credential issuance rule was created. |
errors |
Integer | N/A | Read-only | Count of credentials that caused errors since the time the credential issuance rule was created. |
Credential Issuance Rules usage details data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
issued |
Object[] | N/A | Read-only | Credentials issued by the rule since the time the credential issuance rule was created. |
issued.user.id |
String | N/A | Read-only | Identifier (UUID) of the user identified by the filter on the credential issuance rule. |
issued.credential.id |
String | N/A | Read-only | Identifier (UUID) of the credential subject to the issue action identified by the credential issuance rule. |
issued.createdAt |
DateTime | N/A | Read-only | Date and time the credential was issued by the service. |
updated |
Object[] | N/A | Read-only | Credentials updated by the rule since the time the credential issuance rule was created. |
updated.user.id |
String | N/A | Read-only | Identifier (UUID) of the user identified by the filter on the credential issuance rule. |
updated.credential.id |
String | N/A | Read-only | Identifier (UUID) of the credential subject to the update action identified by the credential issuance rule. |
updated.createdAt |
DateTime | N/A | Read-only | Date and time the credential was updated by the service. |
revoked |
Object[] | N/A | Read-only | Credentials revoked by the rule since the time the credential issuance rule was created. |
revoked.user.id |
String | N/A | Read-only | Identifier (UUID) of the user identified by the filter on the credential issuance rule. |
revoked.credential.id |
String | N/A | Read-only | Identifier (UUID) of the credential subject to the revoke action identified by the credential issuance rule. |
revoked.createdAt |
DateTime | N/A | Read-only | Date and time the credential was revoked by the service. |
errors |
Object[] | N/A | Read-only | Array of objects representing credentials that had errors when attempting an action on it. Refer to Credential Issuance Rules errors object. |
Credential Issuance Rules errors object
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
errors |
Object[] | N/A | Read-only | Array of objects representing errors recorded when attempting an action on a credential. |
errors.recordedAt |
DateTime | N/A | Read-only | Date and time the error was recorded by the service. |
errors.errorDetail.code |
String | N/A | Read-only | A code that indicates the error encountered by the service. Refer to Credential Issuance Rules staged changes error codes. |
errors.errorDetail.target |
String | N/A | Read-only | The part of the credential that caused the error encountered by the service. |
errors.errorDetail.message |
String | N/A | Read-only | A message that describes the error encountered by the service. |
credentialType.id |
String | N/A | Read-only | Identifier (UUID) of the credential type with which this credential issuance rule is associated. |
environment.id |
String | N/A | Read-only | PingOne environment identifier (UUID) in which the credential issuance rule exists. |
issuanceRule.id |
String | N/A | Read-only | Identifier (UUID) of the credential issuance rule. |
user.id |
String | N/A | Read-only | Identifier (UUID) of the user identified by the filter on the credential issuance rule. |
id |
String | N/A | Read-only | Identifier (UUID) of the error. |
action |
String | N/A | Read-only | Action determined by the service that should be taken for the credential based on the request that staged it. Can be ISSUE, UPDATE, or REVOKE. |
scheduled |
String | N/A | Read-only | Whether or not the staged change is scheduled: true if the action on the credential issuance rule is set to PERIODIC and false if the action is set to ON_DEMAND. |
createdAt |
DateTime | N/A | Read-only | Date and time the error was created by the service. |
updatedAt |
DateTime | N/A | Read-only | Date and time the error was updated by the service. |
Credential Issuance Rules staged changes error codes
| Error Code | Description |
|---|---|
TEMPLATE_ERROR |
An error in the template placeholders of the cardDesignTemplate SVG. |
SVG_ERROR |
An error in the syntax of the cardDesignTemplate SVG. |
CREDENTIAL_TYPE_INVALID |
Credential Type was invalid when the staged change was performed. |
FILE_RESOLUTION_ERROR |
User attribute for a field with fileSupport did not reference a supported file, such as an unsupported URL, file too large, or error reading file. |
CREDENTIAL_TOO_LARGE |
Size of data collected for the credential exceeds the maximum that can be stored in a credential. |
UNEXPECTED_ERROR |
An unexpected error occurred. |
Response codes
| Code | Message |
|---|---|
| 200 | Successful operation. |
| 400 | The request could not be completed. |
| 401 | You do not have access to this resource. |
| 403 | You do not have permissions or are not licensed to make this request. |
| 404 | The requested resource was not found. |
| 500 | Unexpected server error. |
Create Credential Issuance Rule
Read All Credential Issuance Rules
Read One Credential Issuance Rule
Read All Credential Issuance Rule Staged Changes
Read One Credential Issuance Rule Staged Change
Read Credential Issuance Rule Usage Counts
Read Credential Issuance Rule Usage Details
Update Credential Issuance Rule
Apply Credential Issuance Rule Staged Changes
Delete Credential Issuance Rule
Digital Wallet Apps
The digital wallet apps service controls the relationship between the customer's digital wallet app, which communicates with users' digital wallets, and a customer's PingOne application.
Digital wallet app data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
application.id |
String | Required | Immutable | The identifier (UUID) of the PingOne application associated with the digital wallet app. |
appOpenUrl |
String | Required | Mutable | URL sent in notifications to the user to communicate with the service. |
createdAt |
DateTime | N/A | Read-only | Date and time the digital wallet app was created. |
environment.id |
String | N/A | Read-only | PingOne environment identifier (UUID) in which the digital wallet app exists. |
id |
String | N/A | Read-only | Identifier (UUID) associated with the digital wallet app. |
name |
String | Required | Mutable | Name associated with the digital wallet app. |
updatedAt |
DateTime | N/A | Read-only | Date and time the digital wallet app was last updated; can be null. |
usesPingOneWalletSDK |
Boolean | Optional | Immutable | Whether the user's wallet app uses the PingOne Wallet SDK; default is true. |
Create Digital Wallet App
Read All Digital Wallet Apps
Read One Digital Wallet App
Update Digital Wallet App
Delete Digital Wallet App
Digital Wallets
The Digital Wallet service controls the relationship between a user's phone wallet app, which uses the Wallet SDK, and the customer's PingOne application. It also offers notifications when the PingOne application communicates with the user's Wallet SDK. Settings on the Digital Wallet configure sending push notifications from PingOne Credentials to the Wallet SDK of the user.
In the normal digital wallet pairing use case, you use Create Digital Wallet to create the Digital Wallet without the applicationInstance.id and a pairing session is created. The Digital Wallet service uses the digital_wallet_pairing notification template to send the pairing session URL (refer to appOpen.href in the response) to the user via email or text or you show a QR code (refer to qrUrl.href in the response) of the pairing session URL to the user. When the user opens the URL, it opens your app or takes them to a page with instructions on how to install the app. When the app opens the URL, it shares its applicationInstance.id with the service using the Wallet SDK.
Alternatively, you send the applicationInstance.id when you create the Digital Wallet. For example, if you have the user install your app, the user authenticates with your servers. When your app is installed, it creates an application instance. Since the app knows who the user is, the app sends its application instance identifier to your server and then your application sends the applicationInstance.id to the service when creating or updating the Digital Wallet. This creates a Digital Wallet with a known application instance identifier. Activation of the Digital Wallet requires sending some device data, such as SDK version and application bundle ID or package name, to PingOne Credentials:
- The service creates a pairing session and sends a pairing request message to the device.
- The Wallet SDK receives this request and the app approves the request.
- The Wallet SDK sends the device data to PingOne Credentials, which activates the Digital Wallet.
Digital wallet data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
applicationInstance.id |
String | Required/Optional | Immutable | Identifier (UUID) of the application running the Wallet SDK on the user's device and registered with the service. Registration is required before the wallet can be used. Registration is performed by a compatible wallet app using the Wallet SDK, or by the customer application using Create Digital Wallet or one Update Digital Wallet. |
createdAt |
DateTime | N/A | Read-only | Date and time the Digital Wallet was created. |
deviceData |
Object | N/A | Read-only | Contains metadata collected about the user's Wallet SDK. |
digitalWalletApplication.id |
String | Required | Immutable | Identifier (UUID) of the customer's PingOne application that interacts with the user's Wallet SDK. |
environment.id |
String | N/A | Read-only | PingOne environment identifier (UUID) in which the digital wallet app exists. |
id |
String | N/A | Read-only | Identifier (UUID) associated with the digital wallet. |
notification |
Object | Optional | Immutable | Contains notification information. When this property is supplied, the information within is used to create a custom notification. |
notification.methods |
String[] | Optional | Immutable | Array of methods for notifying the user; can be EMAIL, SMS, or both. |
notification.results |
Object[] | N/A | Read-only | Array of objects that contain the results of attempts to notify the user. |
notification.results.error |
Object | N/A | Read-only | Contains information regarding why a notification failed to send. |
notification.results.error.code |
String | N/A | Read-only | A short alphanumeric code identifying the error. |
notification.results.error.details |
Object[] | N/A | Read-only | Array of objects that contain details of the error as provided by the source of the error. Exact format varies by source. |
notification.results.error.id |
String | N/A | Read-only | Identifier (UUID) of the error message. |
notification.results.error.message |
String | N/A | Read-only | A textual message explaining the error. |
notification.results.method |
String | N/A | Read-only | Method used in the attempt to notify the user; can be EMAIL or SMS. |
notification.results.notification.id |
String | N/A | Read-only | Identifier (UUID) of the notification that was sent. |
notification.results.sent |
Boolean | N/A | Read-only | Whether the notification was successfully sent. |
notification.template |
Object | Optional | Immutable | Contains template parameters. |
notification.template.locale |
String | Optional | Immutable | The ISO 2-character language code used for the notification; for example, en. |
notification.template.variables |
Object[] | Required/Optional | Immutable | An object of name-value pairs that defines the dynamic variables used by the content variant. Required if the template requires variables, otherwise ignored. For more information on dynamic variables, refer to Dynamic variables. |
notification.template.variant |
String | Optional | Immutable | The unique user-defined name for the content variant that contains the custom message text used for the notification. For more information on variants, refer to Creating custom contents. |
pairingAttempts |
Object[] | N/A | Read-only | Array of result objects of all pairing attempts between the Digital Wallet and the Wallet SDK. Not returned when no pairing was attempted or when creating a Digital Wallet. |
pairingAttempts.attemptedAt |
DateTime | N/A | Read-only | Date and time the credential pairing was attempted. |
pairingAttempts.details |
Object | N/A | Read-only | Object with details regarding a pairing failure. Not returned when a pairing was successful. Content of the object varies depending on the error as explained in the Description column of Pairing attempt errors. |
pairingAttempts.error |
String | N/A | Read-only | As listed in the Error column of Pairing attempt error. |
pairingAttempts.message |
String | N/A | Read-only | Explanation of the error. |
pairingAttempts.success |
Boolean | N/A | Read-only | Whether the pairing attempt was successful. |
pairingSession |
Object | N/A | Read-only | Contains information regarding the pairing session. |
status |
String | Optional | Mutable | Status of the wallet; can be PAIRING_REQUIRED, ACTIVE, EXPIRED, or DISABLED. |
updatedAt |
DateTime | N/A | Read-only | Date and time the digital wallet was last updated; can be null. |
user.id |
String | N/A | Read-only | Identifier (UUID) of the user associated with the digital wallet. |
Pairing attempt errors
| Error | Description |
|---|---|
APP_PACKAGE_MISMATCH |
The package name or bundle ID sent by the Wallet SDK does not match the mobile settings of the PingOne Application (identified by digitalWalletApplication.id), details includes what was sent by the Wallet SDK in appPackage. |
WALLET_ALREADY_PAIRED |
The digital wallet is already successfully paired or the instance of the Wallet SDK on the device has already been paired with a different digital wallet of the same user. If a user attempts to pair the same digital wallet twice, details includes the new application instance ID in newApplicationInstanceId. If a user attempts to pair the same Wallet SDK instance with a second digital wallet, details includes the existing digital wallet ID in existingDigitalWalletId. |
WALLET_DISABLED |
Wallet is disabled. |
UNEXPECTED_ERROR |
An unexpected error occurred in the service, no details object returned. |
The digital wallet service uses the digital_wallet_pairing notification template to send the pairing session URL to the user via email or SMS text. The notification.template object can define a variant and locale for the notification, if needed.
Provisioned Credentials data model (wallet)
This object is shared with user credentials. It is returned only with Read One Digital Wallet Credentials and Read One User Credential Wallets. The former returns all user credentials associated with the specified digital wallet, the latter returns all digital wallets associated with the specified user credential.
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
claimReference |
Object | N/A | Read-only | The serialized JSON object used to create the ClaimReference object returned. This is needed to revoke an issued credential. |
createdAt |
DateTime | N/A | Read-only | Date and time the credential was provisioned. |
credential.id |
String | N/A | Read-only | Identifier (UUID) of the user credential associated with the provisioned credential. |
digitalWallet.id |
String | N/A | Read-only | Identifier (UUID) of the digital wallet associated with the provisioned credential. |
environment.id |
String | N/A | Read-only | Identifier (UUID) of the environment associated with the provisioned credential. |
expiresAt |
Date | N/A | Read-only | The date that the provisioned credential expires. If this value is null, the provisioned credential never expires. |
id |
String | N/A | Read-only | Identifier (UUID) of the provisioned credential. |
status |
String | N/A | Read-only | Status of the provisioned credential. |
user.id |
String | N/A | Read-only | Identifier (UUID) of the user associated with the provisioned credential. |
walletActions |
Object[] | N/A | Read-only | Array of actions taken regarding the provisioned credential. |
walletActions.action |
String | N/A | Read-only | Action taken regarding the provisioned credential; can be CREDENTIAL_ACCEPTED, CREDENTIAL_REJECTED, CREDENTIAL_REVOKED, or CREDENTIAL_DELETED. |
walletActions.occurredAt |
DateTime | N/A | Read-only | Date and time that the action occurred. |
Create Digital Wallet
Read All Digital Wallets
Read One Digital Wallet
Read One Digital Wallet Credentials
Update Digital Wallet
Delete Digital Wallet
User Credentials
Use the User Credentials service to create a user credential and get the credential status. To issue the credential to the user you must first create a credential type (automated) or create a credential type (managed). After you create a credential type, you can issue credentials to users two ways depending on the management.mode of the credential type:
-
if
management.modeisAUTOMATIC, create a credential issuance rule and the service issues the credential to all users who match the rule. -
if
management.modeisMANAGED, create a credential type (managed) or update a user credential and the service issues the credential to that user.
Regardless of management.mode, you can revoke a user credential, read all user credentials, read one user credential, or read one user credential wallets.
User Credentials data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
createdAt |
DateTime | N/A | Read-only | Date and time the user credential was created. |
credentialType.id |
String | Required | Immutable | Identifier of the credential type. |
data |
Object | Optional | Mutable | Fields submitted for the credential. |
data.<field> |
String | Required/Optional | Mutable | Fields for user data; refer to data object data model. |
environment.id |
String | N/A | Read-only | Identifier (UUID) of the environment associated with the user. |
expiresAt |
DateTime | Optional | Mutable | The date that the user credential expires. If this value is null, the credential never expires. |
id |
String | N/A | Read-only | Identifier (UUID) of the user credential. |
notification |
Object | Optional | Immutable | Contains notification information. When this property is supplied, the information within is used to create a custom notification. |
notification.methods |
String[] | Optional | Immutable | Array of methods for notifying the user; can be EMAIL, SMS, or both. |
notification.results |
Object | N/A | Read-only | Contains the results of attempts to notify the user. |
notification.results.error |
Object | N/A | Read-only | Contains information regarding why a notification failed to send. |
notification.results.method |
String | N/A | Read-only | Method used in the attempt to notify the user; can be EMAIL or SMS. |
notification.results.notification.id |
String | N/A | Read-only | Identifier (UUID) of the notification that was sent. |
notification.results.sent |
Boolean | N/A | Read-only | Whether the notification was successfully sent. |
notification.template |
Object | Optional | Immutable | Contains template parameters. |
notification.template.locale |
String | Optional | Immutable | The ISO 2-character language code used for the notification; for example, en. |
notification.template.variables |
Object[] | Required/Optional | Immutable | An object of name-value pairs that defines the dynamic variables used by the content variant. Required if the template requires variables, otherwise ignored. For more information on dynamic variables, refer to Dynamic variables. |
notification.template.variant |
String | Required | Immutable | The unique user-defined name for the content variant that contains the message text used for the notification. For more information on variants, refer to Creating custom contents. |
status |
String | N/A | Read-only | Status of the user credential. |
title |
String | N/A | Read-only | Returned as defined in the credential type. |
updatedAt |
DateTime | N/A | Read-only | Date and time the credential type was last updated; can be null. |
user.id |
String | Required | Immutable | Identifier (UUID) of the user. Supplied in the endpoint. |
The one notification.template object applies a variant and locale to all three credential notification templates: credential_issued, credential_updated, and credential_revoked. When adding a variant or locale to any of the three notification templates, consider adding the same variant or locale to the other notification templates. If a requested variant is not defined, the notification uses the default notification template. If a requested locale is not defined, the notification uses the user's preferred language or, if the user has no preferred language, the default language of the environment.
Although notification.template is immutable, Update a User Credential can change notification.template on a specific credential for its life span.
data object data model
The data object can only be used for Credential Types where its management.mode is MANAGED. Individual fields in data can only be used where the corresponding credential type's metadata.fields.type is Alphanumeric Text. If the corresponding credential type's metadata.fields.value is valued, that value represents a default for the field and can be overridden in Create a User Credential or Update a User Credential API requests.
The data object contains any number of keys, where the key is the title in metadata.fields that represents a specific attribute of the credential type required by the issuer. For example, an insurance company might have a metadata.fields.title of Medical Limitations and the corresponding data key would be Medical Limitations. These data fields must match the metadata.fields defined for the credential type in credentialType.id. For more information on fields, refer to the fields object in metadata object data model and the data types in fields.type types.
Whether any given data.<field> is required or optional depends on the corresponding fields.required and fields.value in the metadata object of the credential type. A data.<field> is required when fields.required is true and no fields.value exists and optional when fields.required is false or when fields.value has a value.
Provisioned Credentials data model (credential)
This object is shared with digital wallets. It is returned only with Read One User Credential Wallets and Read One Digital Wallet Credentials. The former returns all digital wallets associated with the specified user credential, the latter returns all user credentials associated with the specified digital wallet.
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
claimReference |
Object | N/A | Read-only | The serialized JSON object used to create the ClaimReference object returned. This is needed to revoke an issued credential. |
createdAt |
DateTime | N/A | Read-only | Date and time the credential was provisioned. |
credential.id |
String | N/A | Read-only | Identifier (UUID) of the user credential associated with the provisioned credential. |
digitalWallet.id |
String | N/A | Read-only | Identifier (UUID) of the digital wallet associated with the provisioned credential. |
environment.id |
String | N/A | Read-only | Identifier (UUID) of the environment associated with the provisioned credential. |
expiresAt |
Date | N/A | Read-only | The date that the provisioned credential expires. If this value is null, the provisioned credential never expires. |
id |
String | N/A | Read-only | Identifier (UUID) of the provisioned credential. |
status |
String | N/A | Read-only | Status of the provisioned credential. |
user.id |
String | N/A | Read-only | Identifier (UUID) of the user associated with the provisioned credential. |
walletActions |
Object[] | N/A | Read-only | Array of actions taken regarding the provisioned credential. |
walletActions.action |
String | N/A | Read-only | Action taken regarding the provisioned credential; can be CREDENTIAL_ACCEPTED, CREDENTIAL_REJECTED, CREDENTIAL_REVOKED, or CREDENTIAL_DELETED. |
walletActions.occurredAt |
DateTime | N/A | Read-only | Date and time that the action occurred. |
Response codes
| Code | Message |
|---|---|
| 200 | Successful operation. |
| 400 | The request could not be completed. |
| 401 | You do not have access to this resource. |
| 403 | You do not have permissions or are not licensed to make this request. |
| 404 | The requested resource was not found. |
| 500 | Unexpected server error. |
Create a User Credential
Read All User Credentials
Read One User Credential
Read One User Credential Wallets
Update a User Credential
Revoke a User Credential
Credential Verifications
The Credential Verification service receives, and responds to, requests for credential verification using Decentralized Identity Foundation Java Web Token Verifiable Credentials Presentation Profile (DIF JWT-VC Profile). The profile uses such open standards as:
-
World Wide Web Consortium (W3C) Decentralized Identifiers (DID) for core architecture, data model, and representations
-
W3C Verifiable Credentials Data Model for the presentation data model
-
DIF Presentation Exchange for credential request
-
OpenID for Verifiable Presentations (OpenID4VP ID1) as the base protocol for transportation
Use of these standards provides interoperability with any app that complies with DIF JWT-VC Profile.
The service can also use PingOne native protocols. The PingOne native protocol only works with apps that use the PingOne Neo Native SDKs, which has more features but is restricted to only supported apps.
Credential Verifications session data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
_links.appOpenURL.href |
String | N/A | Read-only | URL to use in a mobile browser to open a compatible wallet app, such as the PingOne Neo Sample App. |
_links.qr.href |
String | N/A | Read-only | URL to return a QR code that, when evaluated, opens the compatible wallet app to this verification. |
_links.self.href |
String | N/A | Read-only | URL to return this same response. |
applicationInstance.id |
String | Required/Optional | Immutable | Identifier (UUID) of the application running the Wallet SDK on the user's device and registered with the service. When set and protocol is NATIVE, the service sends a push notification to the application instance using the settings of the digital wallet application. |
didMethod |
String | Optional | Immutable | The decentralized identifier method to use during the credential verification session. Can be JWK, the default, or ION. |
digitalWalletApplication.id |
String | Optional | Immutable | Identifier (UUID) of the customer's digital wallet app that interacts with the user's digital wallet. When set and protocol is NATIVE, the service uses the appOpenURL defined on the Digital Wallet App instead of shocard.pingone.com. |
errors |
Object[] | N/A | Read-only | Array of objects representing errors recorded when attempting an action on a credential. Refer to Credential Verifications errors object data model. |
id |
String | N/A | Read-only | Identifier (UUID) of the credential verification session. |
issuerFilter.dids |
String[] | Optional | Immutable | Array of unique Decentralized Identifiers (DID). Ignored if protocol is NATIVE. Refer to the note following this table. |
issuerFilter.environmentIds |
String[] | Optional | Immutable | Array of PingOne environment identifiers. Refer to the note following this table. |
message |
String | Optional | Immutable | A message shown to the user by the compatible wallet app to alert the user. |
notification |
Object | Optional | Immutable | Contains notification information. When protocol is NATIVE and applicationInstance.id is set, permits administrators to customize their push notification. |
notification.template |
Object | Optional | Immutable | Contains template parameters. |
notification.template.locale |
String | Optional | Immutable | The ISO 2-character language code used for the notification; for example, en. |
notification.template.variables |
Object[] | Required/Optional | Immutable | An object of name-value pairs that defines the dynamic variables used by the content variant. Required if the template requires variables, otherwise ignored. For more information on dynamic variables, refer to Dynamic variables. |
notification.template.variant |
String | Optional | Immutable | The unique user-defined name for the content variant that contains the message text used for the notification. For more information on variants, refer to Creating custom contents. |
protocol |
String | Optional | Immutable | Protocol to use for verification; can be OPENID4VP or NATIVE. If not present, defaults to NATIVE. |
requestedCredentials |
Object[] | Required | Immutable | Array of objects that contain the type of credentials to verify and the keys to return from the credential. Refer to the important note following this table. |
requestedCredentials.keys |
String[] | Optional | Immutable | Array of strings that identify the key names for selective disclosure to return from the credential. |
requestedCredentials.type |
String | Required | Immutable | Type of credential to verify. Must be the name of a PingOne credential type issued by the credential issuer. |
status |
String | N/A | Read-only | Status of the verification request; can be INITIAL, WAITING, VERIFICATION_SUCCESSFUL, VERIFICATION_FAILED, or VERIFICATION_EXPIRED. |
The digital wallet service uses the credential_verification notification template to send a push notification to a digital wallet when a Create Credential Verification Session (NATIVE - Push Notification) is created. The notification.template object can define a variant and locale for the notification, if needed.
If issuerFilter.environmentIds is submitted, the service searches all listed environments for the issuer of the presented credential. If the user presents a credential that is not from one of these issuers, the verification fails with status of VERIFICATION_FAILED.
If issuerFilter.dids is submitted and protocol is OPENID4VP, the service searches all listed decentralized identifiers (DID) for the issuer of the presented credential. If the user presents a credential that is not from one of these issuers, the verification fails with status of VERIFICATION_FAILED.
This issuerFilter.dids typically contains decentralized identifiers for issuers that are not using PingOne Credentials for JWT-VC issuance. The service supports these three DID methods:
-
did:jwk - https://github.com/quartzjer/did-jwk/blob/main/spec.md
-
did:ion - https://identity.foundation/ion/ (The service supports only long-form URIs for this method)
Credential Verifications credential data data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
_links.self.href |
String | N/A | Read-only | URL to return this verification credential data. |
credentialData |
Object[] | N/A | Read-only | Array of objects containing the data found on the credential. |
credentialData.data |
Object[] | N/A | Read-only | Array of objects containing the name-value pairs found on the credential. If a credential has not yet been shared, status is INITIAL or WAITING, then returns as an empty array. |
credentialData.data.key |
String | N/A | Read-only | Name of the key of a name-value pair found on the credential. |
credentialData.data.value |
String | N/A | Read-only | Value of a name-value pair found on the credential. |
credentialData.issuerId |
String | N/A | Read-only | Identifier (UUID) of the issuer of the credential verified in the format from the credential issuer. |
credentialData.issuerLogo |
String | N/A | Read-only | Base64-encoded logo of the issuer of the credential. |
credentialData.issuerName |
String | N/A | Read-only | Name of the issuer of the credential verified. |
credentialData.type |
String | N/A | Read-only | Space-delimited list of the types of credential verified. |
credentialData.types |
String[] | N/A | Read-only | Array of the types of credential verified. |
errors |
Object[] | N/A | Read-only | Array of objects representing errors recorded when attempting an action on a credential. Refer to Credential Verifications errors object data model. |
id |
String | N/A | Read-only | Identifier (UUID) of the verification credential data. |
status |
String | N/A | Read-only | Status of the verification request; can be INITIAL, WAITING, VERIFICATION_SUCCESSFUL, VERIFICATION_FAILED, or VERIFICATION_EXPIRED. |
Credential Verifications session data data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
_links.appOpenURL.href |
String | N/A | Read-only | URL to use in a mobile browser to open a compatible wallet app, such as the PingOne Neo Sample App. |
_links.qr.href |
String | N/A | Read-only | URL to return a QR code that, when evaluated, opens the compatible wallet app to this verification. |
_links.self.href |
String | N/A | Read-only | URL to return this verification session data. |
applicationInstance.id |
String | N/A | Read-only | Identifier (UUID) of the application running the Wallet SDK on the user's device and registered with the service. |
errors |
Object[] | N/A | Read-only | Array of objects representing errors recorded when attempting an action on a credential. Refer to Credential Verifications errors object data model. |
id |
String | N/A | Read-only | Identifier (UUID) of the verification session data. |
status |
String | N/A | Read-only | Status of the verification request; can be INITIAL, WAITING, VERIFICATION_SUCCESSFUL, VERIFICATION_FAILED, or VERIFICATION_EXPIRED. |
verifiedData |
Object[] | N/A | Read-only | Array of objects containing the data found on the credential. |
verifiedData.data |
Object[] | N/A | Read-only | Array of objects containing the name-value pairs found on the credential. If a credential has not yet been shared, status is INITIAL or WAITING, then returns as an empty array. |
verifiedData.data.key |
String | N/A | Read-only | Name of the key of a name-value pair found on the credential. |
verifiedData.data.value |
String | N/A | Read-only | Value of a name-value pair found on the credential. |
verifiedData.metaData |
Object | N/A | Read-only | Contains metadata associated with the credential. |
verifiedData.metaData.issuanceDate |
String | N/A | Read-only | The date and time the credential was issued in ISO 8601 YYYY-MM-DDTHH:MM:SS.sssZ format (milliseconds optional). |
verifiedData.metaData.issuerId |
String | N/A | Read-only | Identifier (UUID) of the issuer of the credential verified in the format from the credential issuer. |
verifiedData.metaData.issuerLogo |
String | N/A | Read-only | Base64-encoded logo of the issuer of the credential. |
verifiedData.metaData.issuerName |
String | N/A | Read-only | Name of the issuer of the credential verified. |
verifiedData.metaData.verificationStatus |
String | N/A | Read-only | Verification status of the credential. Can be VALID or INVALID. |
verifiedData.type |
String | N/A | Read-only | Space-delimited list of the types of credential verified. |
verifiedData.types |
String[] | N/A | Read-only | Array of the types of credential verified. |
Credential Verifications errors object data model
| Property | Type | Required? | Mutable? | Description |
|---|---|---|---|---|
errors.code |
String | N/A | Read-only | A code that indicates the error encountered by the service. Refer to Credential Verifications error codes. |
errors.target |
String | N/A | Read-only | The part of the credential that caused the error encountered by the service. |
errors.message |
String | N/A | Read-only | A message that describes the error encountered by the service. |
Credential Verifications error codes
| Code | Message |
|---|---|
| REQUESTED_CREDENTIAL_MISSING | One or more of the requested credential types is not included in the presentation from the user. |
| REQUESTED_FIELD_MISSING | One or more of the requested fields for one or more credential types is not included in the presentation from the user. |
| INVALID_TOKEN | The idToken presented by the user's wallet is not valid (format or signature error). |
| INVALID_CREDENTIAL | One or more of the credentials presented by the user could not be validated. Many different errors can cause this. A more specific error is returned in the errors array of the Read Credential Verification Credential Data or Read Credential Verification Session Data response. |
| UNEXPECTED_ERROR | An unexpected error occurred during credential verification. |
Response codes
| Code | Message |
|---|---|
| 200 | Successful operation. |
| 400 | The request could not be completed. |
| 401 | You do not have access to this resource. |
| 403 | You do not have permissions or are not licensed to make this request. |
| 404 | The requested resource was not found. |
| 500 | Unexpected server error. |
Create Credential Verification Session (OPENID4VP)
Create Credential Verification Session (NATIVE)
Create Credential Verification Session (NATIVE - Push Notification)
Read One Credential Verification Status
Read Credential Verification Credential Data
Read Credential Verification Session Data
Delete Credential Verification Session
Working with PingOne APIs
If you want to start building your own workflows with PingOne APIs, the Workflow Library provides step-by-step workflows with linked Postman collections to help you start using the PingOne APIs in your Postman environment. For information about how PingOne secures APIs, resources, and data, and what you can do to implement security measures for your PingOne deployment and applications, refer to Platform security.
If you're new to PingOne and have not set up your test environment, refer to PingOne for Developers Getting Started. This guide helps you get an admin access token, which is required to make API calls to PingOne Credentials API resources.
PingOne API domains
This section discusses how PingOne API regional endpoints are entered in the domain name system (DNS). In DNS, and in our endpoints, the domain part of the uniform resource locator (URL) comprises three parts separated by periods, such as api.pingone.com: one of our service-specific subdomains, our PingOne domain name of pingone, and one of our top level domains.
We use Postman variables to manage this variety of domain parts in PingOne API endpoints. The later discussion is correct regarding the domain part that the variables evaluate to. However, to ease maintenance, the Postman environment template you get when you download a collection uses variables to isolate the TLD from the rest of the domain part and to isolate the domain part from the rest of the endpoint.
The environment template has a path variable for each subdomain. Each path variable uses another variable, {{tld}}, for the top level domain (TLD). Such as https://api.pingone.com/v1 for {{apiPath}}. The tld variable is first in the environment template that you downloaded.
The table below shows the top level domain value for each region. To change your region, simply change the default {{tld}} value from com to your region's TLD.
| Region | Code | Top level domain |
|---|---|---|
| North America region (excluding Canada) | NA | com (default) |
| Canada region | CA | ca |
| European Union region | EU | eu |
| Australia region | AU | com.au |
| Singapore region | SG | sg |
| Asia-Pacific region | AP | asia |
The PingOne API includes the following domains:
| Domain | Postman path variable | Description |
|---|---|---|
api.pingone.{{tld}}/v1 |
{{apiPath}} |
The primary domain for calling PingOne Management API resource server. Note: /v1 is required for {{apiPath}}. |
auth.pingone.{{tld}} |
{{authPath}} |
The authorization and authentication server domain called to request the access token required to authenticate PingOne API requests. Note: do not include /v1 for {{authPath}}. |
orchestrate-api.pingone.{{tld}}/v1 |
{{orchestratePath}} |
The primary domain for calling the PingOne DaVinci Management API resource server. Note: /v1 is required for {{orchestratePath}}. |
scim-api.pingone.{{tld}}/v1 |
{{scimPath}} |
PingOne API service for Cross-domain Identity Management (SCIM). Note: /v1 is required for {{scimPath}}. |
The {{...Path}} variable in the sample requests stand for the PingOne service endpoint. Refer to Public endpoints in the PingOne for Developers Foundations guide for more information.
The Try a Request feature
Our documentation for the PingOne APIs includes an interactive Try a Request feature. Try a Request enables you to configure and send a PingOne API request and get a response from within the documentation. This is a quick way to interactively test a PingOne API request without needing to use either Postman or the command line.
Requests in Authentication and Authorization APIs do not have the Try a Request feature due to a Cross-Origin Resource Sharing (CORS) constraint.
Calling the PingOne APIs from the command line
Each PingOne API request in the documentation includes an example request and response. By default, the example request is displayed using cURL. However, a number of coding languages are available in the associated drop-down list. If you want to run a request from the command line, you can select the coding language and copy the displayed request. You'll need to replace any variables in the request with the appropriate values before running the request.
Using Postman collection-level authorization
Most APIs require authorization to ensure that client requests access data securely. Postman can pass along whatever authorization details necessary for the method demanded by the endpoint. You can manually include authorization data in the header, body, or as parameters to a request. However, the easiest way is to use the Authorization tab in Postman. Select an authorization Type on that tab and Postman offers a dialog to gather the information required by that Type. When you run a request, Postman uses the information from the Authorization tab to automatically add the necessary authorization header, body, or parameters to the request. Postman offers the Authorization tab on requests, folders, and collections.
In PingOne collections, the authorization method is defined at the collection level. Only those requests that require a specific authorization method have authorization defined on the request (roughly 10% of PingOne requests). This allows you to easily change the authorization used for most requests. Refer to Postman Collection-Level Authorization for more information.
Postman and the PingOne APIs
We use Postman to create our PingOne Credentials API docs, and have supplied our Postman collections for you to download. There's also an accompanying Postman Environment template already populated with the variables used in the collections.
If you aren't currently using Postman, you can install the free version. Refer to Download Postman to install Postman, either locally, or in your browser.
Refer to The PingOne Credentials API Postman collections for the collections you can download or fork.
For more information about our Postman environment variables, refer to The PingOne Postman environment template.
You'll also find all of the Postman collections for our documented PingOne use cases in our Workflow Library.
The PingOne Postman collections
You can get the PingOne Credentials API Postman collection by following either of these methods for retrieving a Postman collection into your workspace:
-
Fork the collection into your workspace. Postman retains an association between the source and your fork. If we update the source collection, you can pull those changes into the fork in your workspace.
-
Import the collection into your workspace. This is a one-time transfer and retains no association to the source collection.
To retrieve a collection
Refer to The PingOne Credentials API collections on this page.
-
Click the collection's Run In Postman button.
-
At the prompt, click Fork Collection at the bottom of the dialog or click import a copy near the bottom of the dialog.

-
Follow the on-screen instructions to fork or import the collection. You're prompted to select a Postman workspace for the retrieved collection.
When you fork a Postman collection, you create a copy of it in a selected workspace. Forking a collection creates a linked version that synchronizes with its source collection. This synchronization is apparent when you click the three dots icon on the forked collection - you'll see Pull changes on the context menu. When you click Pull changes, Postman compares the fork to the source collection. If changes are available, you can pull those changes into your fork. If you also elect to watch the collection, you'll receive notifications when the source changes.
If you import a collection, a copy is created in the selected workspace with no link back to the source. The collection is static. This may be desirable for some use cases. For example, if you intend to keep and use only some requests in a collection, a link back to the source is not needed.
You're not limited to choosing one method or the other. You can fork a copy to track the source and import a copy for experimentation, if you like.
The PingOne Credentials API collections
These Postman collections include requests for all create, read, update, and delete (CRUD) operations for the PingOne Credentials APIs.
For more information about the Postman environment variables included when you download or fork one of our Postman collections, refer to The PingOne Postman environment template.
The PingOne Postman environment template
Our Postman collections use variables in the request URLs to specify the UUIDs for PingOne resources. When you click the Run in Postman button for a collection, these environment variables are included in your download or fork. Use these environment variables as a template to assign your PingOne resource UUIDs with the common variables used in many of the requests.
For more information about using Postman environments, refer to the following topic in the Postman documentation: Environments in Postman.
POST requests in the PingOne Credentials API Postman collections that create a resource and return a resource ID include a Postman script. This script automatically adds a resource variable to your active Postman environment, and uses the newly created ID as the value.
For example, the following request creates a new Credentials variable. This request URL contains variables for the API path and environment ID:
POST {{apiPath}}/environments/{{envID}}/variables
To run this request, you must ensure the {{apiPath}} in the Postman environment template has the regional top-level domain (TLD) associated with your organization. Refer to Variables you must value for more information.
Almost every request in PingOne requires an environment ID. If you are working primarily in one environment for testing purposes, you'll want to add your environment's UUID to your active Postman environment as the value for the {{envID}} variable.
Requests to PingOne Management API endpoints require a valid access token to authenticate the request. In the PingOne Postman collections, the token value is represented in the Postman environment template as the variable {{accessToken}}.
With the {{tld}} and {{envID}} variables defined in your Postman template, and with a valid token value defined in the {{accessToken}} variable, you can run the request shown above:
POST {{apiPath}}/environments/{{envID}}/variables
If the request is successful, Postman adds a {{variableID}} variable to the current Postman environment automatically, and associates the new user's id property value (the UUID of the new user) with this variable.
Notes about environment variables and security
It's important to understand how Postman allows you to Store and reuse values using variables. Postman has two values for each environment variable: an Initial value and a Current value. You'll want to pay particular attention to differences between Initial and current values. Initial values are saved to Postman's cloud, and available to anyone who has access to the environment. Current values are saved only locally and available only to you. Postman uses only the current value in requests. If an environment variable has an initial value but no current value, Postman doesn't copy it to the current value or use the initial value in the request, the request simply fails. In this case, you need to manually copy the initial value to the current value.
When you create a new variable with an initial value and save the environment, Postman autofills the current value. However, that is the only time that Postman autofills the current value. If you subsequently delete the current value, the variable is no longer valued in a request.
Saving initial values to the Postman cloud impacts security. These initial values are available to anyone who has access to the workspace. If a workspace is public, you have a security issue.
Postman's recommended solution to exposing secrets is to Store secrets in your Postman Vault. Remember that Postman uses only current values in requests.
Variables you must value
When you download or fork a PingOne Postman collection, your workspace receives a set of Postman environment variables for you to use as a template. The variables that represent a resource in PingOne automatically receive a value when you create a new PingOne resource using Postman. Our script associated with the request (shown on the request's Scripts tab) inserts the identifier of the resource it creates as the value of the variable associated with that resource. However, some variables essential to using Postman with PingOne do not have their values inserted automatically. You must manually add the correct value to these variables before making any requests in Postman:
| Postman variable | PingOne resource |
|---|---|
adminAppID |
The Client ID of the Worker app you created Create an admin Worker app connection. |
adminAppSecret |
The Client Secret of the Worker app created. |
adminEnvID |
The ID for the environment in which your Worker app resides. |
envID |
The ID for the environment in which you are running your Postman API requests. |
orgID |
The ID for your organization. In the PingOne admin console, select Environment and click Properties to view your organization ID. |
tld |
The top-level domain to use for your environment. This is used in URLs containing apiPath, authPath, orchestratePath, and scimPath. |
apiPath |
The regional domain for the PingOne management server (https://api.pingone.{{tld}}/v1). |
authPath |
The regional domain for the PingOne authorization and authentication server (https://auth.pingone.{{tld}}). |
orchestratePath |
The regional domain for the PingOne DaVinci management server (https://orchestrate-api.pingone.{{tld}}/v1). |
scimPath |
The regional domain for the PingOne SCIM management server (https://scim-api.pingone.{{tld}}). |