Available today · Provider of PEP and sanctions lists

Your sanctions and PEP lists, ready to integrate by API

Authenica provides compliance data: international and national sanctions lists and WAEMU politically exposed persons lists, consolidated, reloaded regularly and served through a secure API. Every result states the list and the list version it comes from.

Address: https://api.authenica.tech Format : JSON Access: API key

How it works

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").

CodeListIssuerTypeStatus
UN_CONSOLIDATEDSecurity Council consolidated listUnited NationsSanctionsServed
OFAC_SDNSpecially Designated Nationals list (SDN)US Department of the Treasury (OFAC)SanctionsServed
OFAC_CONSOLIDATEDConsolidated non-SDN listUS Department of the Treasury (OFAC)SanctionsServed
EU_FSFConsolidated list of financial sanctionsEuropean CommissionSanctionsServed
UK_SANCTIONS_LISTUK sanctions listForeign, Commonwealth and Development OfficeSanctionsServed
SECO_SWISS_SANCTIONSSwiss sanctions listState Secretariat for Economic Affairs (SECO)SanctionsServed
CANADA_SEMACanadian sanctions list (SEMA)Global Affairs CanadaSanctionsServed
CENTIF_CI_1373National list, resolution 1373CENTIF of Côte d'IvoireSanctionsServed
CI_GOVERNMENTComposition of the Government of Côte d'IvoireOffice of the Prime Minister of Côte d'IvoirePEPServed
UEMOA_PPEPolitically exposed persons of WAEMUAuthenica, from public sourcesPEPServed

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.

StateIssuerCodeStatus
BeninCENTIF of Benin—Being integrated
Burkina FasoCENTIF of Burkina Faso—Being integrated
Côte d'IvoireCENTIF of Côte d'IvoireCENTIF_CI_1373Served
Guinea-BissauCENTIF of Guinea-Bissau—Being integrated
MaliCENTIF of Mali—Being integrated
NigerCENTIF of Niger—Being integrated
SenegalCENTIF of Senegal—Being integrated
TogoCENTIF 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

  1. Get a keyApply online: we create your access and give you the key.
  2. Call the APIA POST call with the name searched and your key.
  3. 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.
TermIn plain terms
ScreeningLooking up a person or a company in the official sanctions and politically exposed persons lists.
PEPPolitically exposed person: someone who holds or has held a prominent public function.
API keyA long password, specific to your organisation, that proves the call comes from you.
QuotaThe number of calls allowed per minute for your access.

Get your key

  1. Fill in the evaluation key request form with the name of your organisation and the intended use. We reply within one working day.
  2. 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.
  3. 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

FieldDescriptionIn plain terms
fullName REQUIREDFull name searched, 300 characters maximumFirst names then surname, as on the identity document.
scoreThreshold REQUIREDNumber from 0 to 1Similarity threshold above which a record is returned. Your compliance policy sets it, not Authenica.
corroboratedThresholdNumber from 0 to 1, lower than the previous oneSecond threshold, valid only if the date of birth matches: a spelling variant scores lower but designates the same person.
entityTypeNATURAL_PERSON or LEGAL_ENTITYSearch only natural persons, or only companies. Absent: all.
listTypesArray of SANCTIONS, PPE, LOCALSearch only these types of lists. Absent or empty: all.
dateOfBirthDate AAAA-MM-JJUsed to confirm or contradict a record.
nationalityTwo-letter country code (CI, SN, ML...)Same.
placeOfBirthFree textSame.
documentNumberIdentity document numberReserved. Accepted only if your access is authorised for it; otherwise it is ignored and the response says so in ignoredFields.
referenceTextYour 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": []
}
FieldIn plain terms
requestIdThe 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.
matchesThe records found, from most to least similar. Empty: no record exceeds your threshold.
listTypeSANCTIONS : sanctions list, blocking. PPE : politically exposed persons. LOCAL : local list.
listNameThe code of the source list, for example OFAC_SDN, UN_CONSOLIDATED, EU_FSF, UEMOA_PPE. The full list is in "List the sources".
listVersionThe list batch that produced the record. Keep it: it proves in which version of the list the person appeared.
targetLabelThe name of the record found.
scoreThe similarity between the name searched and the record, from 0 to 1.
confidenceHow far the other elements confirm the match (see below).
evidenceThe detail of the comparison, element by element, for a person. For a company it is empty: only the name is compared.
detailsWhat the record found says, so you can understand it without opening the list (see "Record details").
ignoredFieldsFields 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.

