Documentation API

Référence complète de l'API Aprovall EDGE. Explorez tous les endpoints disponibles.

Authenticate

POST/auth/realms/eat_realm/protocol/openid-connect/token
Authenticate+

Account information

Informations about your e-Attestations Account and statistics like the number of thirdparties you monitore on e-Attestations

GET/api/v1/account
Account(s)+
GET/api/v1/account/{{account_id}}
Account statistics+
GET/api/v1/account/{{account_id}}/dossierTypes
Account dossier types list+
GET/api/v1/account/{{account_id}}/attributes
Account attributes+

Requirements

Account's requirements are the documents you are allowed to ask to your thirdpartis in your dossiers.

It depends on your e-Attestations configuration that you've designed with the help of you key account manager or automaticaly with your e-attestations subscription.

GET/api/v1/account/{{account_id}}/requirements
Requirements for the account+
GET/api/v1/account/{{account_id}}/dossiers/{{dossierId}}/requirements
Requirements of one dossier+

Thirdparties

Account's thirdparties list and details.

POST/api/v1/account/{{account_id}}/thirdparties/search
Search for new thirdparty+
POST/api/v1/account/{{account_id}}/thirdparties
Append a new third party in my portfolio+
POST/api/v1/account/{{account_id}}/thirdparties
Append a new unmanaged third party in my portfolio+
PUT/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}
Update a thirdparty code+
POST/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/attributes
Add or update a thirdparty attribute+
POST/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/stop
Archive a third party+
GET/api/v1/account/{{account_id}}/thirdparties
Account thirdparties+
GET/api/v1/account/{{account_id}}/thirdparties
Search for my account thirdparties by criterias+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}
Account thirdparthy details+
POST/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/contacts
Add un new thirdparty contact+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/contacts
Account thirdparthy contacts+
DELETE/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/contacts
Delete Account thirdparthy contact+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/attributes
Account thirdparthy attributes+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/calculated-attributes
Account thirdparthy calculated attributes+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/indicators
Account thirdparthy indicators+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/scores
Account thirdparthy scores+
GET/api/v1/account/{{account_id}}/legalstatus
Account thirdparties legal informations+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/history
Account thirdparties location history+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/notes
NotesList a third party notes+
POST/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/notes
NotesAdd a third party note+
PUT/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/notes/{{note_id}}
NotesUpdate a third party note+
DELETE/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/notes/{{note_id}}
NotesDelete a third party note+

Dossiers

All account's dossiers.

The 'dossier' resource is the materialization of the client / third party relationship.

In the response :

  • monitored : active / inactive dossier
  • state : true for an active and complete dossier
  • thirdpartyState : true for a registered user
  • stateLastChangeDate : complete / incomplete date for an active dossier (null for an inative dossier)
GET/api/v1/account/{{account_id}}/dossiers/all
Dossiers ALL+
GET/api/v1/account/{{account_id}}/dossiers
Dossiers+
GET/api/v1/account/{{account_id}}/dossiers
Dossiers by criterias+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}
Dossier details+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/attributes
Dossier attributes+

Dossiers creation & Processes

Dossier creation is an asynchronous process, you can find more details here

POST/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/dossiers
Create new dossier (sync)+
POST/api/v1/account/{{account_id}}/dossiers
Deprecated - Create new dossier with third party identifier (async)+
GET/api/v1/account/{{account_id}}/dossiers/process/8af2b4a592fc4d0701930b248bc20000
Dossier creation : get process by id+
GET/api/v1/account/{{account_id}}/dossiers/processes
Dossier creation : get processes+

Dossiers updates

POST/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/stop
Stop one dossier+
POST/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/reactivate
Activate one dossier+
POST/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}
Update details of one dossier+
POST/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/requirements
Update requirements of one dossier+
POST/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/attributes
Add or update a dossier attribute+

Dossier's notes

Add notes on your dossier. They will be visible when you do a GET on a dossier.

GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/notes
List a dossier notes+
POST/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/notes
Add a dossier note+
PUT/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/notes/{{note_id}}
Update a dossier note+
DELETE/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/notes/{{note_id}}
Delete a dossier note+

Dossier's documents

GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/documents
Documents+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/documents/{{document_id}}
Document details+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/documents/{{document_id}}
Document refused+

Dossier's Evidences & Files

get all evidences :

  • a form filled
  • a document fetched
  • a document uploaded

Each evidence is a file ( binary file + informations).

GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/documents/{{document_id}}/files
Evidences+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/documents/{{document_id}}/files/{{file_id}}
File download (binary format)+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/documents/{{document_id}}/files/{{file_id}}/link
File download Copy (auto signed URL)+
GET/api/v1/account/{{account_id}}/dossiers/{{dossier_id}}/files/download
File download all files for this dossier+

