curl -fsS https://verification.didit.me/v3/status/import requests
resp = requests.get('https://verification.didit.me/v3/status/', timeout=5)
resp.raise_for_status()
feed = resp.json()
print(feed['status'])
for service in feed['services']:
if service['status'] != 'operational':
print(service['key'], service['status'])const feed = await fetch('https://verification.didit.me/v3/status/').then((r) => r.json());
console.log(feed.status);
const affected = feed.services.filter((s) => s.status !== 'operational');
console.log(affected.map((s) => `${s.key}: ${s.status}`));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/status/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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 := "https://verification.didit.me/v3/status/"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v3/status/")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/status/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "degraded",
"updated_at": "2026-10-13T09:41:07.512345Z",
"services": [
{
"key": "service_id_verification",
"name": "ID verification",
"status": "operational"
},
{
"key": "service_liveness_face_match",
"name": "Liveness and face match",
"status": "operational"
},
{
"key": "service_aml_screening",
"name": "AML screening",
"status": "operational"
},
{
"key": "service_kyb_registries",
"name": "KYB registries",
"status": "operational"
},
{
"key": "service_database_validation",
"name": "Database validation",
"status": "degraded"
},
{
"key": "service_phone_delivery",
"name": "Phone verification delivery",
"status": "operational"
},
{
"key": "service_email_delivery",
"name": "Email verification delivery",
"status": "operational"
},
{
"key": "service_transaction_monitoring",
"name": "Transaction monitoring",
"status": "operational"
}
],
"incidents": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"service": "service_database_validation",
"service_name": "Database validation",
"state": "degraded",
"status": "ongoing",
"title": "Database validation is degraded in Brazil.",
"body": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC.",
"affected": "Brazil (CPF)",
"country_name": "Brazil",
"started_at": "2026-10-13T08:55:00Z",
"resolved_at": null,
"duration_minutes": null
},
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"service": "service_aml_screening",
"service_name": "AML screening",
"state": "down",
"status": "resolved",
"title": "AML screening is back to normal.",
"body": "Recovered at 14:32 UTC after 17 minutes.",
"affected": "",
"country_name": "",
"started_at": "2026-10-11T14:15:00Z",
"resolved_at": "2026-10-11T14:32:00Z",
"duration_minutes": 17
}
]
}Service status
Returns the state of each Didit service (operational, degraded or down), the overall state (the worst of them), and the incidents that are ongoing or were resolved in the last 7 days. Use it to power a status widget or to check Didit’s health from your integration.
Public: send no auth header. The response contains no organization data and is the same for every caller. Responses are cached for 30 seconds, so poll no more than once every 30 seconds.
curl -fsS https://verification.didit.me/v3/status/import requests
resp = requests.get('https://verification.didit.me/v3/status/', timeout=5)
resp.raise_for_status()
feed = resp.json()
print(feed['status'])
for service in feed['services']:
if service['status'] != 'operational':
print(service['key'], service['status'])const feed = await fetch('https://verification.didit.me/v3/status/').then((r) => r.json());
console.log(feed.status);
const affected = feed.services.filter((s) => s.status !== 'operational');
console.log(affected.map((s) => `${s.key}: ${s.status}`));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/status/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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 := "https://verification.didit.me/v3/status/"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v3/status/")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/status/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "degraded",
"updated_at": "2026-10-13T09:41:07.512345Z",
"services": [
{
"key": "service_id_verification",
"name": "ID verification",
"status": "operational"
},
{
"key": "service_liveness_face_match",
"name": "Liveness and face match",
"status": "operational"
},
{
"key": "service_aml_screening",
"name": "AML screening",
"status": "operational"
},
{
"key": "service_kyb_registries",
"name": "KYB registries",
"status": "operational"
},
{
"key": "service_database_validation",
"name": "Database validation",
"status": "degraded"
},
{
"key": "service_phone_delivery",
"name": "Phone verification delivery",
"status": "operational"
},
{
"key": "service_email_delivery",
"name": "Email verification delivery",
"status": "operational"
},
{
"key": "service_transaction_monitoring",
"name": "Transaction monitoring",
"status": "operational"
}
],
"incidents": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"service": "service_database_validation",
"service_name": "Database validation",
"state": "degraded",
"status": "ongoing",
"title": "Database validation is degraded in Brazil.",
"body": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC.",
"affected": "Brazil (CPF)",
"country_name": "Brazil",
"started_at": "2026-10-13T08:55:00Z",
"resolved_at": null,
"duration_minutes": null
},
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"service": "service_aml_screening",
"service_name": "AML screening",
"state": "down",
"status": "resolved",
"title": "AML screening is back to normal.",
"body": "Recovered at 14:32 UTC after 17 minutes.",
"affected": "",
"country_name": "",
"started_at": "2026-10-11T14:15:00Z",
"resolved_at": "2026-10-11T14:32:00Z",
"duration_minutes": 17
}
]
}Overview
Returns the state of every Didit service, the overall state, and the incidents that are ongoing or were resolved in the last 7 days. The endpoint is public: send no auth header. The response contains no organization data and is the same for every caller.When to use it
- Status widget: show your users or your support team whether a Didit service is degraded right now.
- Integration health check: before you blame your own code for slow or failing checks, see whether Didit reports an incident on the service you call.
- Incident history: list what happened in the last 7 days and how long each incident lasted.
Polling
Responses are cached for 30 seconds, so poll no more than once every 30 seconds.updated_at tells you when Didit built the response you received.
A GET rate limit of 600 requests per minute per IP address also applies.
Services
services lists every service, whether or not it has an incident.
Match on key: name is an English display name and can change.
key | Service |
|---|---|
service_id_verification | ID verification |
service_liveness_face_match | Liveness and face match |
service_aml_screening | AML screening |
service_kyb_registries | KYB registries |
service_database_validation | Database validation |
service_phone_delivery | Phone verification delivery |
service_email_delivery | Email verification delivery |
service_transaction_monitoring | Transaction monitoring |
status is operational, degraded or down.
It is operational when the service has no ongoing incident, and otherwise the worst state of its ongoing incidents.
The top-level status is the worst state of all services.
Incidents
incidents lists every ongoing incident and the incidents resolved in the last 7 days, newest started_at first.
At most 50 resolved incidents are listed.
stateisdegradedordown. A resolved incident keeps the last state it had.statusisongoinguntil the service recovers, thenresolved.resolved_atandduration_minutesarenullwhile the incident is ongoing.affectedandcountry_namename the country or registry affected, for exampleBrazil (CPF)andBrazil. They are empty when the incident is not tied to a country or registry.titleandbodyare English. To show the incident in another language, build your own text fromservice,stateandcountry_name.
Example response
{
"status": "degraded",
"updated_at": "2026-10-13T09:41:07.512345Z",
"services": [
{ "key": "service_id_verification", "name": "ID verification", "status": "operational" },
{ "key": "service_liveness_face_match", "name": "Liveness and face match", "status": "operational" },
{ "key": "service_aml_screening", "name": "AML screening", "status": "operational" },
{ "key": "service_kyb_registries", "name": "KYB registries", "status": "operational" },
{ "key": "service_database_validation", "name": "Database validation", "status": "degraded" },
{ "key": "service_phone_delivery", "name": "Phone verification delivery", "status": "operational" },
{ "key": "service_email_delivery", "name": "Email verification delivery", "status": "operational" },
{ "key": "service_transaction_monitoring", "name": "Transaction monitoring", "status": "operational" }
],
"incidents": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"service": "service_database_validation",
"service_name": "Database validation",
"state": "degraded",
"status": "ongoing",
"title": "Database validation is degraded in Brazil.",
"body": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC.",
"affected": "Brazil (CPF)",
"country_name": "Brazil",
"started_at": "2026-10-13T08:55:00Z",
"resolved_at": null,
"duration_minutes": null
},
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"service": "service_aml_screening",
"service_name": "AML screening",
"state": "down",
"status": "resolved",
"title": "AML screening is back to normal.",
"body": "Recovered at 14:32 UTC after 17 minutes.",
"affected": "",
"country_name": "",
"started_at": "2026-10-11T14:15:00Z",
"resolved_at": "2026-10-11T14:32:00Z",
"duration_minutes": 17
}
]
}
Related
- Healthcheck: a public liveness probe that also needs no auth header.
- Alert webhooks: get
alert.service.degradedandalert.service.recoveredpushed to your endpoint for the services your organization uses. - Rate limiting
Response
Current service status.
Public service status: the state of each Didit service, the overall state, and the incidents that are ongoing or were resolved in the last 7 days.
The worst state of any service right now, decided by the ongoing incidents only.
operational, degraded, down "degraded"
When Didit built this response (ISO 8601, UTC). Responses are cached for 30 seconds, so it can be up to 30 seconds old.
"2026-10-13T09:41:07.512345Z"
One entry per service, every service always listed.
Show child attributes
Show child attributes
Newest started_at first. Every ongoing incident, plus the incidents resolved in the last 7 days (at most 50 resolved incidents). Empty when nothing happened in that time.
Show child attributes
Show child attributes