How it works
Your systemAccount opening, transfer, periodic review
Request
Authenica APIAPI key, quota, call log
Search
Consolidated listsSanctions and PEPs, reloaded regularly
Response: the records found, with the list and the list version
What you get
Authenica provides ready-to-use compliance data : screening of your customers against public and official lists of sanctions and politically exposed persons (PEPs), consolidated, reloaded regularly and served through a secure API, so that your teams do not have to collect or normalise these lists themselves.
Public and official listsSanctions of the United Nations, the United States (OFAC), the European Union, the United Kingdom, Switzerland and Canada, the national freezing lists of the Union's CENTIFs, integrated State by State, and PEP lists. The exact coverage is set out list by list below.
Proof by versionEvery result states the list and the list version it comes from. You can show, after the fact, what the list said on the day of screening.
Deny by defaultAn outage always returns an error, never an empty response: your process lets nothing through for lack of an answer.
Identity document reading and checksIdentity card, passport, driving licence, residence permit: the fields read, the model recognised and the authenticity checks, from a photo. Nothing is kept.
We search, we do not storeAuthenica queries its lists and replies: the name you search is not stored anywhere, neither in the call log nor elsewhere. Every call receives an identifier to keep as proof that screening took place.
The lists queried
Screening covers public and official lists, published by their issuers and reloaded regularly. New sources are added over time; the up-to-date list is always available through the API (see "List the sources").
| Code | List | Issuer | Type | Status |
UN_CONSOLIDATED | Security Council consolidated list | United Nations | Sanctions | Served |
OFAC_SDN | Specially Designated Nationals list (SDN) | US Department of the Treasury (OFAC) | Sanctions | Served |
OFAC_CONSOLIDATED | Consolidated non-SDN list | US Department of the Treasury (OFAC) | Sanctions | Served |
EU_FSF | Consolidated list of financial sanctions | European Commission | Sanctions | Served |
UK_SANCTIONS_LIST | UK sanctions list | Foreign, Commonwealth and Development Office | Sanctions | Served |
SECO_SWISS_SANCTIONS | Swiss sanctions list | State Secretariat for Economic Affairs (SECO) | Sanctions | Served |
CANADA_SEMA | Canadian sanctions list (SEMA) | Global Affairs Canada | Sanctions | Served |
CENTIF_CI_1373 | National list, resolution 1373 | CENTIF of Côte d'Ivoire | Sanctions | Served |
CI_GOVERNMENT | Composition of the Government of Côte d'Ivoire | Office of the Prime Minister of Côte d'Ivoire | PEP | Served |
UEMOA_PPE | Politically exposed persons of WAEMU | Authenica, from public sources | PEP | Served |
Status according to the API source register. The real-time state of each list and the date it was last loaded are given in the fields status and lastLoadedAt of GET /api/v1/lists/sources ; this page shows no date that does not appear there.
Coverage of national freezing lists
Each Union State keeps, through its CENTIF, its own national asset-freezing list. Authenica is integrating them one by one; a list is marked “served” only once it is actually queried by the API.
| State | Issuer | Code | Status |
| Benin | CENTIF of Benin | — | Being integrated |
| Burkina Faso | CENTIF of Burkina Faso | — | Being integrated |
| Côte d'Ivoire | CENTIF of Côte d'Ivoire | CENTIF_CI_1373 | Served |
| Guinea-Bissau | CENTIF of Guinea-Bissau | — | Being integrated |
| Mali | CENTIF of Mali | — | Being integrated |
| Niger | CENTIF of Niger | — | Being integrated |
| Senegal | CENTIF of Senegal | — | Being integrated |
| Togo | CENTIF of Togo | — | Being integrated |
Sanctions or PEP. A record of type SANCTIONS is blocking: a person reviews it before any decision. A record of type PPE calls for enhanced due diligence, according to your policy.
Get started in two minutes
- Get a keyApply online: we create your access and give you the key.
- Call the APIA
POST call with the name searched and your key.
- Read the resultA list of records, each with its list and version.
curl -X POST https://api.authenica.tech/api/v1/screenings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-H "Content-Type: application/json" \
-d '{"fullName":"Zorbek Nandrawell","scoreThreshold":0.85}'
Remember. An empty response means: no record exceeds your threshold in the published lists. A temporarily unavailable service returns 503, never an empty response.
| Term | In plain terms |
| Screening | Looking up a person or a company in the official sanctions and politically exposed persons lists. |
| PEP | Politically exposed person: someone who holds or has held a prominent public function. |
| API key | A long password, specific to your organisation, that proves the call comes from you. |
| Quota | The number of calls allowed per minute for your access. |
Get your key
- Fill in the evaluation key request form with the name of your organisation and the intended use. We reply within one working day.
- We create your access and give you the key only once. It is not stored in clear text: we cannot give it to you again, only create a new one.
- We agree with you on a per-minute quota.
To change or revoke a key, write to it@authenica.tech. Revocation is immediate.
Authentication
Every call carries your key in the header X-Api-Key. The base address is https://api.authenica.tech, HTTPS only: an HTTP call is redirected.
Keep the key secret. Use it from your servers, never from a browser or a mobile app. Never put it in a code repository or a log.
With no key, or an unknown, revoked or expired key: response 401. Knowing the address grants no access.
Query the lists
POST /api/v1/screenings
What you send
| Field | Description | In plain terms |
fullName REQUIRED | Full name searched, 300 characters maximum | First names then surname, as on the identity document. |
scoreThreshold REQUIRED | Number from 0 to 1 | Similarity threshold above which a record is returned. Your compliance policy sets it, not Authenica. |
corroboratedThreshold | Number from 0 to 1, lower than the previous one | Second threshold, valid only if the date of birth matches: a spelling variant scores lower but designates the same person. |
entityType | NATURAL_PERSON or LEGAL_ENTITY | Search only natural persons, or only companies. Absent: all. |
listTypes | Array of SANCTIONS, PPE, LOCAL | Search only these types of lists. Absent or empty: all. |
dateOfBirth | Date AAAA-MM-JJ | Used to confirm or contradict a record. |
nationality | Two-letter country code (CI, SN, ML...) | Same. |
placeOfBirth | Free text | Same. |
documentNumber | Identity document number | Reserved. Accepted only if your access is authorised for it; otherwise it is ignored and the response says so in ignoredFields. |
reference | Text | Your request identifier, without any person's name. |
On thresholds. The examples on this page use 0.85 for illustration. It is not a recommendation: the right threshold depends on your compliance policy.
Read the response
Response 200 :
{
"requestId": "63f766c4-9c1c-4adb-ac8e-4e66674b4be0",
"matches": [
{
"listType": "SANCTIONS",
"listName": "AUTHENICA_TEST_SANCTIONS",
"listVersion": "a0a0a0a0-0000-4000-8000-000000000001",
"targetLabel": "Zorbek NANDRAWELL",
"score": 1.0,
"confidence": "UNCORROBORATED",
"evidence": [
{
"field": "DOCUMENT_NUMBER",
"status": "UNKNOWN",
"customerValue": null,
"listValue": null
},
{
"field": "DATE_OF_BIRTH",
"status": "UNKNOWN",
"customerValue": null,
"listValue": "15 Jun 1975"
},
{
"field": "NATIONALITY",
"status": "UNKNOWN",
"customerValue": null,
"listValue": "Mali"
},
{
"field": "PLACE_OF_BIRTH",
"status": "UNKNOWN",
"customerValue": null,
"listValue": "Bamako"
}
],
"details": {
"entityType": "NATURAL_PERSON",
"list": {
"label": "Liste d'essai fictive : sanctions",
"publisher": "Authenica"
},
"sanctionPrograms": [
"TEST-FICTIF"
],
"title": "Personne fictive de la liste d'essai",
"description": "Fiche fictive pour tester l'intégration. Aucune personne réelle.",
"nationalities": [
"Mali"
],
"datesOfBirth": [
"15 Jun 1975"
],
"placesOfBirth": [
"Bamako"
]
}
}
],
"ignoredFields": []
}
| Field | In plain terms |
requestId | The identifier of your call. Keep it and quote it to our support to trace the call. It is also in the header X-Request-Id. |
matches | The records found, from most to least similar. Empty: no record exceeds your threshold. |
listType | SANCTIONS : sanctions list, blocking. PPE : politically exposed persons. LOCAL : local list. |
listName | The code of the source list, for example OFAC_SDN, UN_CONSOLIDATED, EU_FSF, UEMOA_PPE. The full list is in "List the sources". |
listVersion | The list batch that produced the record. Keep it: it proves in which version of the list the person appeared. |
targetLabel | The name of the record found. |
score | The similarity between the name searched and the record, from 0 to 1. |
confidence | How far the other elements confirm the match (see below). |
evidence | The detail of the comparison, element by element, for a person. For a company it is empty: only the name is compared. |
details | What the record found says, so you can understand it without opening the list (see "Record details"). |
ignoredFields | Fields you sent that your access is not authorised to use. Never ignored silently. |
Confidence, in plain terms
It never dismisses a record: a likely namesake remains an alert to be reviewed by a person.
| Value | What it means |
CORROBORATED | At least one element matches (date of birth, nationality...) and none strongly contradicts. |
MIXED | Some elements match and others contradict: human judgement is essential. |
UNCORROBORATED | Nothing confirms or rules out the match, because data are missing on one side or the other. |
LIKELY_HOMONYM | No element matches and a strong element contradicts: probably a different person. |
Record details
The block details repeats what the list issuer publishes about the record. It helps tell two namesakes apart, for example two people with the same name but different functions.
| Field | In plain terms |
entityType | NATURAL_PERSON : a natural person. LEGAL_ENTITY : a company. |
list | The readable name of the list (label) and its issuer (publisher). |
sanctionPrograms | The types of sanctions : the record's sanctions programmes, as published by the issuer (for example SDGT for a specially designated global terrorist in the US list). Empty for a politically exposed person. |
title | The published function, for example "President of the Republic" or "Mayor of Niéllé". It is what tells two namesakes apart. |
description | The text the list publishes about the record, truncated to 600 characters. Absent when the function serves instead. |
nationalities, datesOfBirth, placesOfBirth | What the list publishes. Always empty for a company. |
The detail of the comparison
Each line of evidence has field (DATE_OF_BIRTH, NATIONALITY, PLACE_OF_BIRTH or DOCUMENT_NUMBER), customerValue (what you sent), listValue (what the record says) and status :
MATCH : the two match.
CONFLICT : the two contradict each other.
UNKNOWN : one of the two sides does not provide the element, so neither confirmation nor contradiction.
Try it with test cases
Authenica maintains a fictitious test list to test your integration end to end, with reproducible results. It contains no real person or company : the names below do not exist. You can replay each request with your key and get the same response.
A name on the test sanctions list, with date of birth and nationality.
Request
curl -X POST https://api.authenica.tech/api/v1/screenings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-H "Content-Type: application/json" \
-d '{"fullName":"Zorbek Nandrawell","dateOfBirth":"1975-06-15","nationality":"ML","scoreThreshold":0.85}'
Actual API response
{
"requestId": "b0fa0a4d-8236-44bc-9979-2a0a41fc95f2",
"matches": [
{
"listType": "SANCTIONS",
"listName": "AUTHENICA_TEST_SANCTIONS",
"listVersion": "a0a0a0a0-0000-4000-8000-000000000001",
"targetLabel": "Zorbek NANDRAWELL",
"score": 1.0,
"confidence": "CORROBORATED",
"evidence": [
{
"field": "DOCUMENT_NUMBER",
"status": "UNKNOWN",
"customerValue": null,
"listValue": null
},
{
"field": "DATE_OF_BIRTH",
"status": "MATCH",
"customerValue": "1975-06-15",
"listValue": "15 Jun 1975"
},
{
"field": "NATIONALITY",
"status": "MATCH",
"customerValue": "ML",
"listValue": "Mali"
},
{
"field": "PLACE_OF_BIRTH",
"status": "UNKNOWN",
"customerValue": null,
"listValue": "Bamako"
}
],
"details": {
"entityType": "NATURAL_PERSON",
"list": {
"label": "Liste d'essai fictive : sanctions",
"publisher": "Authenica"
},
"sanctionPrograms": [
"TEST-FICTIF"
],
"title": "Personne fictive de la liste d'essai",
"description": "Fiche fictive pour tester l'intégration. Aucune personne réelle.",
"nationalities": [
"Mali"
],
"datesOfBirth": [
"15 Jun 1975"
],
"placesOfBirth": [
"Bamako"
]
}
}
],
"ignoredFields": []
}
How to read it
- One match on the list
AUTHENICA_TEST_SANCTIONS, of type SANCTIONS : a blocking type. CORROBORATED : the date of birth and nationality you sent match the record (see evidence).listVersion : the list batch that produced the record. Keep it with your decision.- A match on a sanctions list must be reviewed by a person before any decision.
A name on the test PEP list, with date of birth and nationality.
Request
curl -X POST https://api.authenica.tech/api/v1/screenings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-H "Content-Type: application/json" \
-d '{"fullName":"Kassim Dromvale","dateOfBirth":"1968-03-02","nationality":"CI","scoreThreshold":0.85}'
Actual API response
{
"requestId": "5ce9f675-92cf-4f19-9bd3-3098496f12e9",
"matches": [
{
"listType": "PPE",
"listName": "AUTHENICA_TEST_PPE",
"listVersion": "a0a0a0a0-0000-4000-8000-000000000002",
"targetLabel": "Kassim DROMVALE",
"score": 1.0,
"confidence": "CORROBORATED",
"evidence": [
{
"field": "DOCUMENT_NUMBER",
"status": "UNKNOWN",
"customerValue": null,
"listValue": null
},
{
"field": "DATE_OF_BIRTH",
"status": "MATCH",
"customerValue": "1968-03-02",
"listValue": "02 Mar 1968"
},
{
"field": "NATIONALITY",
"status": "MATCH",
"customerValue": "CI",
"listValue": "Côte d'Ivoire"
},
{
"field": "PLACE_OF_BIRTH",
"status": "UNKNOWN",
"customerValue": null,
"listValue": "Abidjan"
}
],
"details": {
"entityType": "NATURAL_PERSON",
"list": {
"label": "Liste d'essai fictive : personnes politiquement exposées",
"publisher": "Authenica"
},
"sanctionPrograms": [],
"title": "Ministre (fonction fictive)",
"description": "Fiche fictive pour tester l'intégration. Aucune personne réelle.",
"nationalities": [
"Côte d'Ivoire"
],
"datesOfBirth": [
"02 Mar 1968"
],
"placesOfBirth": [
"Abidjan"
]
}
}
],
"ignoredFields": []
}
How to read it
- One match on the list
AUTHENICA_TEST_PPE, of type PPE. - A PEP is not a sanction: it calls for enhanced due diligence, according to your policy, after review by a person.
CORROBORATED : the date of birth and nationality you sent match the record.
An ordinary customer, absent from all lists.
Request
curl -X POST https://api.authenica.tech/api/v1/screenings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-H "Content-Type: application/json" \
-d '{"fullName":"Aminata Kone Diabate","dateOfBirth":"1990-04-12","nationality":"CI","scoreThreshold":0.85}'
Actual API response
{
"requestId": "3b3a92ce-018f-452e-a63b-24d9129179a6",
"matches": [],
"ignoredFields": []
}
How to read it
matches is empty: no record exceeds your threshold in the published lists.- It is not an approval: your process decides. Keep the
requestId to prove that screening took place. - An outage never looks like this result: an unavailable service returns
503.
A company on the test list, searched with the filter entityType.
Request
curl -X POST https://api.authenica.tech/api/v1/screenings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-H "Content-Type: application/json" \
-d '{"fullName":"Nandrawell Holding SARL","entityType":"LEGAL_ENTITY","scoreThreshold":0.85}'
Actual API response
{
"requestId": "bf7e6348-5909-49a4-a997-ed600d1e7494",
"matches": [
{
"listType": "SANCTIONS",
"listName": "AUTHENICA_TEST_SANCTIONS",
"listVersion": "a0a0a0a0-0000-4000-8000-000000000001",
"targetLabel": "NANDRAWELL HOLDING SARL",
"score": 1.0,
"confidence": "UNCORROBORATED",
"evidence": [],
"details": {
"entityType": "LEGAL_ENTITY",
"list": {
"label": "Liste d'essai fictive : sanctions",
"publisher": "Authenica"
},
"sanctionPrograms": [
"TEST-FICTIF"
],
"title": "Société fictive de la liste d'essai",
"description": "Fiche fictive pour tester l'intégration. Aucune société réelle.",
"nationalities": [],
"datesOfBirth": [],
"placesOfBirth": []
}
}
],
"ignoredFields": []
}
How to read it
entityType set to LEGAL_ENTITY : only companies are searched.evidence is empty: a company has no date or place of birth or nationality to compare; only its name is compared.
What not to do. These records are for testing, never for deciding. A name from the test list carries in listName the value AUTHENICA_TEST_SANCTIONS or AUTHENICA_TEST_PPE : you can exclude them from your decisions by filtering on this name.
Filter the search
Two filters that can be combined. An absent filter filters nothing.
# Seulement les personnes politiquement exposées
-d '{"fullName":"Kassim Dromvale","scoreThreshold":0.85,"listTypes":["PPE"]}'
# Seulement les sociétés, dans les listes de sanctions
-d '{"fullName":"Société Exemple SARL","scoreThreshold":0.85,"entityType":"LEGAL_ENTITY","listTypes":["SANCTIONS"]}'
# Avec la date de naissance et la nationalité, pour corroborer
-d '{"fullName":"Zorbek Nandrawell","scoreThreshold":0.85,"corroboratedThreshold":0.70,"dateOfBirth":"1975-06-15","nationality":"ML"}'
An unknown type (for example "entityType":"NAVIRE") is rejected with an error 400.
List the sources
GET /api/v1/lists/sources
One entry per list: code (the one you find in listName), label (its readable name), publisher (the issuer), listType, lastBatchId (the last batch loaded, the one you find in listVersion), lastLoadedAt (the load date), status and entityCount (the number of records). No personal data.
curl https://api.authenica.tech/api/v1/lists/sources -H "X-Api-Key: $AUTHENICA_CLE_API"
Read and check an identity document
Beyond the lists, Authenica reads an identity document from its photo: identity card, passport, driving licence, residence permit. The service returns the fields read, the document model recognised and the checks performed (validity, authenticity, image quality, consistency of the machine-readable zone). You can prefill your onboarding form and know whether the document deserves trust.
The service keeps nothing. It receives the images, reads them, returns the result and forgets. No image and no value read is kept. What you keep is your decision.
What you send
POST /api/v1/document-readings, as multipart/form-data, with your key in X-Api-Key as for the lists.
| Field | Documents | In plain terms |
front and back | Identity card, driving licence, residence permit | Front and back, as two images. The front alone is accepted; the back alone is rejected. |
singlePage | Passport or single-page document | A single image. Cannot be combined with front and back. |
Images JPEG or PNG, 5 MB maximum each. The content is checked: a file renamed .jpg that is not an image is rejected.
curl -X POST https://api.authenica.tech/api/v1/document-readings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-F "front=@recto.jpg;type=image/jpeg" \
-F "back=@verso.jpg;type=image/jpeg"
What you receive
| Field | In plain terms |
documentName | The document model recognised, for example "Côte d'Ivoire, identity card 2020". Empty if the model is not recognised. |
fields | The identity fields read: surname, first names, date and place of birth, sex, nationality, issuing country, document number, issue and expiry dates, personal number, profession, height. Each carries its value, its confidence from 0 to 100, its source (machine-readable zone or visual reading) and its validity. |
otherFields | Any other field published by the document: nothing it says is lost. |
authenticity | The checks: overall, documentType, security, expiry, imageQuality, mrz, each OK, ERROR or NOT_PERFORMED. securityChecks gives the number of security checks passed, failed and not performed. |
expired | true if the document has expired, false otherwise. |
warnings | Points of attention, explained below. |
Nationality and country. They are returned as the document shows them, often in three letters (CIV). It is up to you to convert them to the two-letter code of your own form.
Flags
| Code | In plain terms |
DOCUMENT_EXPIRED | The document has expired. |
DOCUMENT_TYPE_NOT_RECOGNISED | The document model is not recognised: authenticity checks could not be performed. |
AUTHENTICITY_FAILED | An authenticity check failed: examine the document carefully. |
AUTHENTICITY_PARTIAL | Some checks could not be performed with this shot (for example those requiring special lighting), but none failed. This is not an alert. |
AUTHENTICITY_NOT_PERFORMED | Authenticity checks could not be performed on this document. |
LOW_IMAGE_QUALITY | The image quality is poor: retaking the photo may improve the reading. |
MRZ_CHECK_FAILED | The machine-readable zone is inconsistent: check the document number and the dates. |
SOURCES_DISAGREE | Two zones of the document give different values for at least one field. |
MISSING_FIELDS | Some identity fields could not be read: enter them manually. |
A real test on a fictitious document
Here is the actual API response for a passport image generated for the test : it is not authentic and carries only invented data. The service reads the fields, but reports that the model is not recognised and that the authenticity checks could not be performed, exactly as it should. For an authentic document of a known model, the model is named and the security checks are performed and counted in securityChecks.
Request
curl -X POST https://api.authenica.tech/api/v1/document-readings \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-F "singlePage=@passeport-fictif.png;type=image/png"
Actual API response (shortened)
{
"requestId": "c6f82bd1-898a-45de-bcbf-95925b156d48",
"documentName": null,
"fields": {
"LAST_NAME": {
"value": "KONE",
"confidence": 78,
"source": "MRZ",
"validity": "NOT_PERFORMED",
"consistent": true
},
"GIVEN_NAMES": {
"value": "AMINATA",
"confidence": 82,
"source": "MRZ",
"validity": "NOT_PERFORMED",
"consistent": true
},
"DATE_OF_BIRTH": {
"value": "1990-04-12",
"confidence": 34,
"source": "MRZ",
"validity": "ERROR",
"consistent": true
},
"NATIONALITY": {
"value": "CIV",
"confidence": 97,
"source": "MRZ",
"validity": "OK",
"consistent": true
},
"DOCUMENT_NUMBER": {
"value": "XXI2345G7",
"confidence": 34,
"source": "MRZ",
"validity": "ERROR",
"consistent": true
},
"EXPIRY_DATE": {
"value": "2031-01-01",
"confidence": 29,
"source": "MRZ",
"validity": "OK",
"consistent": true
}
},
"otherFields": {
"MRZ Type": {
"value": "ID-3",
"confidence": 100,
"source": "MRZ",
"validity": "NOT_PERFORMED",
"consistent": true
},
"Issuing State Name": {
"value": "Cote d'Ivoire",
"confidence": 0,
"source": "MRZ",
"validity": "OK",
"consistent": true
}
},
"authenticity": {
"overall": "ERROR",
"documentType": "ERROR",
"security": "NOT_PERFORMED",
"expiry": "OK",
"imageQuality": "ERROR",
"mrz": "ERROR",
"securityChecks": null
},
"expired": false,
"warnings": [
"DOCUMENT_TYPE_NOT_RECOGNISED",
"AUTHENTICITY_NOT_PERFORMED",
"LOW_IMAGE_QUALITY",
"MRZ_CHECK_FAILED"
]
}
Errors
| Code | When | What to do |
400 INVALID_IMAGES | Missing image, type not accepted, content that does not match the type, or singlePage combined with front or back. | Correct the upload. |
401 | Key missing, unknown, revoked or expired. | Check the key. |
413 | Image too large. | Reduce it below 5 MB. |
422 DOCUMENT_UNREADABLE | No document could be found in the image. | Retake the photo: whole document, well lit, flat. |
429 | Too many calls in the minute. | Wait for the delay in the header Retry-After. |
503 DOCUMENT_READER_UNAVAILABLE | The reading service is temporarily unavailable. | Retry, or let the data be entered manually. The service never invents a reading. |
A key with a limited lifetime. Your key may have an expiry date: after that date it is refused like an unknown key. Ask for renewal before it expires.
Errors
Every error has the same shape: {"code": "...", "message": "...", "requestId": "..."}. The message never repeats what you sent.
| HTTP | Code | In plain terms | What to do |
| 400 | INVALID_REQUEST | The request is incorrect: empty name, threshold outside 0 to 1, unknown type, unreadable body. | Correct the request. |
| 401 | API_KEY_REFUSED | Key missing, unknown, revoked or expired. | Check the key, or write to us if it has been revoked. |
| 429 | RATE_LIMITED | You have exceeded your per-minute quota. The header Retry-After says how many seconds to wait. | Wait, then retry; spread out your calls. |
| 503 | REFERENTIEL_UNAVAILABLE or GATEWAY_UNAVAILABLE | The service is temporarily unavailable. | Retry. Never treat a 503 as "no match". |
| 500 | INTERNAL_ERROR | Unexpected error on our side. | Retry; quote the requestId to our support. |
The golden rule: deny by default. If the call fails or times out, your process must suspend the operation (account opening, transfer...) rather than let it through. Set a timeout of a few seconds and a limited number of retries.
Code examples
In each example, the key comes from an environment variable and a failure suspends the operation.
import os, requests
reponse = requests.post(
"https://api.authenica.tech/api/v1/screenings",
headers={"X-Api-Key": os.environ["AUTHENICA_CLE_API"]},
json={"fullName": "Zorbek Nandrawell", "scoreThreshold": 0.85, "listTypes": ["SANCTIONS"]},
timeout=10,
)
if reponse.status_code != 200:
raise RuntimeError(f"Criblage impossible ({reponse.status_code}) : suspendre l'opération")
for fiche in reponse.json()["matches"]:
print(fiche["listName"], fiche["listVersion"], fiche["score"], fiche["confidence"])
// Node.js 18 ou plus
const reponse = await fetch("https://api.authenica.tech/api/v1/screenings", {
method: "POST",
headers: { "X-Api-Key": process.env.AUTHENICA_CLE_API, "Content-Type": "application/json" },
body: JSON.stringify({ fullName: "Zorbek Nandrawell", scoreThreshold: 0.85 }),
signal: AbortSignal.timeout(10_000),
});
if (!reponse.ok) throw new Error(`Criblage impossible (${reponse.status}) : suspendre l'opération`);
const { matches, requestId } = await reponse.json();
// Java 11 ou plus
HttpRequest requete = HttpRequest.newBuilder(URI.create("https://api.authenica.tech/api/v1/screenings"))
.timeout(Duration.ofSeconds(10))
.header("X-Api-Key", System.getenv("AUTHENICA_CLE_API"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{\"fullName\":\"Zorbek Nandrawell\",\"scoreThreshold\":0.85}"))
.build();
HttpResponse<String> reponse = HttpClient.newHttpClient().send(requete, HttpResponse.BodyHandlers.ofString());
if (reponse.statusCode() != 200) throw new IllegalStateException("Criblage impossible : suspendre l'opération");
curl -X POST https://api.authenica.tech/api/v1/screenings \
--max-time 10 --fail-with-body \
-H "X-Api-Key: $AUTHENICA_CLE_API" \
-H "Content-Type: application/json" \
-d '{"fullName":"Zorbek Nandrawell","scoreThreshold":0.85}'
OpenAPI contract
The API contract is published at https://api.authenica.tech/v3/api-docs. You can import it into Postman or Insomnia, or generate a client with a tool such as OpenAPI Generator.
Good practice
- Keep the
requestId and the listVersion with your decision: it is your proof in an inspection.
- Do not log the names searched or the key. Authenica does not keep them either: it searches, it does not store.
- A result is not a decision: a person reviews every match.
- Lists are reloaded automatically. The date each list was last loaded is in the list of sources.
- Set a timeout on every call and decide in advance what your process does if the service does not respond: it suspends.
Plans
Coming soon
We are preparing access plans adapted to each institution's call volume, in FCFA. They will be published on this page soon.
In the meantime, request evaluation access: you will be informed when they open.
Request evaluation access
Contact us
A demo, evaluation access, a commercial question: the contact form.
A key to change or revoke, an integration question, an incident: it@authenica.tech. Quote the requestId of the call concerned when you have one.