Documents

GET/api/v1/account/{{account_id}}/documents/search
Get documents informations+
GET/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/responses/{{response_id}}/notes
NotesList a document notes+
POST/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/responses/{{response_id}}/notes
NotesAdd a document note+
PUT/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/responses/{{response_id}}/notes/{{note_id}}
NotesUpdate a document note+
DELETE/api/v1/account/{{account_id}}/thirdparties/{{thirdparty_id}}/responses/{{response_id}}/notes/{{note_id}}
NotesDelete a document note+

Documents actions

POST/api/v1/account/{{account_id}}/responses/{{responseId}}/approve
Approve a document+
POST/api/v1/account/{{account_id}}/responses/{{responseId}}/reject
Refuse a document+

Contexts

Contexts let you group the third parties you monitor around a specific business situation — a public tender, a project, a purchasing campaign — and follow their compliance together.

Key concepts

  • Context model — a ready-made template defined for your account (its name, the attributes it carries, and whether a supply-chain declaration is expected). You choose a model when you create a context.
  • Context — one concrete instance of a model (e.g. "Tender 2026-001"), with its own reference, attributes and third parties.
  • Context third party — a third party attached to a context. Third parties can be organised as a tree (a supplier and its sub-suppliers) when the supply-chain option is enabled on the context.
  • Notes — free comments you can attach to a context or to one of its third parties.

Typical flow

  1. List context models to get the model name to use.
  2. Create context from that model.
  3. Attach third parties (at first level, or as a full supply-chain tree).
  4. Follow up with attributes, dossiers and notes.
GET/api/v1/accounts/{{account_id}}/context-models
List context models+
GET/api/v1/account/{{account_id}}/contexts
List contexts+
GET/api/v1/account/{{account_id}}/contexts/{{context_id}}
Get context by id+
POST/api/v1/account/{{account_id}}/contexts
Create context+
POST/api/v1/account/{{account_id}}/contexts
Create context with third-party tree+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/attributes/{{ctx_attr_id}}
Update context attribute+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/archive
Archive context+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/reactivate
Reactivate context+
GET/api/v1/account/{{account_id}}/contexts/{{context_id}}/notes
NotesList context notes+
POST/api/v1/account/{{account_id}}/contexts/{{context_id}}/notes
NotesAdd context note+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/notes/{{note_id}}
NotesUpdate context note+
DELETE/api/v1/account/{{account_id}}/contexts/{{context_id}}/notes/{{note_id}}
NotesDelete context note+

Third parties contexts

The third parties attached to a context.

They can form a tree: a first-level third party, its sub-suppliers (children), and so on — when the supply-chain option is enabled on the context. Each third party in the tree has its own id (called a context third party id), distinct from the third party's own identifier.

GET/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties
List context third parties+
POST/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties
Associate third parties to context - first level+
POST/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties
Associate child third party to another one+
GET/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}
Get context third party+
GET/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/attributes
Get context third party attributes+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/attributes/{{ctp_ctx_attr_id}}
Update context third party attribute+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/archive
Archive context third party+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/reactivate
Reactivate context third party+
POST/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/dossiers
Create dossier for context third party+
GET/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/notes
NotesList context third party notes+
POST/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/notes
NotesAdd context third party note+
PUT/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/notes/{{note_id}}
NotesUpdate context third party note+
DELETE/api/v1/account/{{account_id}}/contexts/{{context_id}}/context-thirdparties/{{ctp_id}}/notes/{{note_id}}
NotesDelete context third party note+

Advanced search V2

Query your third partiesdossiers and documents with a criteria builder: a tree of boolean conditions (AND / OR) that you compose freely, over any field available for your account.

📖 For an illustrated, step-by-step walkthrough of the concepts, see the Advanced Search concept guide.

How it works — 3 steps

  1. Discover the filterable fields — first call reference-data (endpoint below). It returns, for your account, the list of fields you can filter on, each with: its technical name (field), type (fieldType), nature (nature), resource (resourceType), allowed operators (availableOperators) and, for coded fields, the possible values (options).

  2. Build the query — copy these descriptors into the conditions of your filters tree (see "Anatomy of a condition" below). Each condition's field always comes from reference-data: you never invent a field name or a coded value.

  3. Search or export — send the request to the search endpoint of the target resource (Third parties / Dossiers / Documents), or to its export twin to get a file.

Anatomy of a condition

A condition = a field + an operator + values:

{
  "field": {
    "field": "addressCountryCode",
    "fieldType": "TEXT",
    "nature": "MAIN_FIELD",
    "resourceType": "THIRD_PARTY"
  },
  "operator": "EQUAL",
  "values": ["FR"]
}

