API Reference
The following describes the APIs used with FIDO Pre-reg integrations when requesting credentials and shipment of enrolled YubiKeys.
Authentication
To authenticate to the YubiKey as a Service API and the FIDO Connector API, you will use an API caller authentication token (YED_API_Token). To create the API token, sign in to the Customer Portal with the account for the application that will be calling the APIs. See API Caller Account Setup.
FIDO Connector API
The FIDO Connector is deployed in the customer’s Azure environment, and provides APIs for credential requests. The API is called from processes and workflows to handle orchestration of credential requests from an IdP and shipment requests from Yubico.
Each deployment of the FIDO Connector will have its own instance of the API. The base URL is derived from the URL provided by the Container app service, and will be unique for each deployment. API calls will go to something like in the example below.
Base URL (example): https://company-fido-connector.azurecontainerapps.io/…
Create Credential Request
VERSION 2.0 (Current)
Provides the ability to create a request for both Yubico-managed and local on-site trusted agents programming of credentials onto a YubiKey using a mobile device. If desired, the request can include shipment requests for one or more enrolled YubiKeys. You can add multiple credentials to the same YubiKey, and request enrollment to multiple IdPs.
The authenticator in this context is a security application or device, for example a YubiKey. A credential is the authentication private/public key pair. One authenticator can have multiple credentials, and each credential correlates to a user ID and relying-party ID pair. A credential request is a request for creating a credential in the Yubico Enrollment service.
In the FIDO Connector API, all requests are credential requests, where some might also include shipments of physical YubiKeys. This means that there will always be a credential ID, and if shipment is included, there will also be a shipment ID. shipment_items is used for Yubico-managed programmed FIDO Pre-reg shipments, while authenticators is used for local on-site programming of credentials onto a YubiKey without involving any shipping. Both shipment and authenticators can be included in a request.
When multiple credentials are registered on the same security key, the credential requests are processed in the same order as added in the authenticators.credentials array, and the responses are sent back in the same order. To control the order of the credentials used when signing in, for example in cases where the most recently registered credential is automatically used first, ensure to place the requests in the desired order in the authenticators.credentials array.
The endpoint receives the credentials, the authenticators, and if there are physical YubiKeys to be shipped, associated information for these. A recipient email address is required if the request involves a YubiKey shipment. The credential object contains a list of the names of the authenticators and/or YubiKeys to which the credentials will be added.
The FIDO Connector accepts any PIN length between 4 and 63 characters (inclusive). A 6-digit PIN is often used by mobile operating systems to increase authentication security, while remaining manageable to memorize by end users. Note that if the YubiKey is for example a YubiKey FIPS and requires 8 characters, the programming will set the length to 8.
Endpoint: POST /v2/credential-requests
Request body
{
"recipient": {
"email": "firstname.lastname@example.com",
"first_name": "Firstname",
"last_name": "Lastname",
"company": "Example Corporation",
"telephone": "+123456789",
"external_id": "firstname.lastname@example.com"
},
"enrollment_contacts": {
"emails_to": [
"firstname.lastname@example.com", "itadmin@example.com"
]
},
"shipment": {
"delivery_type": 1,
"reseller_organization_id": "100",
"customer_reference": "Cost center 123",
"address_validation_bypass": false,
"mailing_address": {
"street_line1": "#123 Street Name",
"street_line2": "Unit #456",
"postal_code": "98765",
"city": "City Name",
"region": "MA",
"country_code": "US"
},
"shipment_items": [
{
"name": "My YubiKey",
"customization_id": "ABC123",
"product_id": "1",
"inventory_product_id": "789",
"pin_request": {
"length": 6,
"type": "generate"
},
"credentials": [
{
"idp_id": "entraid",
"user_id": "firstname.lastname@example.com"
},
{
"idp_id": "pingone",
"relying_party_id": "pingone",
"user_id": "firstname.lastname@example.com"
}
]
}
]
},
"authenticators": [
{
"name": "My passkey",
"customization_id": "DEF456",
"preferred_authenticator_type": "software",
"pin_request": {
"min_length": 6,
"entry_method": "user_entered",
"delivery_method": "app"
},
"credentials": [
{
"idp_id": "entraid",
"user_id": "firstname.lastname@example.com"
},
{
"idp_id": "pingone",
"relying_party_id": "pingone",
"user_id": "firstname.lastname@example.com"
}
]
}
]
}
Parameters
recipientThe end-user receiving the pre-enrolled YubiKey and/or credentials:emailRequired. Used for Yubikey as a Service emails such as delivery notifications for shipment of physical keys.first_nameRequired.last_nameRequired.companyOptional. Either the company name or recipient name is required, you can provide both if shipping to a commercial/business address.telephoneRequired. Supported characters are +, (, ), and digits 0 - 9. Dashes are accepted but not recommended. Up to 40 characters allowed. Passed on to the delivery carrier to be used if there is an issue with delivering a package. Yubico does not use this field to contact the user.external_idOptional. Unique identifier for the recipient for which the credentials are requested, for example defined by the organization’s HR system. Can be for example the end user’s email address.
enrollment_contactsA list of email addresses to, for example the end user or the security administrator, where the PIN is sent:emails_toRequired. List of valid email addresses, should at least include one email address, does not have to be the same as the recipient email.
shipmentRequired ifauthenticatorsis not provided (shipment-only request), otherwise optional:delivery_typeOptional, if provided should be either “1” - standard (default), or “2” - expedited.reseller_organization_idOptional, the organization ID of the channel partner (distributor/reseller) in the Delivery service. Use the Get all channel partners relevant to an org API to retrieve this.customer_referenceOptional, customer-provided reference information, see Customer Reference Field.address_validation_bypassOptional, “true/false”, see Address Validation Override.mailing_addressFor shipment of physical keys:street_line1Required, first line of address, see Address Field Limitations.street_line2Optional, second line of address. Can be used for long addresses, or to capture door code or other building access information, see Address Field Limitations.postal_codeRequired, cannot be empty, space is accepted. For shipments to countries without postal codes, enter “00000”.cityRequired.regionOptional, required for shipments going to the US, Canada, and US international military bases. Two-letter USPS region code, see USPS Region/State Codes.country_codeRequired. Two-letter country code, see Country Codes.
shipment_itemsUsed for shipment of Yubico-programmed YubiKeys:nameOptional, reference name sent to the IdP. Used as passkey name in Entra and device nickname in PingOne. If not provided, “Pre-Reg YubiKey” + serial number will be used as default.customization_idOptional, ID associated with the programming, see Customizations.product_idRequired, ID of the YubiKey product model, see Product and Inventory Identifiers.inventory_product_idRequired, the subscription ID associated with the delivery, see Product and Inventory Identifiers.pin_requestOptional, defines the YubiKey PIN requirements. Default values only apply if at least the object is provided. Otherwise, the request is sent without the PIN request data. If an incomplete object is provided, the defaultlengthvalue is “6”.lengthOptional, if provided, should be equal to or greater than “4” and equal to or less than “63”. The length of the PIN to be randomly generated and set on a YubiKey. Note this is not the YubiKey firmware setting of minimum PIN length. If alengthis requested that is less than the YubiKey setting of minimum PIN length, a PIN meeting that requirement will be generated.typeOnly “generate” is supported for shipments of physical keys.
credentialsRequired, information associated with the credentials:idp_idOptional, used for multi-IdP deployments. Default value is configurable through theIDP_DEFAULTenvironment variable, see identity provider integration guides.relying_party_idOptional, default value can be configured in the IdP implementation. Used for example for PingOne, see configuring PingOne PingID.user_idID of the end user in the relying party that the credential is being created for. Examples: For Entra ID, the UPN or user object ID; for PingOne, the PingOne PingID username.
authenticatorsOptional, required ifshipmentis not provided (credential-only request):nameOptional authenticator “nickname”. If not provided, the default ”Pre-Reg YubiKey” will be used..customization_idOptional, ID associated with the programming, see Customizations.preferred_authenticator_typeOptional, if provided can be either “hardware”, passkey on a physical key (default), or “software”, passkey on for example a mobile device.pin_requestOptional, defines whether a PIN is required or not. Default values only apply if at least the object is provided. Otherwise, the request is sent without the PIN request data. If an incomplete object is provided, the default value is “6”:min_lengthOptional, if provided, should be equal to or greater than “4” and equal or less than “63”.entry_methodOptional, can be either “generated” (default), pre-programmed, or “user_entered”, entered during on-site enrollment.delivery_methodOptional, if provided should be either “none”, “app”, or “email”.
credentialsRequired, information associated with the credentials:idp_idOptional, used for multi-IdP deployments. Default value is configurable through theIDP_DEFAULTenvironment variable, see identity provider integration guides.relying_party_idOptional, default value can be configured in the IdP implementation. Used for example for PingOne, see configuring PingOne PingID.user_idID of the end user in the relying party that the credential is being created for.
Success response body
{ "data": { "credential_request_id": "123abc-...", "shipment_id": "123xyz..." }
data.credential_request_idThe ID of the created credential request.data.shipment_idThe ID of the created shipment request. Only included ifshipmentis a request parameter.
Error response body
{ "error_code": "error type", "error_message": "error message", "error_data": { "key": "value" } }
Response messages
201Created400Validation Failed or Propagated401Unauthorized on FIDO Connector500Unexpected error or failure authenticating with Enrollment service
Example 1: Shipment-only Request
In this example scenario, two enrolled YubiKeys are shipped directly to a new employee working remotely. The request includes shipment of a YubiKey 5 NFC (“product_id”: “1”), and a YubiKey 5C NFC ("product_id": "29"), to the end user who is registered in the organizations IdP ("user_id") Entra ID.
The keys are programmed by Yubico and shipped to the end user’s home address. The 6-digit PIN ("length": 6)`` for each YubiKey is delivered through email to the end user. The request body contains a shipment object with two items.
{
"recipient": {
"email": "enduser1@example.com",
"first_name": "Firstname",
"last_name": "Lastname",
"company": "Example Corporation",
"telephone": "+123456789",
"external_id": "enduser1@example.com"
},
"enrollment_contacts": {
"emails_to": [
"enduser1@example.com"
]
},
"shipment": {
"delivery_type": 1,
"customer_reference": "Cost center 123",
"address_validation_bypass": false,
"mailing_address": {
"street_line1": "#123 Street Name",
"street_line2": "Unit #456",
"postal_code": "98765",
"city": "City Name",
"region": "MA",
"country_code": "US"
},
"shipment_items": [
{
"name": "Primary YubiKey",
"customization_id": "ABC123",
"product_id": "1",
"inventory_product_id": "133",
"pin_request": {
"length": 6,
"type": "generate"
},
"credentials": [
{
"user_id": "enduser1@example.com"
}
]
},
{
"name": "Backup YubiKey",
"customization_id": "ABC123",
"product_id": "29",
"inventory_product_id": "133",
"pin_request": {
"length": 6,
"type": "generate"
},
"credentials": [
{
"user_id": "enduser1@example.com"
}
]
}
]
}
}
Example 2: Credential-only Request
The following shows a request in a scenario where a security administrator enrolls a YubiKey on-site, on behalf of an end user who has lost their YubiKey, and is present in person. The end user is registered in the organization’s IdP ("user_id") PingOne. The security administrator already has the YubiKey, so no shipment is involved, and the security administrator is acting as a trusted agent, performing the programming of the YubiKey.
The request is received by the Enroll app (LEA), and the security administrator uses the app on a mobile device to program the credentials onto the key ("preferred_authenticator_type": "hardware"). During the enrollment, the end user enters a PIN of their choice ("entry_method": "user_entered") in the mobile device. The enrolled YubiKey is then handed over to the end user. The request body contains an authenticators object with one credential item.
{
"recipient": {
"email": "enduser@pingone.com",
"first_name": "Firstname",
"last_name": "Lastname",
"company": "Example Corporation",
"telephone": "+46123456789",
"external_id": "enduser@pingone.com"
},
"enrollment_contacts": {
"emails_to": [
"enduser@pingone.com, securityadmin@example.com"
]
},
"authenticators": [
{
"name": "Replacement YubiKey",
"customization_id": "ABC123",
"preferred_authenticator_type": "hardware",
"pin_request": {
"min_length": 6,
"entry_method": "user_entered",
"delivery_method": "app"
},
"credentials": [
{
"user_id": "enduser@pingone.com"
}
]
}
]
}
Example 3: Shipment and Credential Request
The following is an example of a scenario where one enrolled YubiKey is shipped to the end user as a backup key, and another YubiKey is enrolled on site by a security administrator, using the Enroll app (LEA) on a mobile device, with the end user present in person.
The 6-digit PIN for the YubiKey that is enrolled on site is entered by the end user during the enrollment procedure ("entry_method": "user_entered"). The shipped YubiKey is programmed by Yubico ("entry_method": "generated"), and the PIN is provided via email to the end user and the security administrator ("enrollment_contacts.emails_to"). The request body contains a shipment and an authenticators object with one item in each.
{
"recipient": {
"email": "enduser@example.com",
"first_name": "Firstname",
"last_name": "Lastname",
"company": "Example Corporation",
"telephone": "+123456789",
"external_id": "enduser@example.com"
},
"enrollment_contacts": {
"emails_to": [
",enduser@example.com, securityadmin@example.com"
]
},
"shipment": {
"delivery_type": 1,
"customer_reference": "Cost center 123",
"address_validation_bypass": false,
"mailing_address": {
"street_line1": "#123 Street Name",
"street_line2": "Unit #456",
"postal_code": "98765",
"city": "City Name",
"region": "MA",
"country_code": "US"
},
"shipment_items": [
{
"name": "Backup YubiKey",
"customization_id": "ABC123",
"product_id": "29",
"inventory_product_id": "133",
"pin_request": {
"length": 6,
"type": "generate"
},
"credentials": [
{
"user_id": "enduser@example.com"
}
]
}
]
},
"authenticators": [
{
"name": "Primary YubiKey",
"customization_id": "ABC123",
"preferred_authenticator_type": "hardware",
"pin_request": {
"min_length": 6,
"entry_method": "user_entered",
"delivery_method": "app"
},
"credentials": [
{
"user_id": "enduser@example.com"
}
]
}
]
}
Example 4: Multi-IdP Credential-only Request
In this example, a security administrator for an organization that uses both IdPs Entra ID and PingOne, enrolls two credentials for an end user onto the same YubiKey, using the Enroll app (LEA) on a mobile device. After the programming, the security administrator hands over the YubiKey to the end user, so no shipment is involved here.
The credentials are added to the YubiKey ("preferred_authenticator_type": "hardware"). The security administrator enters a temporary PIN ("entry_method": "user_entered"), which is then emailed ("delivery_method": "email") to the provided email addresses. The request body contains an authenticators object with two credential items, one for each IdP respectively.
{
"recipient": {
"email": "enduser@example.com",
"first_name": "Firstname",
"last_name": "Lastname",
"company": "Example Corporation",
"telephone": "+46123456789",
"external_id": "enduser@example.com"
},
"enrollment_contacts": {
"emails_to": [
"enduser@example.com, securityadmin@example.com"
]
},
"authenticators": [
{
"name": "System XYZ security key",
"customization_id": "ABC123",
"preferred_authenticator_type": "hardware",
"pin_request": {
"min_length": 6,
"entry_method": "user_entered",
"delivery_method": "email"
},
"credentials": [
{
"idp_id": "entraid",
"user_id": "enduser@example.com"
},
{
"idp_id": "pingone",
"relying_party_id": "pingone.com",
"user_id": "enduser@example.com"
}
]
}
]
}
Version 1 - Create Credential Request
Version 1 of the Create Credential Request API is a credential-only request supporting local on-site programming by trusted agents of credentials using a mobile device. The API also supports the option to configure the credential creation flow to allow the end user to enter their PIN through the mobile device used in an on-site enrollment scenario.
Note
Version 1 of the FIDO Connector Create Credential API does not support multiple IdPs. By default the IdP configured in the environment variable IDP_DEFAULT will be used. To be able to connect to multiple IdPs, use the Create Credential Request version 2.0 API.
Endpoint: POST /v1/credential-requests
Request body
{
"recipient": {
"firstname": "Firstname",
"lastname": "Lastname",
"email": "firstname.lastname@example.com"
},
"credentials": [
{
"user_id": "firstname.lastname@example.com"
}
],
"pin_request": {
"min_length": 6
"entry_method": "user_entered"
},
"authenticator_name": "My passkey",
"customization_id": "ABC123",
"enrollment_contacts": {
"emails_to": ["firstname.lastname@example.com"]
}
}
Get Credential Request by ID
VERSION 2.0 (Current)
Provides the ability to view the status of a credential request with a specific ID in the FIDO Connector. The endpoint returns the status of programmed credentials, both programmed by Yubico as well as programmed on-site by trusted agents. The credential are returned as an array of authenticators and credentials.
If the request includes shipment of physical keys, the credential creation status for each YubiKey and the associated IdP included in the shipment are also returned.
Endpoint: GET /v2/credential-requests/{credential-request-id}
Success response body
{
"data": {
"credential_request_id": "9c8cb30f-bc7a-4e06-bfac...",
"state": "received",
"authenticators": [
{
"id": "fe0e64f2-eb18...",
"name": "My YubiKey",
"state": "processing",
"credentials": [
{
"idp_id": "pingone",
"relying_party_id": "pingone",
"user_id": "firstname.lastname@example.com",
"state": "activation_pending",
"error_message": "optional"
}
]
}
],
"shipment": {
“shipment_id”: “R9SJFBzFbMw...”,
"shipment_items": [
{
"id": "1",
"name": "YubiKey 5 NFC",
"state": "processing",
"credentials": [
{
"idp_id": "entraid",
"user_id": "firstname.lastname@example.com",
"state": "activation_pending",
"error_message": "optional"
},
{
"idp_id": "pingone",
"relying_party_id": "pingone",
"user_id": "firstname.lastname@example.com",
"state": "activation_pending",
"error_message": "optional"
}
]
}
],
"mailing_address": {
"street_line1": "#123 Street Name",
"street_line2": "Unit #456",
"postal_code": "98765",
"city": "City Name",
"region": "MA",
"country_code": "US"
}
}
}
}
Parameters
credential_request_idThe credential ID that was returned in the credential request response, see Create Credential Request.stateThe state of the credential request can be one of “received”, “started”, “complete”, “partial”, “failed”, or “cancelled”.authenticatorsOptional, for example one or more IdPs. If provided cannot be blank.authenticators.idThe ID of the created authenticator.authenticators.nameRequired, either a custom name or the default ”Pre-Reg YubiKey”.authenticators.stateThe state of the credential processing, can be one of “processing”, “complete”, “partial”, “failed”, or “cancelled”.shipmentOptional, be provided if a physical shipment is part of the request.shipment.shipment_itemsInformation provided to the IdP when the credential is sent back to the IdP.shipment_items.idThe ID of the shipment of physical items if included, returned in the credential request response, see Create Credential Request.shipment_items.stateThe state of the shipment of physical items, if included, can be one of “processing”, “complete”, “partial”, “failed”, or “cancelled”.
Error response body
{ "error_code": "error type", "error_message": "error message", "error_data": { "key": "value" } }
Response messages
200Success404Not Found401Unauthorized on FIDO Connector500Unexpected Error or Failure Authenticating with FPR
Version 1 - Get Credential Request by ID
Provides the ability to view the status of a credential request with a specific ID in the FIDO Connector.
Endpoint: GET /v1/credential-requests/{credential_request_id}
Success response body
{
"credential_request_id": "9c8cb30f-bc7a-4e06-bfac...",
"credential_request_state": "processing",
"credentials": [
{
"user_id": "firstname.lastname@example.com",
"relying_party_id": "pingone",
"idp_id": "pingone",
"credential_state": "activation_pending"
}
]
}
Check Deployment Status
VERSION 2.0 (Current)
Provides the status of deployment components. The response returns the configuration settings specific to the default IdP configured in the FIDO Connector.
When testing a deployment, you can first do a call to /v2/status to verify that the API is operational and the client can connect to it. It is also a way to ensure that some of the key properties provided during deployment are set.
Endpoint: GET /v2/status
Success Response Body
Example with Entra ID, PingOne PingID and PingOne AIC as IdPs.
{
"AZURE_STORAGE_BLOB_ENDPOINT": "https://....blob.core.windows.net/",
"AZURE_TABLES_SHIPMENTS_TABLE_NAME": "fprshipments",
"AZURE_TENANT_ID": "fe0e64f2-eb18...",
"CRON_PROCESS_SHIPMENT_SCHEDULE": "0 0 * * * *",
"CRON_PROCESS_CREDENTIAL_REQUESTS_SCHEDULE": "0 */12 * * * 0",
"CRON_DATA_CLEANUP_SCHEDULE": "0 30 * * * *",
"CRON_DATA_CLEANUP_COMPLETED_DAYS": "0",
"FIDO_CONNECTOR_VERSION": "2.0.0-rc5",
"LOGGING_LEVEL_COM_YUBICO": "DEBUG",
"EMAIL_API_SEND_ENDPOINT": "https://...westus2.logic.azure.com:443/...",
"YE_API_BASE_URL": "https://.../v1",
"YE_JWKS_SIGN_ENDPOINT": "https://.../.well-known/yubico-sign.jwks",
"YE_JWKS_TRANSPORT_ENDPOINT": "https://.../.well-known/yubico-transport-keys.jwks",
"RFPR_API_BASE_URL": "https://.../credentials/connector",
"RFPR_RETRY_NUMBER_DAYS": "1",
"ENROLLMENT_SUITE_API_BASE_URL": "https://...",
"IDP_DEFAULT": "ping-aic",
"IDP_ENABLE_MULTI_IDP": "true",
"IDP_CONFIGURATION_PATH": "idp-configuration.yaml",
"IDP_CONFIGURATIONS": {
"pingone": {
"default-relying-party": "pingone.com",
"api-base-url": "https://api.pingone.com/v1",
"environment-id": "c15efa10-4ebb...",
"pre-registration-timeout-days": 30,
"type": "pingone",
"client-id": "6941c5d6-495b...",
"auth-base-url": "https://auth.pingone.com"
},
"entraid": {
"api-version": "beta",
"graph-endpoint": "https://graph.microsoft.com",
"type": "entraid",
"challenge-timeout-minutes": 20160,
"client-id": "b7b32d87-b933...",
"tenant-id": "fe0e64f2-eb18...",
"online-endpoint": "https://login.microsoftonline.com"
},
"ping-aic": {
"journey": "WebAuthnPreReg-FIDOConnector",
"challenge-timeout-milliseconds": 1300000000,
"type": "ping-aic",
"api-base-url": "https://example.forgeblocks.com",
"authentication-header": "oidc_id_token",
"token-id-2": "IDToken2",
"token-id-1": "IDToken1",
"scope": "api://scope-api.onmicrosoft.com",
"realm": "alpha",
"client-id": "client-id-string",
"callback-1": "NameCallback",
"auth-base-url": "https://example.forgeblocks.com",
"callback-3": "HiddenValueCallback",
"callback-2": "MetadataCallback"
}
}
}
Response messages
200Success
Version 1 - Check Deployment Status
Endpoint: GET /v1/status
Success response body
Example with Microsoft Entra ID as IdP.
"AZURE_KEY_VAULT_ENDPOINT":"https://msfpr...azure.net"
"AZURE_TABLES_ENDPOINT":"https://msfpr...windows.net"
"AZURE_TABLES_SHIPMENTS_TABLE_NAME":"fprshipments"
"AZURE_TENANT_ID":"fe0e64f2..."
"CRON_PROCESS_SHIPMENT_SCHEDULE":"0 0 * * * *"
"CRON_DATA_CLEANUP_SCHEDULE":"0 30 * * * *"
"CRON_DATA_CLEANUP_COMPLETED_DAYS":"0"
"EMAIL_API_SEND_ENDPOINT":"https://prod...IhyfXyc"
"ENTRA_FIDO_API_CLIENT_ID": "123abc...",
"ENTRA_FIDO_API_VERSION": "string",
"ENTRA_FIDO_API_CHALLENGE_TIMEOUT_MINUTES": "string",
"LOGGING_LEVEL_COM_YUBICO":"INFO"
"YE_API_BASE_URL":"https://..."
"YE_JWKS_SIGN_ENDPOINT":"https://...sign.jwks"
"YE_JWKS_TRANSPORT_ENDPOINT":"https://...keys.jwks"
"FIDO_CONNECTOR_VERSION":"1.2.0"
Process Shipments
VERSION 2.0 (Current)/1.0 (no changes between versions 1 and 2)
Provides the ability to trigger on-demand the process of retrieving shipment responses from the Delivery service and process them. This API is useful if shipment processing needs to be run right away instead of waiting for the scheduled job.
Endpoint v2: GET /v2/operations/process-shipments
Endpoint v1: GET /v1/operations/process-shipments
Response messages
204Success, no content body.
Process Credential Request
VERSION 2.0 (Current)
Provides the ability to process and activate the credential request after fulfillment. When activated, the credential is ready to be used for authentication by the end user.
Endpoint: POST /v2/operations/process-credential-requests
Error response body
{ "error_code": "error type", "error_message": "error message", "error_data": { "key": "value" } }
Response messages
200Success401Unauthorized on FIDO Connector500Unexpected Error or Failure Authenticating with FPR
Version 1 - Process Credential Requests
Endpoint: POST /v1/operations/process-credential-requests
Response messages
204Success, no content body
Resend PIN
VERSION 2.0 (Current)
Provides the ability to resend the PIN email for all authenticators and shipment items that have a PIN response available in the Enrollment service.
Endpoint: POST /v2/credential-requests/{credential_request_id}/resend-pin
Error response body
{ "error_code": "error type", "error_message": "error message", "error_data": { "key": "value" } }
Response messages
200Success401Unauthorized on FIDO Connector500Unexpected Error or Failure Authenticating with FPR
Version 1 - Resend PIN
Endpoint: POST /v1/credential-requests/{credential_request_id}/resend-pin
Provides the ability to resend a PIN if this exists for a credential request. If there are multiple user IDs (userId) in the request, the IDs are provided in the email as a non-URL encoded comma-separated list.
Endpoint: GET /v1/operations/resend-pin/{shipment_id}
Provides the ability to resend the PIN email for a shipment_id. For a shipment request in complete or pending_pin_sending status, this operation retrieves the PIN response from the Delivery service and decrypts it to resend the PIN email.
Response messages
204Success, no content body
FIDO Connector API and FIDO Pre-reg
The YubiKey as a Service API provides an integration option to initiate the delivery of YubiKeys pre-enrolled by Yubico, using the FIDO Pre-reg service. This integration option does not involve the FIDO Connector, and is only used for shipment of physical YubiKeys.
The FIDO Connector extends the FIDO pre-reg part of the YubiKey as a Service API, and the same POST /v1/fpr/shipments endpoint is called by the FIDO Connector during the workflow processing. See example in the following.
Create Shipment Request
VERSION 1.0
Endpoint: POST /v1/fpr/shipments
Request body
{
"user_id": "firstname.lastname@example.com",
"pin_request": {
"type": "generate",
"length": 6,
},
"enrollment_contacts": {
"emails_to": ["firstname.lastname@example.com","itadmin@example.com"]
},
"yubico_shipment_request": {
"reseller_organization_id": "123456",
"delivery_type": 1,
"address_validation_bypass": false,
"recipient": {
"recipient_company": "Company name",
"recipient_email": "firstname.lastname@example.com",
"recipient_firstname": "First name",
"recipient_lastname": "Last name",
"recipient_telephone": "+123456789"
},
"mailing_address": {
"street_line1": "#123 Street Name",
"street_line2": "Unit #456",
"city": "City Name",
"region": "MA",
"postal_code": "98765",
"country_code_2": "US"
},
"shipment_items": [
{
"product_id": 1,
"inventory_product_id": 18,
"product_quantity": 1,
"customization_id": "ABC123",
"fc_additional_data": {
"yubikey_name": "MyYubiKey"
}
}
]
}
}
Parameters
user_idCan be provided either as Object ID, for example “user_id”: “123456-abc-123456-xyz”, or as UPN (User Principal Name), for example “user_id”: “firstname.lastname@example.com”.pin_requestValue can be between 4 and 63, inclusive.enrollment_contacts.emails_toList of strings of email addresses. Provides the ability to enter a list of email addresses to which the PIN can be sent. Using theenrollment_contactsobject is optional for every IdP implementation.Note
If using
enrollment_contacts.emails_towith Microsoft Entra, the default “Send Shipment Pin Azure Logic App” must be appropriately modified to useemailsTo.reseller_organization_idOptional, the organization ID of the channel partner (distributor/reseller) in the Delivery service. Use the Get all channel partners relevant to an org API to retrieve this.recipient_emailThe email to receive the PIN (not the principle object name).product_idRequired, ID of the YubiKey product model, see Product and Inventory Identifiers.inventory_product_idRequired, the subscription ID associated with the delivery, see Product and Inventory Identifiers.product_quantityThe number of YubiKeys to include.customization_idOptional, ID associated with the programming, see Customizations.yubikey_nameOptionally provides the ability to add a custom passkey name in a pre-registration request. The field will be displayed together with the serial number of the YubiKey. For example, if the input name is “Secondary” and the serial number is “1234567890”, this displays as “Secondary YubiKey: 1234567890”.If a custom name is provided, all characters must be ASCII and the field length must not exceed 18 characters. If a custom name is not provided, the default name “Pre-Reg YubiKey: {SERIAL}” is displayed.
Success response
201- Response body:
Created shipment_id from Delivery service {"data":{"shipment_id":"String"}}
Error response
401Unauthorized400Bad Request- Response body examples:
{"error_code":"ye_error","error_message":"Validation error when creating YED shipment","error_data":{"code":"validation_error","message":"Input for Last Name exceeded limit of 20 characters"}} {"error_code":"api_error","error_message":"PIN `length` must be between 4 and 8","error_data":{"error_type":"validation"}} {"error_code":"idp_error","error_message":"Could not find user: 7dc95e2f-53-..."}
Get Shipment Request Status
VERSION 1.0
Provides the ability to get the processing state of a shipment_id created through the Create Shipment Request API.
Endpoint: GET /v1/fpr/shipments/{shipment_id}
Success response
200Response body:
{ "shipment_id": "R9SJFBzFbMw...", "shipment_state": "processing" }
Error response
Response body:
{ "shipment_id": "string", "shipment_state": "string", "error_kind": "string", "error_message": "string" }
The request can have the following states in the FIDO Connector:
| shipment_state | Description |
|---|---|
ongoing
|
The request has been created in the Delivery
Service with a Shipment ID.
Fulfillment operations and credential
creation are in progress with the IdP.
|
complete
|
Response from the Delivery Service has been
received, the credential has been
created on the YubiKey and successfully
registered with the IdP.
|
pending_pin_sending
|
The credential has been activated but
there is a PIN sending failure.
|
If a processing error has been encountered it will be saved in the fprshipments table and returned by the API. Details about the encountered error are provided in error_kind and error_message as described in the following.
| Error | Description |
|---|---|
error_kind
|
This field will contain a string value
“GENERAL” if an error has been
encountered during processing.
|
error_message
|
This field will contain a string value
that has the detailed error message
returned by the Delivery Service or
the IdP.
|