Onboard a user in the authenticated tenant.
curl --request POST \
--url https://test.didxtech.com/consumer-onboarding/api/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "user@example.com",
"username": "johndoe",
"firstName": "John",
"lastName": "Doe",
"externalIdentifier": "PARTNER-ID-12345"
}
'import requests
url = "https://test.didxtech.com/consumer-onboarding/api/users"
payload = {
"email": "user@example.com",
"username": "johndoe",
"firstName": "John",
"lastName": "Doe",
"externalIdentifier": "PARTNER-ID-12345"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'user@example.com',
username: 'johndoe',
firstName: 'John',
lastName: 'Doe',
externalIdentifier: 'PARTNER-ID-12345'
})
};
fetch('https://test.didxtech.com/consumer-onboarding/api/users', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://test.didxtech.com/consumer-onboarding/api/users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'user@example.com',
'username' => 'johndoe',
'firstName' => 'John',
'lastName' => 'Doe',
'externalIdentifier' => 'PARTNER-ID-12345'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://test.didxtech.com/consumer-onboarding/api/users"
payload := strings.NewReader("{\n \"email\": \"user@example.com\",\n \"username\": \"johndoe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"externalIdentifier\": \"PARTNER-ID-12345\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://test.didxtech.com/consumer-onboarding/api/users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"user@example.com\",\n \"username\": \"johndoe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"externalIdentifier\": \"PARTNER-ID-12345\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.didxtech.com/consumer-onboarding/api/users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"user@example.com\",\n \"username\": \"johndoe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"externalIdentifier\": \"PARTNER-ID-12345\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"email": "user@example.com",
"tempPassword": "Test@12345"
},
"links": {
"self": "<string>",
"first": "<string>",
"last": "<string>",
"prev": "<string>",
"next": "<string>",
"related": "<string>"
},
"meta": {},
"errors": [
{
"detail": "<string>",
"id": "<string>",
"status": "<string>",
"code": "<string>",
"title": "<string>",
"source": {
"pointer": "<string>",
"parameter": "<string>"
},
"meta": {}
}
]
}Consumer Onboarding API
Onboard a user in the authenticated tenant.
Creates or resolves a user by email and/or username. At least one of email or username must be provided. Behavior varies by combination — see 409 responses for conflict scenarios.
Onboard a user in the authenticated tenant.
curl --request POST \
--url https://test.didxtech.com/consumer-onboarding/api/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "user@example.com",
"username": "johndoe",
"firstName": "John",
"lastName": "Doe",
"externalIdentifier": "PARTNER-ID-12345"
}
'import requests
url = "https://test.didxtech.com/consumer-onboarding/api/users"
payload = {
"email": "user@example.com",
"username": "johndoe",
"firstName": "John",
"lastName": "Doe",
"externalIdentifier": "PARTNER-ID-12345"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'user@example.com',
username: 'johndoe',
firstName: 'John',
lastName: 'Doe',
externalIdentifier: 'PARTNER-ID-12345'
})
};
fetch('https://test.didxtech.com/consumer-onboarding/api/users', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://test.didxtech.com/consumer-onboarding/api/users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'user@example.com',
'username' => 'johndoe',
'firstName' => 'John',
'lastName' => 'Doe',
'externalIdentifier' => 'PARTNER-ID-12345'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://test.didxtech.com/consumer-onboarding/api/users"
payload := strings.NewReader("{\n \"email\": \"user@example.com\",\n \"username\": \"johndoe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"externalIdentifier\": \"PARTNER-ID-12345\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://test.didxtech.com/consumer-onboarding/api/users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"user@example.com\",\n \"username\": \"johndoe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"externalIdentifier\": \"PARTNER-ID-12345\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.didxtech.com/consumer-onboarding/api/users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"user@example.com\",\n \"username\": \"johndoe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"externalIdentifier\": \"PARTNER-ID-12345\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"email": "user@example.com",
"tempPassword": "Test@12345"
},
"links": {
"self": "<string>",
"first": "<string>",
"last": "<string>",
"prev": "<string>",
"next": "<string>",
"related": "<string>"
},
"meta": {},
"errors": [
{
"detail": "<string>",
"id": "<string>",
"status": "<string>",
"code": "<string>",
"title": "<string>",
"source": {
"pointer": "<string>",
"parameter": "<string>"
},
"meta": {}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
At least one of email or username must be provided.
Minimum string length:
1Pattern:
^[a-zA-Z0-9._-]+$Minimum string length:
1Send a Keycloak onboarding email (set password, verify email, strong auth). Defaults to true when an email is provided and the environment has onboarding contexts configured. Requires email.
Onboarding context key from the server-side registry. Defaults to 'me-wallet'.
Minimum string length:
1Strong-auth setup in the email stream. Defaults to the context's defaultStrongAuth.
Available options:
passkey, otp, skip 
