Get normalized enrichment
curl --request GET \
--url http://api.gu1.ai/entities/{id}/normalized-enrichment \
--header 'Authorization: Bearer <token>'import requests
url = "http://api.gu1.ai/entities/{id}/normalized-enrichment"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://api.gu1.ai/entities/{id}/normalized-enrichment', 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 => "http://api.gu1.ai/entities/{id}/normalized-enrichment",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://api.gu1.ai/entities/{id}/normalized-enrichment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://api.gu1.ai/entities/{id}/normalized-enrichment")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://api.gu1.ai/entities/{id}/normalized-enrichment")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"entityId": "<string>",
"organizationId": "<string>",
"entityType": "<string>",
"normalizedData": {},
"normalizedMetrics": {},
"providersUsed": [
{}
],
"dataQualityScore": 123,
"confidenceScore": 123,
"completenessScore": 123,
"conflicts": [
{}
],
"createdAt": "<string>",
"updatedAt": "<string>"
}API Reference
Get normalized enrichment
Read the Gu1-normalized dossier for an entity β consolidated fields from enrichments already run, without calling those integrations again.
GET
/
entities
/
{id}
/
normalized-enrichment
Get normalized enrichment
curl --request GET \
--url http://api.gu1.ai/entities/{id}/normalized-enrichment \
--header 'Authorization: Bearer <token>'import requests
url = "http://api.gu1.ai/entities/{id}/normalized-enrichment"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://api.gu1.ai/entities/{id}/normalized-enrichment', 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 => "http://api.gu1.ai/entities/{id}/normalized-enrichment",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://api.gu1.ai/entities/{id}/normalized-enrichment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://api.gu1.ai/entities/{id}/normalized-enrichment")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://api.gu1.ai/entities/{id}/normalized-enrichment")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"entityId": "<string>",
"organizationId": "<string>",
"entityType": "<string>",
"normalizedData": {},
"normalizedMetrics": {},
"providersUsed": [
{}
],
"dataQualityScore": 123,
"confidenceScore": 123,
"completenessScore": 123,
"conflicts": [
{}
],
"createdAt": "<string>",
"updatedAt": "<string>"
}Overview
Returns the latest persisted normalized dossier for an entity: one Gu1-shaped JSON (normalizedData) merged from every enrichment that has already run on that entity.
This endpoint is a read. It does not call external integrations and does not consume enrichment credits. To populate or refresh the dossier, use Execute enrichment.
Use this when you need the canonical profile (PEP flags, sanctions, addresses, legal proceedings, and the same paths rules use as enrichmentData.normalized.*). For the last mapped/raw payload keyed by integration code, use Get current enrichment data.
Requires granular permission entities:read on the API key (legacy fallback entities:read).
Endpoint
GET https://api.gu1.ai/entities/{id}/normalized-enrichment
Authentication
Authorization: Bearer YOUR_API_KEY
Path parameters
string
required
Gu1 entity UUID.
Response
Envelope:{ "success": true, "data": { ... } }.
string
UUID of the normalized enrichment row.
string
Entity UUID.
string
Organization UUID.
string
person or company.NormalizeType
Flattened Gu1 normalize contract:
RootData β© consolidator arrays β© *Summary objects on the same JSON object (not nested as { root, consolidated }). Same keys rules read as enrichmentData.normalized.*. See normalizedData contract below. Extra legacy keys from older mappers may appear; new integrations should use this contract only.object
Completeness and confidence metrics recalculated on read for the entity country, plus optional
recommendations for further enrichments.array
Integration codes that contributed to this dossier (for example
br_cpf_enrichment). JSON field name is providersUsed.number
Overall quality score 0β100, when present.
number
Confidence score 0β100, when present.
number
Completeness score 0β100, when present.
array
Fields where sources disagreed and how Gu1 resolved them (
field, values, resolution, selectedValue, confidence).string
ISO 8601 timestamp of the row.
string
ISO 8601 timestamp of the last update.
normalizedData contract
Canonical TypeScript: NormalizeType = RootData & ToConsolidateType & SummariesType.
All keys are optional. Presence depends on entity type (person / company), country, and which enrichments ran. A missing key is βnot populatedβ, not false / 0.
type NormalizeType = RootData & ToConsolidateType & SummariesType;
enrichmentData.normalized.<key> (for example enrichmentData.normalized.isPep, enrichmentData.normalized.legalProceedings.$.type). Full path catalog: Rule conditions.
Provenance on consolidator rows
Every consolidator item typically includes:| Field | Type | Meaning |
|---|---|---|
sources | string[] | Integration codes that reported this row |
providers | string[] | Optional extra integration codes merged on consolidate |
confirmedByMultipleSources | boolean | true when 2+ sources agree |
confidence | number | 0β100 |
count | number | How many sources reported it (when present) |
Root (RootData)
Scalars on normalizedData (convenience flags + identity). Prefer consolidators for lists (riskFlags, sanctions, addresses).
PEP
| Key | Type | Entity | Notes |
|---|---|---|---|
isPep | boolean | both | Is or was PEP at any time |
isCurrentPep | boolean | both | Confirmed current PEP |
isPepPossible | boolean | both | Possible PEP (PIA code 2). Not a full PEP hit; do not treat as isCurrentPep |
pepLevels | string[] | both | Historical PEP levels (e.g. "1", "2") |
pepCountry | string | both | Country of PEP status |
pepPosition | string | person | Last known position |
pepComplianceRowCount | number | both | PEP rows returned for the tax ID (PIA) |
lastYearPEPOccurence | number | both | Occurrences last year |
last3YearsPEPOccurence | number | both | Last 3 years |
last5YearsPEPOccurence | number | both | Last 5 years |
| Key | Type | Entity |
|---|---|---|
sanctioned | boolean | both |
wasPreviouslySanctioned | boolean | both |
last30DaysSanctions / last90DaysSanctions / last180DaysSanctions / last365DaysSanctions | number | both |
terrorismRegistryMatch | boolean | both |
terrorismRegistryActive | boolean | both |
terrorismRiskLevel | 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL' | both |
hasAdverseMedia | boolean | both |
adverseMediaScore | number | both |
criminalRecords | boolean | both |
esgScore | number | both |
esgPositiveNewsCount / esgNegativeNewsCount | number | both |
| Key | Type | Entity |
|---|---|---|
taxId | string | both |
fullName / firstName / lastName | string | person |
idNumber / idType | string | person |
dateOfBirth | string | person |
age | number | person |
gender | 'male' | 'female' | 'unknown' | 'other' | person |
nationality | string | person |
isDeceased | boolean | both |
deathYear | number | person |
motherName / fatherName | string | person |
socialSecurityNumber | string | null | person |
email / phone / address / city / state / country / postalCode | string | both |
occupation / employer | string | person |
incomeRange / totalAssetsCategory | string | person |
| Key | Type | Entity |
|---|---|---|
legalName / tradeName | string | company |
registrationNumber / registrationCountry | string | company |
incorporationDate / inicioAtividade | string | company |
situationDate | string | company |
situation | 'ATIVA' | 'SUSPENSA' | 'INAPTA' | 'BAIXADA' | 'NULA' | 'REGULAR' | 'IRREGULAR' | 'TITULAR FALECIDO' | 'UNKNOWN' | 'PENDING' | 'PENDING_REGULARIZATION' | company |
tipo / legalForm / size | string | company |
status | number | company |
isMEI / isSimples | boolean | company |
companyAge | number | company |
registrationUptimeMonths | number | company |
revenue | number | company |
employeeCount | number | company |
| Key | Type | Entity |
|---|---|---|
isMonotributo / isIvaRegistered / isIncomeTaxRegistered | boolean | both |
isAutonomous | boolean | person |
afipSeniority | number | both |
afipRegistrationDate | string | both |
monotributoCategory / monotributoActivityDescription | string | both |
ivaCondition / incomeTaxCondition | string | both |
mainActivityAfipCode / mainActivityAfipDescription | string | both |
activities | string | both |
uifInscription | string | both |
isMyPyme | boolean | both |
isAMLObligatedSubject | boolean | both |
isUifObligatedSubject | boolean | both |
laftHomonymsCount | number | person |
isEmployee / isRetired | boolean | person |
isEmployer | boolean | both |
employmentSeniority | number | person |
wasEmployedLast12Months | boolean | person |
isMemberOfCompany | boolean | person |
activities is the AFIP text/XML list; the structured list is economicActivities. isAMLObligatedSubject is LA/FT obligated subject (not political PEP). isUifObligatedSubject is UIF inscription (distinct from Nosis SO).
Credit
| Key | Type | Entity |
|---|---|---|
totalDebt | number | null | both |
debtorStatus | string | null | both |
worstCreditSituation | number | null | both |
totalCurrentDebt / averageMonthlyDebt / totalHistoricalDebt | number | both |
worstHistoricalSituation | string | both |
totalFinancialEntities / periodsAnalyzed | number | both |
hasActiveRevisions / hasActiveLegalProcesses | boolean | both |
reasonsBouncedChecks | string[] | both |
debtSituation | number[] | both |
debtSituation are unique situation codes 1β5.
Electoral (root metrics)
| Key | Type | Entity |
|---|---|---|
totalElectoralDonations | number | both |
totalElectoralDonationAmount | number | both |
isCurrentlyElectoralDonor | boolean | both |
isHistoricalElectoralDonor | boolean | both |
Consolidators (ToConsolidateType + summaries)
Arrays live next to their *Summary on the same object. P = person, C = company.
| Array | Summary | Scope | Item type |
|---|---|---|---|
addresses | addressesSummary | P+C | AddressRecord |
aliases | aliasesSummary | P+C | AliasRecord |
documents | documentsSummary | P+C | DocumentRecord |
emails | emailsSummary | P+C | EmailRecord |
phones | phonesSummary | P+C | PhoneRecord |
relationships | relationshipsSummary | P+C | RelationshipRecord |
riskFlags | riskFlagsSummary | P+C | RiskFlagRecord |
sanctions | sanctionsSummary | P+C | SanctionEntry |
legalProceedings | legalProceedingsSummary | P+C | LegalProceeding |
violations | violationsSummary | P+C | ViolationRecord |
mediaMentions | mediaSummary | mentions P+C; summary C | MediaMention |
economicActivities | economicActivitiesSummary | P+C | EconomicActivityRecord |
cnaes | cnaesSummary | C | CNAERecord |
shareholders | shareholdersSummary | C | ShareholderRecord |
demographics | demographicsSummary | P | DemographicRecord |
occupations | occupationsSummary | P | OccupationRecord |
taxReturns | taxReturnsSummary | P | TaxReturnRecord |
electoralActivities | electoralActivitySummary (alias electoralActivitiesSummary) | P | ElectoralDonationRecord |
electoralActivity (legacy array name). Prefer electoralActivities.
Item types
interface AddressRecord {
streetName: string;
city: string;
state: string;
country: string;
fullAddress: string;
streetType?: string;
number?: string;
complement?: string;
neighborhood?: string;
postalCode?: string;
type?: 'residential' | 'commercial' | 'correspondence' | 'unknown';
priority?: number;
isMainForEntity?: boolean;
isActive?: boolean;
isCurrent?: boolean;
latitude?: number;
longitude?: number;
geoQuality?: 'ROOFTOP' | 'RANGE_INTERPOLATED' | 'APPROXIMATE' | 'UNKNOWN';
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
firstSeenDate?: string;
lastSeenDate?: string;
}
interface DocumentRecord {
value: string;
formatted: string;
type: 'cnpj' | 'cpf' | 'rg' | 'passport' | 'other';
classification: 'main' | 'branch' | 'secondary' | 'unknown';
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
active?: boolean;
isPrimary?: boolean;
}
interface EmailRecord {
address: string;
normalizedAddress: string;
type?: 'work' | 'personal' | 'business' | 'unknown';
domain?: string;
isMainForEntity?: boolean;
isActive?: boolean;
isValidated?: boolean;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
}
interface PhoneRecord {
number: string;
normalizedNumber: string;
countryCode: string;
areaCode?: string;
localNumber?: string;
type?: 'mobile' | 'landline' | 'voip' | 'unknown';
category?: 'work' | 'personal' | 'unknown';
isMainForEntity?: boolean;
isActive?: boolean;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
}
interface AliasRecord {
name: string;
originalName: string;
type: 'former_name' | 'trade_name' | 'abbreviation' | 'facility_name' | 'subsidiary' | 'variation' | 'unknown';
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
}
interface DemographicRecord {
dateOfBirth?: string;
age?: number;
gender?: 'M' | 'F' | 'O' | 'UNKNOWN';
nationality?: string;
maritalStatus?: string;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
}
interface OccupationRecord {
occupation?: string;
employer?: string;
employerTaxId?: string;
income?: number;
incomeRange?: string;
currency?: string;
isCurrent?: boolean;
isPrimary?: boolean;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
}
interface RelationshipRecord {
relatedEntityName: string;
relatedEntityTaxId?: string;
relatedEntityType?: 'person' | 'company';
relationshipType:
| 'MOTHER' | 'FATHER' | 'PARENT' | 'BROTHER' | 'SISTER' | 'SIBLING'
| 'SON' | 'DAUGHTER' | 'COUSIN' | 'UNCLE' | 'NEPHEW' | 'NIECE' | 'RELATIVE'
| 'SPOUSE' | 'PARTNER' | 'BUSINESS_PARTNER' | 'COWORKER' | 'NEIGHBOR' | 'HOUSEHOLD' | 'OTHER';
relationshipLevel?: 'DIRECT' | 'INDIRECT';
isActive?: boolean;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
}
interface RiskFlagRecord {
flagType: 'PEP' | 'SANCTION' | 'ADVERSE_MEDIA' | 'CRIMINAL_RECORD' | 'OTHER';
isActive: boolean;
details?: {
pepPosition?: string;
pepCountry?: string;
pepLevel?: 'national' | 'international' | 'local';
sanctionLists?: string[];
mediaScore?: number;
severity?: 'low' | 'medium' | 'high' | 'critical';
description?: string;
riskScore?: number;
};
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
}
interface SanctionEntry {
id: string;
listName: string;
sanctionedName: string;
status?: 'active' | 'removed' | 'expired';
type?: string;
reason?: string;
addedDate?: string;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
confidence: number;
}
interface LegalProceeding {
id: string;
type: 'arrest_warrant' | 'criminal' | 'civil' | 'labor' | 'public_ministry'
| 'special_civil' | 'special_criminal' | 'administrative' | 'electoral'
| 'fazenda' | 'special_fazenda' | 'tributario' | 'previdenciaria' | 'unknown';
subject: string;
category:
| 'fraude' | 'corrupcao' | 'lavagem_dinheiro' | 'crimes_ambientais'
| 'trabalho_escravo' | 'sonegacao_fiscal' | 'crimes_financeiros'
| 'crimes_patrimoniais' | 'civil_dispute' | 'labor_dispute'
| 'investigation' | 'warrant' | 'other';
status?: 'active' | 'closed' | 'pending' | 'unknown';
processoNumber?: string;
court?: string;
parties?: Array<{ name: string; role: string }>;
sources: string[];
confirmedByMultipleSources: boolean;
severity: 'low' | 'medium' | 'high' | 'critical';
confidence: number;
amount?: number;
currency?: string;
}
interface ViolationRecord {
id: string;
displayName: string;
category: 'environmental' | 'labor' | 'financial' | 'governance'
| 'administrative' | 'consumer' | 'tax' | 'public_order' | 'other';
severity: 'low' | 'medium' | 'high' | 'critical';
sources: string[];
confirmedByMultipleSources: boolean;
count: number;
}
interface MediaMention {
id: string;
title: string;
description: string;
sentiment: 'positive' | 'negative' | 'neutral';
category: 'award' | 'recognition' | 'partnership' | 'investment'
| 'condemnation' | 'investigation' | 'lawsuit' | 'fine' | 'violation' | 'other';
date?: string;
amount?: number;
currency?: string;
sources: string[];
confirmedByMultipleSources: boolean;
confidence: number;
severity?: 'low' | 'medium' | 'high' | 'critical';
}
interface EconomicActivityRecord {
description: string;
code?: string;
isMain?: boolean;
activityRank?: 'main' | 'secondary' | 'tertiary';
startDate?: string;
countryCode?: string;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
confidence: number;
}
interface CNAERecord {
code: string;
description: string;
isMain: boolean;
isHighRisk?: boolean;
secao?: string;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
confidence: number;
}
interface ShareholderRecord {
name: string;
taxId?: string;
taxIdType?: string;
entityType?: 'person' | 'company' | 'unknown';
relationshipType: 'SOCIO_ADMINISTRADOR' | 'ADMINISTRADOR' | 'SOCIO' | 'QSA'
| 'PROCURADOR' | 'REPRESENTANTE' | 'TITULAR' | 'UNKNOWN';
ownershipPercentage?: number;
isActive: boolean;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
legalProceedings?: LegalProceeding[];
}
interface TaxReturnRecord {
year: string;
status: string;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
}
interface ElectoralDonationRecord {
year: string;
amountDonated: number;
donationsCount: number;
sources: string[];
providers?: string[];
confirmedByMultipleSources: boolean;
count: number;
confidence: number;
currency?: string;
}
addressesSummary, legalProceedingsSummary, shareholdersSummary, β¦) expose counts, byType / byStatus breakdowns, and flags such as hasActiveCriminalCases, hasArrestWarrant, hasFamilyRelationships. Shape matches the TypeScript *Summary interfaces in the Gu1 shared consolidator types.
Errors
| HTTP | error.code | When |
|---|---|---|
401 | UNAUTHORIZED | Missing organization context |
404 | NOT_FOUND | Entity has never been enriched, or the entity UUID is not in this organization |
500 | INTERNAL_ERROR | Unexpected failure |
success: true body).
Example
curl -X GET "https://api.gu1.ai/entities/550e8400-e29b-41d4-a716-446655440000/normalized-enrichment" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch(
'https://api.gu1.ai/entities/550e8400-e29b-41d4-a716-446655440000/normalized-enrichment',
{ headers: { Authorization: 'Bearer YOUR_API_KEY' } }
);
const body = await response.json();
import requests
response = requests.get(
'https://api.gu1.ai/entities/550e8400-e29b-41d4-a716-446655440000/normalized-enrichment',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
print(response.json())
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"entityId": "550e8400-e29b-41d4-a716-446655440000",
"organizationId": "11111111-2222-3333-4444-555555555555",
"entityType": "person",
"normalizedData": {
"taxId": "12345678901",
"fullName": "Example Person",
"isPep": false,
"isCurrentPep": false,
"isPepPossible": false,
"sanctioned": false,
"country": "BR",
"addresses": [
{
"streetName": "Example Street",
"city": "Sao Paulo",
"state": "SP",
"country": "BR",
"fullAddress": "Example Street, 100, Sao Paulo, SP, BR",
"sources": ["br_cpf_enrichment"],
"confirmedByMultipleSources": false,
"count": 1
}
],
"addressesSummary": {
"totalAddresses": 1,
"uniqueAddresses": 1,
"confirmedAddresses": 0,
"activeAddresses": 1,
"hasMultipleAddresses": false
}
},
"normalizedMetrics": {
"completeness": 0.72,
"confidence": 0.9
},
"providersUsed": ["br_cpf_enrichment"],
"dataQualityScore": 80,
"confidenceScore": 90,
"completenessScore": 72,
"conflicts": [],
"createdAt": "2026-09-01T12:00:00.000Z",
"updatedAt": "2026-09-03T15:30:00.000Z"
}
}
normalizedData in production is much larger. Use the contract as the schema; this sample is only a shape hint.
Related
- Get current enrichment data β last mapped/raw by integration code
- Execute enrichment β run integrations and persist the dossier
- Get entity β identity, status, and risk score (does not replace this endpoint)
- Rule conditions β
enrichmentData.normalized.*field catalog
Was this page helpful?