ValueWhat it means
CORROBORATEDAt least one element matches (date of birth, nationality...) and none strongly contradicts.
MIXEDSome elements match and others contradict: human judgement is essential.
UNCORROBORATEDNothing confirms or rules out the match, because data are missing on one side or the other.
LIKELY_HOMONYMNo 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.

FieldIn plain terms
entityTypeNATURAL_PERSON : a natural person. LEGAL_ENTITY : a company.
listThe readable name of the list (label) and its issuer (publisher).
sanctionProgramsThe 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.
titleThe published function, for example "President of the Republic" or "Mayor of Niéllé". It is what tells two namesakes apart.
descriptionThe text the list publishes about the record, truncated to 600 characters. Absent when the function serves instead.
nationalities, datesOfBirth, placesOfBirthWhat 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.

FieldDocumentsIn plain terms
front and backIdentity card, driving licence, residence permitFront and back, as two images. The front alone is accepted; the back alone is rejected.
singlePagePassport or single-page documentA 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

FieldIn plain terms
documentNameThe document model recognised, for example "Côte d'Ivoire, identity card 2020". Empty if the model is not recognised.
fieldsThe 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.
otherFieldsAny other field published by the document: nothing it says is lost.
authenticityThe 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.
expiredtrue if the document has expired, false otherwise.
warningsPoints 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

CodeIn plain terms
DOCUMENT_EXPIREDThe document has expired.
DOCUMENT_TYPE_NOT_RECOGNISEDThe document model is not recognised: authenticity checks could not be performed.
AUTHENTICITY_FAILEDAn authenticity check failed: examine the document carefully.
AUTHENTICITY_PARTIALSome checks could not be performed with this shot (for example those requiring special lighting), but none failed. This is not an alert.
AUTHENTICITY_NOT_PERFORMEDAuthenticity checks could not be performed on this document.
LOW_IMAGE_QUALITYThe image quality is poor: retaking the photo may improve the reading.
MRZ_CHECK_FAILEDThe machine-readable zone is inconsistent: check the document number and the dates.
SOURCES_DISAGREETwo zones of the document give different values for at least one field.
MISSING_FIELDSSome 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

CodeWhenWhat to do
400 INVALID_IMAGESMissing image, type not accepted, content that does not match the type, or singlePage combined with front or back.Correct the upload.
401Key missing, unknown, revoked or expired.Check the key.
413Image too large.Reduce it below 5 MB.
422 DOCUMENT_UNREADABLENo document could be found in the image.Retake the photo: whole document, well lit, flat.
429Too many calls in the minute.Wait for the delay in the header Retry-After.
503 DOCUMENT_READER_UNAVAILABLEThe 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.

HTTPCodeIn plain termsWhat to do
400INVALID_REQUESTThe request is incorrect: empty name, threshold outside 0 to 1, unknown type, unreadable body.Correct the request.
401API_KEY_REFUSEDKey missing, unknown, revoked or expired.Check the key, or write to us if it has been revoked.
429RATE_LIMITEDYou have exceeded your per-minute quota. The header Retry-After says how many seconds to wait.Wait, then retry; spread out your calls.
503REFERENTIEL_UNAVAILABLE or GATEWAY_UNAVAILABLEThe service is temporarily unavailable.Retry. Never treat a 503 as "no match".
500INTERNAL_ERRORUnexpected 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.