KeyRoleWhere to find it
field.fieldField technical namefield in reference-data
field.fieldTypeTEXT · NUMERIC · DATE · BOOLEANfieldType in reference-data
field.natureMAIN_FIELD · ATTRIBUTE · SCORE · CALCULATED_ATTRIBUTE · INDICATOR · FORM_FIELDnature in reference-data
field.resourceTypeTHIRD_PARTY · DOSSIER · DOCUMENTresourceType in reference-data
field.idRequired for ATTRIBUTE / CALCULATED_ATTRIBUTE / INDICATOR / FORM_FIELDid in reference-data
operatorComparison operatorthe field's availableOperators
valuesValues — always strings["FR"]["50"]["true"]["2026-01-01"]the field's options (coded fields)

A condition can target a resource other than the one queried (cross-resource filtering) via its resourceType — e.g. find third parties that have a dossier of a given type.

Filter groups: childGroups (nested AND / OR)

A group has a single connectiveOperator (AND or OR) that joins all its conditions and all its childGroups. To mix AND and OR, nest sub-groups in childGroups — depth is unlimited.

Example — third parties FR AND (headcount ≥ 50 OR turnover ≥ 1,000,000):

{
  "filters": {
    "connectiveOperator": "AND",
    "conditions": [
      {
        "field": { "field": "addressCountryCode", "fieldType": "TEXT", "nature": "MAIN_FIELD", "resourceType": "THIRD_PARTY" },
        "operator": "EQUAL",
        "values": ["FR"]
      }
    ],
    "childGroups": [
      {
        "connectiveOperator": "OR",
        "conditions": [
          {
            "field": { "field": "workforce", "fieldType": "NUMERIC", "nature": "MAIN_FIELD", "resourceType": "THIRD_PARTY" },
            "operator": "GREATER_OR_EQUAL",
            "values": ["50"]
          },
          {
            "field": { "field": "turnover", "fieldType": "NUMERIC", "nature": "MAIN_FIELD", "resourceType": "THIRD_PARTY" },
            "operator": "GREATER_OR_EQUAL",
            "values": ["1000000"]
          }
        ],
        "childGroups": []
      }
    ]
  }
}

The root group applies AND between the "country = FR" condition and the sub-group; the sub-group applies OR between its two conditions.

GET/api/v1/reference-data/advanced-search-fields
Discover searchable fields+
POST/api/v1/account/{{account_id}}/third-parties/advanced-search-v2
Thirdparties search+
POST/api/v1/account/{{account_id}}/dossiers/advanced-search-v2
Dossiers search+
POST/api/v1/account/{{account_id}}/documents/advanced-search-v2
Documents search+
POST/api/v1/account/{{account_id}}/third-parties/advanced-search-v2/export
Thirdparties export+
POST/api/v1/account/{{account_id}}/dossiers/advanced-search-v2/export
Dossiers export+
POST/api/v1/account/{{account_id}}/documents/advanced-search-v2/export
Documents export+

Errors codes

Here are the HTTP Status Codes and Error Codes used by our API:

HTTP Status CodeDescription
200 OKSuccessful.
400 Bad RequestIn the API response, field which is missing or invalid will be emphasized.
401 UnauthorizedThe client passed in the invalid Auth token. Client should refresh the token and then try again.
403 ForbiddenAccess to this resource is forbidden in this context.
404 Not FoundThe ressource is missing.
500 Internal Server ErrorServers are not working as expected. The request is probably valid but needs to be requested again later.

In case you receive a 400 ou 500 Http Status Code, you will find in the response a custom error code which give more information on the error cause:

Error codeError description
E001Missing parameter
E002Unknown parameter
E003Empty parameter
E010Wrong format
E011Maximum size exceeded
E021Expiration date is in the past
E022Date in future
E030Invalid E-mail domain
E100No company matching your search
E101Error qualifying the company
E102Company does not exist
E103Company is closed
E104Too many companies for this criteria
E105Company ID has change to
E111Thirdparty code (supplierCode) is different regarding the existing one
E112Thirdparty code (supplierCode) is already used for another thirdparty
E113Thirdparty account disabled
E122Impossible to import an international company. 'The international' option is not activated.
E200No dossier matching your search
E201Dossier disabled
E202Reference exists for third party
E203No dossier with this reference
E204Dossier already enabled
E205Dossier is reactivated with a date in the past. You should modify the date.
E206Dossier type not found
E207Updating documents is forbidden on a typed dossier
E301Requirement disabled
E302Requirement not allowed
E303Requirement disabled from the dossier type
E304Requirement not allowed from the dossier type
E401Unauthorised to make request on your DnB account.
E402You have reach the request limit of your DnB account.
E1000Error during id encryption
E1001Error during id decryption
E1002SIREN or SIRET type must be used with FR countryCode
E1005Invalid value
E1006Service temporarily unavailable