curl --request POST \
--url https://api.gominerva.com/clm/v1/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/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/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/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/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/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/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": {
"_v": 1,
"address1": "123 Main Street",
"address2": "",
"addressCity": "Toronto",
"addressPostalCode": "M5V1C2",
"addressState": "ON",
"allowlistUntil": "",
"archived": false,
"assignee": "",
"country": "Canada",
"createdAt": "2026-02-27T16:08:27Z",
"createdBy": "core-user-id",
"dateOfBirth": "1990/01/01",
"email": "john.smith@example.com",
"externalId": "external-customer-id",
"flags": [],
"id": "66c391b92888a0db5cc6d3f6",
"kind": "individual",
"lastScreenedTime": null,
"monitored": "monitored",
"name": "John Smith",
"nationality": "Canadian",
"occupation": "",
"organization": "",
"phone": "+15555555555",
"sex": "male",
"status": "not_screened",
"tenantId": "your-tenant-id",
"updatedAt": "2026-02-27T16:08:27Z",
"updatedBy": "core-user-id"
}
},
"status": 201
}Create Profile
The POST method on the resource group can be used to create a new profile without performing any initial screening. This method can be helpful for migrations or for synchronizing new profile creation from an admin system to Minerva profiles for the organization. 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/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/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/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/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/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/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/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": {
"_v": 1,
"address1": "123 Main Street",
"address2": "",
"addressCity": "Toronto",
"addressPostalCode": "M5V1C2",
"addressState": "ON",
"allowlistUntil": "",
"archived": false,
"assignee": "",
"country": "Canada",
"createdAt": "2026-02-27T16:08:27Z",
"createdBy": "core-user-id",
"dateOfBirth": "1990/01/01",
"email": "john.smith@example.com",
"externalId": "external-customer-id",
"flags": [],
"id": "66c391b92888a0db5cc6d3f6",
"kind": "individual",
"lastScreenedTime": null,
"monitored": "monitored",
"name": "John Smith",
"nationality": "Canadian",
"occupation": "",
"organization": "",
"phone": "+15555555555",
"sex": "male",
"status": "not_screened",
"tenantId": "your-tenant-id",
"updatedAt": "2026-02-27T16:08:27Z",
"updatedBy": "core-user-id"
}
},
"status": 201
}Authorizations
The Minerva API key used for this integration. Manage API keys in the Minerva dashboard under Administration > Developers.
Body
Profile creation request
The address line 1 of the known place of residence for the profile. This will be assembled with the address line 2 in the screening input for the "address" value.
"123 Main Street"
The address line 2 of the known place of residence for the profile. This will be assembled with the address line 1 in the screening input for the "address" value.
"Apt 4B"
The city of the known place of residence for the profile. This should be 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"
An optional parameter that indicating that the profile should be created in an allowlisted status. This means that the profile will not generate flags from ongoing monitoring until a certain date in the future, as denoted in "YYYY/MM/DD" format. If this parameter is not provided, then the profile is created in a non-allowlisted state where future 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. This is not used in screening currently but can be used to store this value in the persistent profile record for cross-referencing purposes.
"john.smith@example.com"
An optional external reference ID that can be supplied in the profile creation, such that it can be more easily cross-referenced with external systems.
"123456789"
The first name of the profile. This will be assembled with the last name in the screening input for the "name" value. Deprecated: Use the Name field instead.
"John"
Should be "individual" or "organization". This refers to the entity type in Minerva screening, where an individual is a natural person and an organization is an entity.
"individual"
The last name of the profile. This will be assembled with the first name in the screening input for the "name" value. Deprecated: Use the Name field instead.
"Smith"
The middle name of the profile. This can be optionally provided as a part of the profile name, and will be assembled with the first and last names in the screening input for the "name" value. Deprecated: Use the Name field instead.
"Michael"
Should be "monitored", "not_monitored", or an empty string. If "monitored", then the profile is enrolled in ongoing monitoring where review tasks may be generated for any potential risks found during screening on regular cadences.
"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. Should be "f" for Female, "m" for Male, "o" for Other, and 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"
}
}