---
title: "Vérifier l'appartenance de numéros"
method: POST
path: "/search/verify-phone-ownership"
tags: ["Person Enrichment"]
---

# Vérifier l'appartenance de numéros

`POST /search/verify-phone-ownership`

## Request

- Base URL: `https://api.listar.fr`
- URL: `https://api.listar.fr/search/verify-phone-ownership`
- Auth: HTTP bearer

Vérifie si 1 à 10 numéros (format `+E164`) appartiennent à la personne donnée, à partir des comptes de messagerie liés au numéro (photo et nom), des vérifications passées et de notre index. L'URL LinkedIn, optionnelle, permet la comparaison de visage. **Facturé 5 cts par numéro tranché** (`owned` ou `not_owned`) ; les numéros `unknown` et `invalid` sont remboursés. Renvoie `402` si le crédit est insuffisant pour l'ensemble de la requête. Chaque numéro est interrogé en direct : comptez jusqu'à une minute. Un même numéro ne peut figurer qu'une fois par requête.

## Request body

- object
  - `contacts` object[], required
    - `phone` string, required
    - `firstName` string: Avec `lastName`, ou omis avec lui : jamais un seul des deux.
    - `lastName` string: Avec `firstName`, ou omis avec lui.
    - `linkedinUrl` string, nullable: URL du profil LinkedIn de la personne : permet la comparaison de visage, bien plus précise. Sans les noms, elle doit être une URL de profil (`linkedin.com/in/…`). Avec les noms, une autre URL LinkedIn (Sales Navigator, page entreprise) est ignorée.

## Response `200`

Verdicts par numéro.

- object
  - `results` object[]
    - `phone` string
    - `status` 'owned' | 'not_owned' | 'unknown' | 'invalid'
    - `checkedName` string, nullable: Nom contre lequel le numéro a été vérifié : celui fourni, ou celui lu sur le profil LinkedIn (renvoyé seulement avec un verdict facturé).
    - `reason` 'face_match' | 'face_mismatch' | 'name_match' | 'name_mismatch' | 'known_owner' | 'known_owner_other' | 'profile_unknown' | 'invalid_number' | 'no_evidence': `face_match` / `face_mismatch` : la photo du compte lié au numéro correspond / montre une autre personne. `name_match` / `name_mismatch` : le compte lié au numéro porte exactement ce nom / celui d'une autre personne. `known_owner` / `known_owner_other` : une vérification passée a rattaché le numéro à cette personne / à une autre (un numéro n'appartient qu'à une personne). `profile_unknown` : aucun nom lisible sur le profil LinkedIn. `invalid_number` : numéro non attribuable. `no_evidence` : pas assez d'éléments.
    - `signals` object: Ce que les vérifications ont trouvé, renseigné seulement avec un verdict facturé (`owned`, `not_owned`). Sur un verdict remboursé, seuls `lineType`, `country`, `carrier` et `isVirtual` sont remplis.
      - `lineType` 'mobile' | 'fixed' | 'special' | 'unknown', nullable
      - `country` string, nullable
      - `carrier` string, nullable: Opérateur auquel l'ARCEP a attribué le bloc du numéro (mobiles français uniquement, `null` ailleurs). Ce n'est pas l'opérateur actuel d'un numéro porté.
      - `isVirtual` boolean, nullable: Numéro virtuel (application de second numéro, téléphonie cloud, tranche VoIP) : `true`, ou `null` quand rien ne l'indique. Jamais `false` : un numéro porté vers un opérateur virtuel garde le préfixe de son opérateur d'origine. Mobiles français : bloc ARCEP attribué à un opérateur de numéros virtuels. Ailleurs : tranche que le plan national réserve à la VoIP.
      - `isWhatsApp` boolean, nullable
      - `isWhatsAppBusiness` boolean, nullable
      - `isTelegram` boolean, nullable
      - `faceMatch` object, nullable
        - `isMatch` boolean
        - `confidence` 'high' | 'medium' | 'low'
      - `nameMatch` object, nullable
        - `isMatch` boolean
        - `confidence` 'high' | 'medium' | 'low'
      - `recordedUnderOtherName` boolean: Notre base connaît ce numéro, mais jamais sous ce nom. Indicatif seulement : ne décide pas du verdict.
      - `formerOwner` boolean: Le numéro a appartenu à la personne mais a changé de titulaire depuis.
  - `creditDeducted` integer: Montant débité (centimes, 5 par numéro tranché), après remboursement des numéros non tranchés.
  - `creditRefunded` integer: Montant remboursé (centimes) pour les numéros non tranchés. Ici : 2 numéros, 10 cts réservés, 1 tranché et 1 remboursé.

## Other responses

- `400`: Requête invalide, rien n'est débité : un seul des deux noms, ni noms ni URL de profil LinkedIn, URL qui n'est pas un profil alors que les noms sont omis, même numéro deux fois, numéro hors format `+E164`.
- `402`: Crédit insuffisant.
- `429`: Trop de requêtes (60 / min par clé API).

---

[API](https://skmtc.dev/listar/apis/listar-api.md) · [All operations](https://skmtc.dev/listar/apis/listar-api/llms.txt) · [OpenAPI document](https://skmtc.dev/listar/apis/listar-api/revisions/d8b4a5e9acc8?raw)
