Update a registration
Use the PUT method to update the status of a registration — both the client_status (situation on your platform) and the analysis_status (manual analysis decision).
Feedback matters
Reporting the actual outcome via PUT is what keeps the quality of the recommendations high. Without that feedback, the models do not learn from the cases in your portfolio.
The endpoint accepts the two registration types:
/onboarding/natural_person/{external_id}
/onboarding/legal_person/{external_id}
The {external_id} is the id you sent in the POST.
PUT — update status
ENDPOINT
/onboarding/natural_person/EXTERNAL_IDMETHOD
PUTThe body accepts two mutually exclusive shapes: one for client_status, another for analysis_status.
- client_status
- analysis_status
Updates the customer's situation on your platform.
client_statusenumrequiredIn Natural Person accepts
approved, reproved, fraud_blocked, default_blocked or cancelled. In Legal Person, only fraud_blocked, default_blocked or cancelled.event_datedatetimerequiredDate and time of the event, with time zone. Offset ending in :00/:30 or the Z suffix.Fraud block
{
"client_status": "fraud_blocked",
"event_date": "2026-08-07T13:34:12-03:00"
}
Default block
{
"client_status": "default_blocked",
"event_date": "2026-08-07T13:34:12-03:00"
}
Cancellation by the customer
{
"client_status": "cancelled",
"event_date": "2026-08-07T13:34:12-03:00"
}
Records a manual analysis decision.
analysis_statusenumrequiredAccepts
manually_approved, manually_reproved, manually_challenged, manually_cancelled or on_hold.risk_levelenumoptionallow, medium, high or critical.observationstringoptionalJustification for the decision. Up to 3,000 characters.user_namestringoptionalName of the analyst responsible. Up to 50 characters.user_emailstringoptionalEmail of the analyst responsible.Manual approval
{
"analysis_status": "manually_approved",
"risk_level": "low",
"observation": "Documentation reviewed and validated.",
"user_name": "Ana Analyst",
"user_email": "ana@exemplo.com.br"
}
Request examples
- Python
- PHP
- Node.js
- Java
- C#
- curl
import requests
BASE_URL = "https://api.sandbox.caas.qitech.app"
API_KEY = "YOUR_API_KEY"
EXTERNAL_ID = "12345678"
response = requests.put(
f"{BASE_URL}/onboarding/natural_person/{EXTERNAL_ID}",
json={
"client_status": "approved",
"event_date": "2026-08-07T13:34:12-03:00",
},
headers={"Authorization": API_KEY},
timeout=30,
)
response.raise_for_status()
<?php
$baseUrl = 'https://api.sandbox.caas.qitech.app';
$apiKey = 'YOUR_API_KEY';
$externalId = '12345678';
$payload = [
'client_status' => 'approved',
'event_date' => '2026-08-07T13:34:12-03:00',
];
$ch = curl_init("{$baseUrl}/onboarding/natural_person/{$externalId}");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: ' . $apiKey,
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("Update failed: HTTP {$status} — {$body}");
}
const BASE_URL = "https://api.sandbox.caas.qitech.app";
const API_KEY = "YOUR_API_KEY";
const EXTERNAL_ID = "12345678";
async function updateStatus() {
const response = await fetch(
`${BASE_URL}/onboarding/natural_person/${EXTERNAL_ID}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: API_KEY,
},
body: JSON.stringify({
client_status: "approved",
event_date: "2026-08-07T13:34:12-03:00",
}),
},
);
if (!response.ok) {
throw new Error(`Update failed: HTTP ${response.status}`);
}
}
updateStatus();
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class UpdateClientStatus {
private static final String BASE_URL = "https://api.sandbox.caas.qitech.app";
private static final String API_KEY = "YOUR_API_KEY";
private static final String EXTERNAL_ID = "12345678";
public static void main(String[] args) throws Exception {
String payload = """
{
"client_status": "approved",
"event_date": "2026-08-07T13:34:12-03:00"
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/onboarding/natural_person/" + EXTERNAL_ID))
.header("Content-Type", "application/json")
.header("Authorization", API_KEY)
.timeout(Duration.ofSeconds(30))
.PUT(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
throw new IllegalStateException(
"Update failed: HTTP " + response.statusCode());
}
}
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class UpdateClientStatus
{
private const string BaseUrl = "https://api.sandbox.caas.qitech.app";
private const string ApiKey = "YOUR_API_KEY";
private const string ExternalId = "12345678";
public static async Task Main()
{
var payload = new
{
client_status = "approved",
event_date = "2026-08-07T13:34:12-03:00"
};
using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
client.DefaultRequestHeaders.Add("Authorization", ApiKey);
var content = new StringContent(
JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await client.PutAsync(
$"{BaseUrl}/onboarding/natural_person/{ExternalId}", content);
if (!response.IsSuccessStatusCode)
{
throw new InvalidOperationException(
$"Update failed: HTTP {(int)response.StatusCode}");
}
}
}
curl -X PUT \
'https://api.sandbox.caas.qitech.app/onboarding/natural_person/12345678' \
-H 'Content-Type: application/json' \
-H 'Authorization: YOUR_API_KEY' \
-d '{
"client_status": "approved",
"event_date": "2026-08-07T13:34:12-03:00"
}'
Errors
| Status | Situation | How to resolve |
|---|---|---|
| 400 | Enum outside the accepted list. | Check the accepted values for client_status and analysis_status. |
| 400 | client_status without event_date. | Send both together. |
| 400 | Field not defined in the schema. | The schema uses additionalProperties: false. |
| 404 | Registration not found for your API Key. | Check the external_id in the path. |
Full list in HTTP Status.