Aller au contenu

Web Services / API d'intégration One Click Contract V6

Cette API permet d’accélérer la souscription Trust and Sign de vos clients déjà connus (renouvellement, "up sales", etc.). Les clients éligibles ont uniquement besoin de s'authentifier à Trust and Sign via leur mobile pour que les informations et justificatifs de leur précédent dossier soient automatiquement récupérés dans leur nouveau dossier.

Prérequis

*** Prérequis à l’utilisation des web services d’intégration ***

Pour obtenir les accès d’authentification auprès des web services de Trust and Sign, il faut effectuer les démarches de création de compte auprès de Namirial.

Afin de pouvoir utiliser l'API One Click Contract, il faut disposer du couple login / mot de passe One Click Contract associé à votre compagnie. Ces informations sont envoyées par Namirial lorsque vous souhaitez utiliser cette fonctionnalité. Le login correspond à la clé publique et le mot de passe à la clé secrète.

Les URL de base des services d’intégration sont les suivantes :

Les chapitres suivants décrivent l'API JSON. Suivant l'évolution du produit, nous pouvons ajouter des champs non documentés dans les retours. Il ne faudra donc pas être trop restrictif sur les payloads.

Attention, le nom des clés est sensible à la casse. Les champs obligatoires seront notés (*), les autres champs seront facultatifs.

Authentification

L’authentification « Basic » est utilisée ici ; elle suit la norme RFC1945. Un header HTTP nommé AUTHORIZATION doit être ajouté aux requêtes. Ce dernier est de la forme :

AUTHORIZATION = Basic base64(login:password)

Le bout de code suivant peut être utilisé en Java pour générer ce header :

String header = "Basic " + Base64.getEncoder().encodeToString( ( login + ":" + password ).getBytes( StandardCharsets.UTF_8 ) );

Par exemple, pour un login “john123456” et un mot de passe “azerty” on obtient le header suivant :

AUTHORIZATION = Basic am9objEyMzQ1NjphemVydHk=

Gestion d’erreur

Si une erreur se produit lors d’une requête, un code HTTP standard est renvoyé avec un JSON d’erreur contenant un code spécifique au serveur Trust and Sign, un message explicatif et les éventuels paramètres invalides.

Par exemple :

{
  "error": {
    "message":"Server error",
    "code":1000
  }
}

Vérification de l'éligibilité d'un dossier One Click Contract

** Requête **

Recherche globale sur tous les produits accessibles

POST /contract/v6/1cc/check-eligibility HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=UTF-8

{
  "email" : "participant@namirial.com"
}

Recherche affinée sur certains produits

POST /contract/v6/1cc/check-eligibility HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=UTF-8

{
  "email" : "participant@namirial.com",
  "products" : [{
    "label" : "Test product 1",
    "maxAge" : 180
  },
  {
    "label" : "Test product 2",
    "maxAge" : 90
  }]
}
Path Type Description
email* String (*) Email du participant demandant la vérification One click contract
products[].label String Label des produits où chercher un participant
products[].maxAge Number Age maximum de création du dossier au sein d'un produit (en jours)

** Retour **

Un objet JSON contenant les informations suivantes :

Path Type Description
isEligible* Boolean True si l'email est éligible One Click Contract
mobilePhoneTruncated String 3 derniers chiffres du numéro de téléphone
{
  "isEligible" : true,
  "mobilePhoneTruncated" : "025"
}

Création d'un dossier One Click Contract

** Requête **

POST /contract/v6/1cc/authenticate HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=UTF-8

{
  "email" : "participant@namirial.com",
  "otpTemplate": "Votre code OTP ${otp}",
  "products" : [{
    "label" : "Test product 1",
    "maxAge" : 180
  },
  {
    "label" : "Test product 2",
    "maxAge" : 90
  }]
}

Path Type Description
email String (*) Email du participant demandant la vérification One click contract
otpTemplate String Modèle du SMS envoyé au participant. Il doit contenir obligatoirement la chaîne ${otp}. Si ce champ n'est pas défini, le modèle par défaut sera utilisé
products[].label String Label des produits où chercher un participant
products[].maxAge Number Age maximum de création du dossier au sein d'un produit

** Retour **

Un objet JSON contenant les informations suivantes :

Path Type Description
isEligible Boolean (*) True si l'email est éligible One Click Contract
oneccToken String Token One Click Contract
{
  "isEligible" : true,
  "oneccToken" : "20190813_U5sSJsAjHoEe08ue8ow8Jbi4Othz0da"
}

Validaton d'un OTP One Click Contract

** Requête **

POST /contract/v6/1cc/validate HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=UTF-8

{
  "token" : "20190813_iDayMPuvhn0VeeEQ8jCSMBRqDJuX5D3",
  "otpCode" : "1234"
}
Path Type Description
token String (*) Token One click contract
otpCode String (*) Code OTP

** Retour **

Un objet JSON contenant les informations suivantes :

