curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"full_name": "Richard Cohen"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen",
"year": "1950"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"phone": "+33612211558"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"code_postal": "75018"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Marc",
"last_name": "Cohen",
"dept": "75"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"address": "2 avenue saint maurice du valais"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"email": "cohenrichard@hotmail.com"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen",
"address": "2 avenue saint maurice",
"email": "cohenrichard@hotmail.com",
"page": 1,
"per_page": 25
}
}'
import requests
resp = requests.post(
"https://search.leads-siren.com/enrichment-service/sniper-search",
headers={"x-api-key": "YOUR_API_KEY"},
json={
"data": {
"first_name": "Michel",
"last_name": "Jean",
"page": 1,
"per_page": 25,
}
},
)
print(resp.json())
{
"total": 2,
"page": 1,
"per_page": 25,
"total_pages": 1,
"credits_charged": 110,
"search_cost": 110,
"results": [
{
"nom_complet": "Richard Cohen",
"prenom": "Richard",
"nom": "Cohen",
"email": "cohenrichard@hotmail.com",
"adresse": "2 avenue saint maurice du valais",
"code_postal": "94410",
"ville": "ST MAURICE",
"departement": "94",
"telephone_mobile": "+33612211558",
"telephone_autres": null,
"phones": ["+33612211558"],
"date_naissance": "28/04/1948",
"source": "LPR"
}
]
}
{
"detail": "Address search is not enabled for your account"
}
{
"detail": "Email search is not enabled for your account"
}
{
"detail": "Provide first_name+last_name, full_name, address, email, phone, and/or code_postal/dept"
}
{
"detail": "Phone search is not enabled for your account"
}
Search
Sniper Search
POST
/
enrichment-service
/
sniper-search
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"full_name": "Richard Cohen"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen",
"year": "1950"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"phone": "+33612211558"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"code_postal": "75018"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Marc",
"last_name": "Cohen",
"dept": "75"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"address": "2 avenue saint maurice du valais"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"email": "cohenrichard@hotmail.com"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen",
"address": "2 avenue saint maurice",
"email": "cohenrichard@hotmail.com",
"page": 1,
"per_page": 25
}
}'
import requests
resp = requests.post(
"https://search.leads-siren.com/enrichment-service/sniper-search",
headers={"x-api-key": "YOUR_API_KEY"},
json={
"data": {
"first_name": "Michel",
"last_name": "Jean",
"page": 1,
"per_page": 25,
}
},
)
print(resp.json())
{
"total": 2,
"page": 1,
"per_page": 25,
"total_pages": 1,
"credits_charged": 110,
"search_cost": 110,
"results": [
{
"nom_complet": "Richard Cohen",
"prenom": "Richard",
"nom": "Cohen",
"email": "cohenrichard@hotmail.com",
"adresse": "2 avenue saint maurice du valais",
"code_postal": "94410",
"ville": "ST MAURICE",
"departement": "94",
"telephone_mobile": "+33612211558",
"telephone_autres": null,
"phones": ["+33612211558"],
"date_naissance": "28/04/1948",
"source": "LPR"
}
]
}
{
"detail": "Address search is not enabled for your account"
}
{
"detail": "Email search is not enabled for your account"
}
{
"detail": "Provide first_name+last_name, full_name, address, email, phone, and/or code_postal/dept"
}
{
"detail": "Phone search is not enabled for your account"
}
Search for a person in the Les Pages Rouges directory (OpenSearch). Matching records are deduplicated via Golden Record logic (pivot on name + postal code + city).
At least one mode must be provided. You can send any combination — name, address, email, phone, location, or all together.
Name search (
The cost is charged only once, on page 1. Subsequent pages (2, 3, …) re-run the same search and are free (
Address, email, phone, and location (postal code / department) search are restricted. Accounts need
config.allowed_services.address_search: true to include an address, code_postal, or dept field, config.allowed_services.email_search: true to include an email field, and config.allowed_services.phone_search: true to include a phone field. Requests that include a restricted field without the matching flag return 403 Forbidden. Name search (first_name + last_name) remains available to everyone.Search modes
| Mode | Fields | Who can use | Sources queried |
|---|---|---|---|
| Name | first_name + last_name or full_name | Everyone | LPR OpenSearch only |
| Address | address | address_search permission | LPR OpenSearch only |
email | email_search permission | LPR OpenSearch only | |
| Phone | phone | phone_search permission | LPR OpenSearch only |
| Location | code_postal and/or dept | address_search permission | LPR OpenSearch only |
| Combined | any mix of the above | Each restricted field needs its permission | All applicable sources |
code_postal and dept also act as filters when combined with a name/address/email search: results are narrowed to that exact postal code (or department).
Request Body
object
Show properties
Show properties
string
Person’s first name. Required together with
last_name when doing a name search.string
Person’s last name. Required together with
first_name when doing a name search.string
Full name (e.g.
"Richard Cohen"). An alternative to first_name + last_name for a name search — send either full_name or the first_name/last_name pair. When full_name is provided it takes precedence. Alias: fullName.string
Street address. Queries LPR OpenSearch by
address_search field (prefix/fuzzy match).Requires address_search permission — see Permissions.string
Email address. Queries LPR OpenSearch by exact
email match.Requires email_search permission — see Permissions.string
Phone number. Accepts international (
+33612211558) or national (0612211558) format — it is normalized and matched across all phone fields (mobile, landline, box, other, nearest).Requires phone_search permission — see Permissions. Alias: phone_raw.string
Birth year filter (e.g.
"1950"). When provided, only people born in that year OR with no known date of birth are returned; anyone with a different birth year is dropped.Works with any search mode (name, address, or email) and applies to all returned records.string
Postal code (e.g.
"75018"). Can be used standalone (returns everyone at that postal code) or as an exact-match filter combined with a name/address/email search.Requires address_search permission — see Permissions. Alias: postal_code.string
Department code (e.g.
"75"). Can be used standalone or as a filter combined with any other mode. Matches records by department.Requires address_search permission — see Permissions. Alias: departement.integer
default:"1"
Page number (1-based). Credits are charged only on page 1.
integer
default:"25"
Results per page.
string
Required when authenticating via JWT Bearer token instead of
x-api-key.Permissions
Address and email search are each gated by their own flag on the user document. They are independent — a user can have one, both, or neither.{
"config": {
"allowed_services": {
"address_search": true,
"email_search": true
}
}
}
| Flag | Controls | If true | If false / missing |
|---|---|---|---|
address_search | address, code_postal, dept fields | User may search by address / postal code / department | Request with any of those fields returns 403 |
email_search | email field | User may search by email | Request with non-empty email returns 403 |
phone_search | phone field | User may search by phone number | Request with non-empty phone returns 403 |
first_name + last_name) requires no permission and is always available.
Credit Cost
The charge is a flat rate per search — not per person returned. The number of matching records makes no difference; the cost depends only on whether any result in the set contains a phone and/or an email.| Condition | Cost |
|---|---|
| Any result has a phone | 100 credits |
| Any result has an email | 10 credits |
| Both phone and email in results | 110 credits (max) |
| No contacts in any result | 0 credits |
credits_charged is 0).
The response echoes both values so billing is transparent:
search_cost— the flat cost of the search (always returned, on every page).credits_charged— what was actually deducted on this request (equalssearch_coston page 1,0on later pages).
When a
year filter is applied, the cost reflects the filtered results the user actually receives — if filtering removes every record that had a contact, the search can cost less (or 0).Request examples
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"full_name": "Richard Cohen"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen",
"year": "1950"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"phone": "+33612211558"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"code_postal": "75018"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Marc",
"last_name": "Cohen",
"dept": "75"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"address": "2 avenue saint maurice du valais"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"email": "cohenrichard@hotmail.com"
}
}'
curl -X POST https://search.leads-siren.com/enrichment-service/sniper-search \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"first_name": "Richard",
"last_name": "Cohen",
"address": "2 avenue saint maurice",
"email": "cohenrichard@hotmail.com",
"page": 1,
"per_page": 25
}
}'
import requests
resp = requests.post(
"https://search.leads-siren.com/enrichment-service/sniper-search",
headers={"x-api-key": "YOUR_API_KEY"},
json={
"data": {
"first_name": "Michel",
"last_name": "Jean",
"page": 1,
"per_page": 25,
}
},
)
print(resp.json())
Response
{
"total": 2,
"page": 1,
"per_page": 25,
"total_pages": 1,
"credits_charged": 110,
"search_cost": 110,
"results": [
{
"nom_complet": "Richard Cohen",
"prenom": "Richard",
"nom": "Cohen",
"email": "cohenrichard@hotmail.com",
"adresse": "2 avenue saint maurice du valais",
"code_postal": "94410",
"ville": "ST MAURICE",
"departement": "94",
"telephone_mobile": "+33612211558",
"telephone_autres": null,
"phones": ["+33612211558"],
"date_naissance": "28/04/1948",
"source": "LPR"
}
]
}
{
"detail": "Address search is not enabled for your account"
}
{
"detail": "Email search is not enabled for your account"
}
{
"detail": "Provide first_name+last_name, full_name, address, email, phone, and/or code_postal/dept"
}
{
"detail": "Phone search is not enabled for your account"
}
Response fields
| Field | Type | Description |
|---|---|---|
total | integer | Total unique results across all pages |
page | integer | Current page |
per_page | integer | Page size |
total_pages | integer | Total number of pages |
credits_charged | integer | Credits actually deducted on this request (0 on pages 2+) |
search_cost | integer | Flat cost of the search (0/10/100/110), returned on every page |
results | array | Matching person records |
results[].nom_complet | string | Full display name |
results[].prenom | string | First name |
results[].nom | string | Last name |
results[].email | string | null | Email address |
results[].telephone_mobile | string | null | Primary mobile phone |
results[].telephone_autres | string | null | Other phones (; separated) |
results[].phones | string[] | All phone numbers (primary + others) as an array — use this to display every number |
results[].adresse | string | Street address |
results[].code_postal | string | Postal code |
results[].ville | string | City |
results[].departement | string | Department (from postal code) |
results[].date_naissance | string | Date of birth (DD/MM/YYYY) |
results[].source | string | The data source that matched this record |

