curl --request POST \
--url https://api.gominerva.com/clm/v1/onboarding/profiles \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "Alex Morgan",
"kind": "individual",
"profileCustomFields": {
"loan_number": "LN-2026-0042",
"loan_status": "funded",
"servicing_details": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}
}
'import requests
url = "https://api.gominerva.com/clm/v1/onboarding/profiles"
payload = {
"name": "Alex Morgan",
"kind": "individual",
"profileCustomFields": {
"loan_number": "LN-2026-0042",
"loan_status": "funded",
"servicing_details": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Alex Morgan',
kind: 'individual',
profileCustomFields: {
loan_number: 'LN-2026-0042',
loan_status: 'funded',
servicing_details: {portfolio: 'Prime', boardingDate: '2026-08-27'}
}
})
};
fetch('https://api.gominerva.com/clm/v1/onboarding/profiles', 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://api.gominerva.com/clm/v1/onboarding/profiles",
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([
'name' => 'Alex Morgan',
'kind' => 'individual',
'profileCustomFields' => [
'loan_number' => 'LN-2026-0042',
'loan_status' => 'funded',
'servicing_details' => [
'portfolio' => 'Prime',
'boardingDate' => '2026-08-27'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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://api.gominerva.com/clm/v1/onboarding/profiles"
payload := strings.NewReader("{\n \"name\": \"Alex Morgan\",\n \"kind\": \"individual\",\n \"profileCustomFields\": {\n \"loan_number\": \"LN-2026-0042\",\n \"loan_status\": \"funded\",\n \"servicing_details\": {\n \"portfolio\": \"Prime\",\n \"boardingDate\": \"2026-08-27\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://api.gominerva.com/clm/v1/onboarding/profiles")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Alex Morgan\",\n \"kind\": \"individual\",\n \"profileCustomFields\": {\n \"loan_number\": \"LN-2026-0042\",\n \"loan_status\": \"funded\",\n \"servicing_details\": {\n \"portfolio\": \"Prime\",\n \"boardingDate\": \"2026-08-27\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gominerva.com/clm/v1/onboarding/profiles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Alex Morgan\",\n \"kind\": \"individual\",\n \"profileCustomFields\": {\n \"loan_number\": \"LN-2026-0042\",\n \"loan_status\": \"funded\",\n \"servicing_details\": {\n \"portfolio\": \"Prime\",\n \"boardingDate\": \"2026-08-27\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"msg": "OK",
"result": {
"profile": {
"id": "66c391b92888a0db5cc6d3f6",
"name": "Alex Morgan",
"profileCustomFields": [
{
"key": "loan_number",
"label": "Loan Number",
"type": "text",
"value": "LN-2026-0042"
},
{
"key": "loan_status",
"label": "Loan Status",
"type": "enum",
"value": "funded",
"valueLabel": "Funded"
},
{
"key": "servicing_details",
"label": "Servicing Details",
"type": "json",
"value": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}
]
}
},
"status": 201
}Create and screen a profile
Creates a new profile and screens it in the same call, so the profile can carry onboarding review tasks and be enrolled in ongoing monitoring. Supply organization-defined values in profileCustomFields, keyed by immutable definition key. The request retrieves the latest definitions before validation, so newly required fields, archives, types, and Choice values are enforced. Unknown or archived keys and wrong types return HTTP 400; if definitions cannot be retrieved, the write is rejected.
curl --request POST \
--url https://api.gominerva.com/clm/v1/onboarding/profiles \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "Alex Morgan",
"kind": "individual",
"profileCustomFields": {
"loan_number": "LN-2026-0042",
"loan_status": "funded",
"servicing_details": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}
}
'import requests
url = "https://api.gominerva.com/clm/v1/onboarding/profiles"
payload = {
"name": "Alex Morgan",
"kind": "individual",
"profileCustomFields": {
"loan_number": "LN-2026-0042",
"loan_status": "funded",
"servicing_details": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Alex Morgan',
kind: 'individual',
profileCustomFields: {
loan_number: 'LN-2026-0042',
loan_status: 'funded',
servicing_details: {portfolio: 'Prime', boardingDate: '2026-08-27'}
}
})
};
fetch('https://api.gominerva.com/clm/v1/onboarding/profiles', 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://api.gominerva.com/clm/v1/onboarding/profiles",
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([
'name' => 'Alex Morgan',
'kind' => 'individual',
'profileCustomFields' => [
'loan_number' => 'LN-2026-0042',
'loan_status' => 'funded',
'servicing_details' => [
'portfolio' => 'Prime',
'boardingDate' => '2026-08-27'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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://api.gominerva.com/clm/v1/onboarding/profiles"
payload := strings.NewReader("{\n \"name\": \"Alex Morgan\",\n \"kind\": \"individual\",\n \"profileCustomFields\": {\n \"loan_number\": \"LN-2026-0042\",\n \"loan_status\": \"funded\",\n \"servicing_details\": {\n \"portfolio\": \"Prime\",\n \"boardingDate\": \"2026-08-27\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://api.gominerva.com/clm/v1/onboarding/profiles")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Alex Morgan\",\n \"kind\": \"individual\",\n \"profileCustomFields\": {\n \"loan_number\": \"LN-2026-0042\",\n \"loan_status\": \"funded\",\n \"servicing_details\": {\n \"portfolio\": \"Prime\",\n \"boardingDate\": \"2026-08-27\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gominerva.com/clm/v1/onboarding/profiles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Alex Morgan\",\n \"kind\": \"individual\",\n \"profileCustomFields\": {\n \"loan_number\": \"LN-2026-0042\",\n \"loan_status\": \"funded\",\n \"servicing_details\": {\n \"portfolio\": \"Prime\",\n \"boardingDate\": \"2026-08-27\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"msg": "OK",
"result": {
"profile": {
"id": "66c391b92888a0db5cc6d3f6",
"name": "Alex Morgan",
"profileCustomFields": [
{
"key": "loan_number",
"label": "Loan Number",
"type": "text",
"value": "LN-2026-0042"
},
{
"key": "loan_status",
"label": "Loan Status",
"type": "enum",
"value": "funded",
"valueLabel": "Funded"
},
{
"key": "servicing_details",
"label": "Servicing Details",
"type": "json",
"value": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}
]
}
},
"status": 201
}Authorizations
The Minerva API key used for this integration. Manage API keys in the Minerva dashboard under Administration > Developers.
Body
Profile onboarding request
Address line 1 of the profile's known place of residence. Combined with address line 2 to form the "address" value in the screening input.
"123 Main Street"
Address line 2 of the profile's known place of residence. Combined with address line 1 to form the "address" value in the screening input.
"Apt 4B"
The city of the profile's known place of residence. Supply the full city name.
"Toronto"
The postal code of the known place of residence for the profile.
"M5V1C2"
The ISO-2 code or full state name of the place of residence of the profile.
"ON"
Optional. Creates the profile in an allowlisted state, so ongoing monitoring generates no flags until the date you specify in "YYYY/MM/DD" format. If omitted, the profile is created in a non-allowlisted state, where later screens may generate review tasks.
"2024/12/25"
false
"12345-123"
The known country of residence for the profile.
"Canada"
"12345-123"
The date of birth of the profile in "YYYY/MM/DD" format.
"1990/01/01"
The email of the profile. Screening does not use this value, but you can store it on the persistent profile record for cross-referencing.
"john.smith@example.com"
Optional external reference ID supplied at profile creation, so the profile can be cross-referenced with external systems.
"123456789"
The first name of the profile. Combined with the last name to form the "name" value in the screening input.
Deprecated: use the name field instead.
"John"
One of "individual" or "organization", the entity type in Minerva screening. An individual is a natural person; an organization is an entity.
"individual"
The last name of the profile. Combined with the first name to form the "name" value in the screening input.
Deprecated: use the name field instead.
"Smith"
The middle name of the profile. Optional. Combined with the first and last names to form the "name" value in the screening input.
Deprecated: use the name field instead.
"Michael"
One of "monitored", "not_monitored", or an empty string. When "monitored", the profile is enrolled in ongoing monitoring, where screening on a regular cadence may generate review tasks for potential risks.
"monitored"
Legacy fields (keeping for backward compatibility)
"John Smith"
The nationality of the profile, being one of the known citizenships of the profile.
"American"
The known occupation or job title of the natural person.
"Software Engineer"
The affiliated organization or employer of the natural person.
"MinervaAI"
The phone number in e.164 standard format for the profile (+15555555555)
"+15555555555"
The known sex of the natural person, as reported on an onboarding document. Use "f" for Female, "m" for Male, "o" for Other, or leave empty for Unknown.
"m"
"pending"
"12345-123"
Workspace-scoped profile group IDs assigned to this profile for dynamic risk segmentation. A profile can belong to multiple groups.
[
"665f0d4c2d2f7c2b2f2f2f31",
"665f0d4c2d2f7c2b2f2f2f32"
]
Organization-defined profile values keyed by immutable definition key. Every write retrieves the latest definitions before validation. Unknown or archived keys and wrong types return HTTP 400; if definitions cannot be retrieved, the write is rejected. Omitted keys remain unchanged on PATCH, and null clears one named value. Required fields are enforced on profile creation and onboarding.
Show child attributes
Show child attributes
{
"loan_number": "LN-2026-0042",
"loan_status": "funded",
"servicing_details": {
"portfolio": "Prime",
"boardingDate": "2026-08-27"
}
}