Path Type Description
oneccUUID String Uuid de l'enregistrement
oneccToken String Token d'authentification
clientFile Object Dossier de référence
clientFile.uuid String Uuid du Dossier
clientFile.creationDate String Date de création du dossier
clientFile.finalizationDate String Date de Finalisation du dossier
clientFile.productLabel String Label du produit
clientFile.workflowLabel String Label du parcours
clientFile.state String Etat du dossier
clientFile.externalInfo Object Données additionnelles du dossier.
participant Object Participant du dossier éligible
participant.civility String Civilité
participant.email String Email
participant.lastName String Nom
participant.firstName String Prénom
participant.birthDate String Date de naissance
participant.birthPlace String Lieux de naissance
participant.birthName String Nom de naissance
participant.mobilePhone String Numéro de mobile
participant.iban String IBAN
participant.postalAddress Object Adresse postale du participant
participant.postalAddress.address1 String Première ligne de l’adresse postale
participant.postalAddress.address2 String Deuxième ligne de l’adresse postale
participant.postalAddress.address3 String Troisième ligne de l’adresse postale
participant.postalAddress.city String Ville
participant.postalAddress.postalCode String Code postal
participant.postalAddress.countryCode String Code Pays
documents[] Array Documents uploadés par le participant
documents[].label String Label
documents[].type String Type de document
documents[].attachmentId String Identifiant du document
documents[].files Array Fichiers envoyés dans le dossier
documents[].files[].name String Nom du fichier
documents[].files[].mimeType String Mime type du fichier
documents[].controls Object Contrôles des documents (liste non exhaustive)
documents[].controls.participants[] Array Contrôles spécifiques du participant
{
  "oneccUUID" : "b634185a-aced-4743-8607-24eae701ea51",
  "oneccToken" : "20190829_5XWR8JhphhNBtp6NGTGHMEwGQA9m5TE",
  "participant" : {
    "email" : "validate@namirial.com",
    "mobilePhone" : "067891234",
    "lastName" : "Doe",
    "firstName" : "John",
    "birthDate" : "1980-06-02",
    "birthPlace" : "Montpellier",
    "birthName" : "Doe",
    "iban" : "FR7630001007941234567890185",
    "postalAddress" : {
      "address1" : "10 Rue de Montpellier",
      "address2" : "Bat.2",
      "address3" : "2è étage",
      "city" : "Montpellier",
      "postalCode" : "34000"
    }
  },
  "clientFile" : {
    "uuid" : "7a72163f-5b7e-4fd2-9334-76f18e103b4e",
    "creationDate" : "2019-08-29T15:36:48Z",
    "finalizationDate" : "2019-08-29T15:36:51Z",
    "productLabel" : "Test product",
    "workflowLabel" : "dummy-simple",
    "state" : "ACCEPTED",
    "externalInfo" : {
      "ext1" : "v1"
    }
  },
  "documents" : [ {
    "label" : "ID card",
    "type" : "id_card",
    "attachmentId" : "1",
    "controls" : {
      "modelValid" : true,
      "containsAnnotations" : false,
      "documentNotExpired" : true,
      "ocrMrzDocumentNumberMatch" : true,
      "ocrMrzBirthNameMatch" : true,
      "faithfulFont" : true,
      "securityElements" : true,
      "ocrMrzIssuanceDateMatch" : true,
      "ocrMrzFirstNamesMatch" : true,
      "documentTypeMatch" : true,
      "documentCountryValid" : true,
      "documentAppearanceValid" : true,
      "ocrMrzBirthDateMatch" : true,
      "mrzValid" : true,
      "backSideFound" : true,
      "documentValid" : true,
      "issuanceAndExpirationDateMatch" : true,
      "mrzOcrConsistent" : true,
      "participants" : [ {
        "owner" : "70905b46-630a-4107-b70f-e3f6054fa328",
        "firstLastNamesInverted" : false,
        "lastNameMatch" : true,
        "namesInverted" : false,
        "birthDateMatch" : true,
        "firstNameMatch" : true,
        "civilityMatch" : true
      } ]
    },
    "files" : [ {
      "name" : "1_1_id_card_01.png",
      "mimeType" : "image/png"
    } ]
  }, {
    "label" : "Facture EDF",
    "type" : "payslip",
    "attachmentId" : "3",
    "controls" : {
      "companyIdValid" : true,
      "containsAnnotations" : false,
      "nirValid" : true,
      "companyOfficeIdValid" : true,
      "companyConnectorRequested" : true,
      "nirFound" : true,
      "documentTypeMatch" : true,
      "companyConnectorFailed" : false,
      "participants" : [ {
        "owner" : "70905b46-630a-4107-b70f-e3f6054fa328",
        "birthDateMatch" : true,
        "nameFound" : true,
        "civilityMatch" : true,
        "postalAddressFound" : true,
        "postalAddressMatch" : true
      } ]
    },
    "files" : [ {
      "name" : "3_1_payslip_01.png",
      "mimeType" : "image/png"
    } ]
  } ]
}

** Principales Erreurs **

Token inconnu, expiré ou déjà validé

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
  "error" : {
    "code" : 1012,
    "invalidParameters" : [ "token" ],
    "message" : "Token not found"
  }
}

l'OTP ne correspond pas à celui envoyé

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error" : {
    "code" : 1071,
    "invalidParameters" : [ "OtpCode" ],
    "message" : "Invalid OTP code"
  }
}

l'OTP est en erreur, aucune validation possible, le dossier 1CC ne pourra pas être créé

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error" : {
    "code" : 1069,
    "invalidParameters" : [ "OtpCode" ],
    "message" : "OTP validation failed"
  }
}

l'OTP ne peut être validé, un nouvel OTP peut être redemandé

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error" : {
    "code" : 1072,
    "invalidParameters" : [ "OtpCode" ],
    "message" : "Validate OTP code error, can renew"
  }
}

Téléchargement des documents du registre One Click Contract

** Requête **

GET /contract/v6/1cc/document/${filename} HTTP/1.1
Path Type Description
${filename} String Nom du fichier à télécharger (obtenu dans documents[].files[].name)

** Retour **

HTTP/1.1 200 OK