Documentation API Manuscry - v1.0
L'API Manuscry permet d'ajouter des contacts à vos campagnes de courriers personnalisés de manière programmatique.
Introduction
L'API Manuscry permet d'ajouter des contacts à vos campagnes de courriers personnalisés de manière programmatique. Cette API vous permet d'intégrer facilement l'ajout de contacts dans vos workflows existants.
Rate Limiting :
L'API est limitée à 100 requêtes par minute par utilisateur pour garantir la stabilité du service.
Limitations importantes :
Les campagnes en pause (status: paused) peuvent être consultées via l'API mais aucune action d'écriture n'est autorisée. Ces actions retourneront une erreur HTTP 403 avec le message "Campaign paused".
Les campagnes annulées (status: cancelled) peuvent être consultées via l'API mais aucune action d'écriture n'est autorisée (ajout de contacts, validation de courriers, etc.). Ces actions retourneront une erreur HTTP 403 avec le message "Campaign cancelled".
Terminologie et compatibilité :
Manuscry utilise le terme "campaign" (campagne) dans toute son API pour désigner une campagne de courriers.
Par compatibilité technique, l'alias agent_filter est également accepté mais campaign_filter est recommandé.
Si les deux paramètres sont fournis, campaign_filter est prioritaire.
Authentification
L'API utilise l'authentification par clé API. Vous devez créer une clé API depuis votre espace utilisateur, et l'utiliser dans vos requêtes d'une des façons suivantes.
- Header Authorization :
Authorization: Bearer YOUR_API_KEY
- Paramètre URL :
?api_key=YOUR_API_KEY
Pour créer une clé API, rendez-vous sur votre espace puis dans la section "API", créez votre clé, et copiez la (elle ne sera affichée qu'une fois). Gardez votre clé API confidentielle et ne la partagez jamais publiquement.
Récupérer la configuration d'une campagne
Récupère les champs personnalisés et la configuration d'une campagne spécifique. Les champs retournés dépendent du type de campagne et de la configuration de la lettre.
https://manuscry.com/api/api/campaigns/{campaign_id}/settings
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaign_id | string | Oui | ID hashé de la campagne (visible dans l'URL de votre campagne) |
Exemple de requête
Exemple de réponse
Champs dynamiques :
Les champs retournés dépendent de plusieurs facteurs :
- Type de campagne : manual, birthday, linkedin, self-print
- Configuration de la lettre : Variables {custom} détectées dans le contenu
- Mode de personnalisation : IA complète (ai_context) ou texte à trous (variables)
Utilité pour la validation :
Cet endpoint est essentiel avant d'ajouter des contacts. La structure de validation_errors retournée lors d'un échec vous permet de savoir exactement quels champs sont manquants (missing_fields) ou invalides (invalid_fields).
Champ can_add_contacts :
Ce champ indique si la campagne accepte l'ajout manuel de contacts via API.
true: Vous pouvez ajouter des contacts (manual, birthday, linkedin manuel, self-print)
false: Ajout manuel interdit (linkedin auto, bases de données automatiques)
Campagnes avec ciblage automatique :
Les campagnes avec ciblage automatique retournent can_add_contacts: false et fields: [].
Ces campagnes génèrent leurs contacts automatiquement selon les critères de ciblage configurés.
Champ ai_context :
Présent uniquement si le contenu principal de la lettre est en mode IA (génération complète).
Ce champ est toujours optionnel et permet de fournir un contexte personnalisé qui sera fusionné avec :
- Pour LinkedIn : le contexte extrait automatiquement du profil
- Pour les autres types : le contexte général de la campagne
Variables personnalisées :
Si votre lettre contient des variables {custom} (exemple: {secteur_activite}, {chiffre_affaires}),
un champ sera généré pour chaque variable avec :
is_custom: true
is_in_letter: true
required: true(car utilisé dans la lettre)
Utilisation recommandée :
Appelez cet endpoint AVANT d'ajouter des contacts pour :
- Vérifier que
can_add_contactsest àtrue
- Récupérer la liste exacte des champs requis
- Connaître les validations à appliquer
- Comprendre quels champs sont utilisés dans la lettre (
is_in_letter: true)
Statistiques d'une campagne
Récupère les statistiques de performance d'une campagne.
https://manuscry.com/api/api/campaigns/{campaignId}/stats
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaignId | string | Oui | ID hashé de la campagne |
| period | string | Non | Période d'analyse (7d, 14d, 30d, 60d, 90d, 120d, 180d, 365d) |
Exemple de requête
Exemple de réponse
Endpoints disponibles:
/api/campaigns/{campaignId}/stats(recommandé pour Manuscry)
/api/agents/{campaignId}/stats(alias fonctionnel pour compatibilité)
Ajouter un contact manuel
Ajoute un contact avec adresse postale complète à une campagne de type manuel.
https://manuscry.com/api/api/campaigns/{campaign_id}/contacts
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaign_id | string | Oui | ID hashé de la campagne (type: manual) |
Exemple de requête
Exemple de réponse
Type de campagne : manual
Champs obligatoires :
address_line1: Nom ou raison sociale du destinataire
address_line2: Numéro et nom de rue
address_zip: Code postal
address_city: Ville (en majuscules)
address_country: Code pays ISO 3166-1 alpha-2 (FR, BE, CH, etc.)
Champs optionnels :
identifier: Identifiant unique (auto-généré si vide)
address_line3: Complément d'adresse (étage, appartement, etc.)
scheduled_at: Date d'envoi programmée au format YYYY-MM-DD (optionnel)
ai_context: Contexte personnalisé pour la génération IA (si mode IA activé)
- Variables personnalisées : Si votre lettre contient {nom_variable}, ajoutez le champ correspondant
Gestion des erreurs de validation :
En cas d'erreur de validation (HTTP 422), la réponse inclut :
validation_errors: Objet avec chaque champ en erreur et son message explicite
missing_fields: Tableau des champs obligatoires manquants
invalid_fields: Tableau des champs présents mais invalides (format incorrect, etc.)
Exemple de réponse d'erreur :
{
"success": false,
"error": "Validation failed",
"message": "The provided contact data contains errors",
"validation_errors": {
"address_zip": "Le champ Code postal est obligatoire",
"address_city": "Le champ Ville est obligatoire",
"linkedin_url": "Le champ URL LinkedIn doit être une URL valide"
},
"missing_fields": ["address_zip", "address_city"],
"invalid_fields": ["linkedin_url"]
}
Programmation d'envoi :
Le paramètre scheduled_at permet de programmer l'envoi à une date spécifique (format: YYYY-MM-DD).
Si fourni, cette date est prioritaire sur agent.min_scheduled_date.
Dates passées acceptées (envoi immédiat si date passée).
Champs dynamiques :
Les champs requis dépendent de la configuration de votre lettre. Utilisez GET /api/campaigns/{campaign_id}/settings pour récupérer la liste complète des champs avec leurs validations.
Champ ai_context :
Le champ ai_context est optionnel. Si le contenu principal de votre lettre est en mode IA, ce champ permet de fournir un contexte personnalisé qui sera utilisé pour personnaliser le contenu généré automatiquement.
Variables personnalisées :
Si votre lettre contient des variables {custom} (par exemple {secteur_activite}), vous devez inclure les champs correspondants dans la requête (secteur_activite dans cet exemple).
Ajouter un contact anniversaire
Ajoute un contact avec date d'anniversaire pour envoi automatique programmé.
https://manuscry.com/api/api/campaigns/{campaign_id}/contacts
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaign_id | string | Oui | ID hashé de la campagne (type: birthday) |
Exemple de requête
Exemple de réponse
Type de campagne : birthday
Champs obligatoires :
birthday_date: Date d'anniversaire au format YYYY-MM-DD (exemple: 1985-03-15)
address_line1: Nom du destinataire
address_line2: Numéro et nom de rue
address_zip: Code postal
address_city: Ville (en majuscules)
address_country: Code pays ISO 3166-1 alpha-2 (FR, BE, CH, etc.)
Champs optionnels :
identifier: Identifiant unique (auto-généré si vide)
address_line3: Complément d'adresse
ai_context: Contexte personnalisé pour la génération IA (si mode IA activé)
- Variables personnalisées selon la configuration de votre lettre
Envoi automatique :
Les cartes d'anniversaire sont envoyées automatiquement 5 jours avant la date pour la France, 10 jours avant pour l'international.
Format de date :
La date doit être au format ISO 8601 (YYYY-MM-DD). Exemples valides : 1985-03-15, 1990-12-25.
Champs dynamiques :
Utilisez GET /api/campaigns/{campaign_id}/settings pour récupérer la liste complète des champs requis selon votre configuration de lettre.
Gestion des erreurs de validation :
En cas d'erreur (HTTP 422), la réponse détaille précisément les problèmes avec chaque champ manquant ou invalide pour faciliter le debugging.
Ajouter un contact LinkedIn
Ajoute un contact via son URL LinkedIn pour enrichissement automatique et envoi de courrier.
https://manuscry.com/api/api/campaigns/{campaign_id}/contacts
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaign_id | string | Oui | ID hashé de la campagne (type: linkedin en mode manuel uniquement) |
Exemple de requête
Exemple de réponse
Type de campagne : linkedin en mode manuel uniquement
Limitation importante :
Les campagnes LinkedIn avec ciblage automatique (leads_sub_source_type = linkedin_auto) ne supportent PAS l'ajout manuel.
Seules les campagnes LinkedIn en mode manuel (leads_sub_source_type = linkedin_manual) acceptent l'ajout de contacts via API.
Utilisez GET /api/campaigns/{campaign_id}/settings et vérifiez que can_add_contacts est à true avant d'ajouter un contact.
Champs obligatoires :
linkedin_url: URL complète du profil LinkedIn (format: https://www.linkedin.com/in/nom-prenom)
Champs optionnels :
identifier: Identifiant unique (auto-généré si vide)
ai_context: Contexte personnalisé complémentaire
Champ ai_context - Utilisation recommandée :
Le champ ai_context est optionnel mais recommandé. Il permet d'ajouter des informations spécifiques qui ne sont pas disponibles sur le profil LinkedIn public :
- Contexte de rencontre (événement, conférence, recommandation)
- Intérêts spécifiques exprimés lors d'échanges
- Informations complémentaires sur les besoins
Ce contexte sera fusionné avec les informations extraites automatiquement du profil LinkedIn (parcours, expériences, compétences, entreprise actuelle).
Traitement asynchrone :
Le contact est d'abord ajouté au sheet, puis traité automatiquement toutes les 30 minutes par la commande all:leads-create-from-linkedin-manual-sheets qui :
- Récupère les informations du profil LinkedIn
- Recherche l'adresse postale
- Crée le lead enrichi
- Génère le courrier personnalisé
Le délai entre l'ajout via API et la génération du courrier peut donc être de 30 minutes maximum.
Gestion des erreurs de validation :
En cas d'erreur (HTTP 422), la réponse inclut validation_errors (messages détaillés), missing_fields (champs manquants) et invalid_fields (champs au format incorrect).
Ajouter un contact (impression autonome)
Ajoute un contact à une campagne en mode impression autonome pour récupération des fichiers haute définition.
https://manuscry.com/api/api/campaigns/{campaign_id}/contacts
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaign_id | string | Oui | ID hashé de la campagne (self-print) |
Exemple de requête
Exemple de réponse
Type de campagne : Campagne en mode impression autonome (self-print)
Fonctionnement :
Les campagnes en impression autonome permettent de générer les fichiers haute définition des cartes sans envoi postal.
Vous récupérez les fichiers PNG haute résolution via l'API pour les imprimer vous-même.
Champs obligatoires :
Identiques aux contacts manuels :
address_line1: Nom du destinataire
address_line2: Numéro et nom de rue
address_zip: Code postal
address_city: Ville
address_country: Code pays ISO
Champs optionnels :
identifier: Identifiant unique (auto-généré si vide)
address_line3: Complément d'adresse
ai_context: Contexte pour personnalisation IA
- Variables personnalisées selon votre configuration
Limitation programmation :
Les campagnes self-print ne supportent PAS le paramètre scheduled_at.
Les fichiers sont générés et disponibles immédiatement après validation.
Pour des envois programmés, utilisez une campagne manuelle standard.
Récupération des fichiers :
Une fois le courrier généré, utilisez GET /api/letters?campaign_filter={campaign_id}&category=delivered pour récupérer les URLs des fichiers haute définition.
Les fichiers sont accessibles dans campaign.print_files de chaque lettre.
Dimensions : A6 (2400x1702px / 148x105mm) ou A4 (2400x3394px / 210x297mm).
Marquage impression :
Après avoir téléchargé et imprimé un courrier, utilisez POST /api/letters/mark-printed/{letterId} pour le marquer comme imprimé dans votre suivi.
Gestion des erreurs de validation :
En cas d'erreur (HTTP 422), la réponse inclut validation_errors (messages détaillés), missing_fields (champs manquants) et invalid_fields (champs au format incorrect).
Informations utilisateur
Récupère les informations de l'utilisateur connecté et la liste de ses campagnes (hors brouillons).
https://manuscry.com/api/api/me
Exemple de requête
Exemple de réponse
Campagnes retournées :
- Seules les campagnes publiées sont retournées (status != draft)
- Les brouillons ne sont pas inclus dans les résultats
Champs des campagnes :
is_active: true si status = "active"
is_self_print: true si la campagne est en mode impression autonome
Liste des contacts
Récupère la liste des contacts avec pagination et filtres.
https://manuscry.com/api/api/contacts
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| page | integer | Non | Numéro de page |
| per_page | integer | Non | Éléments par page (1-100) |
| search | string | Non | Recherche textuelle |
| status_filter | string | Non | Filtre par statut |
| source_filter | string | Non | Filtre par source |
| campaign_filter | string | Non | ID hashé de la campagne (recommandé - alias agent_filter accepté) |
| sort_field | string | Non | Champ de tri |
| sort_direction | string | Non | Direction (asc/desc) |
| semantic_search | boolean | Non | Recherche par IA |
Exemple de requête
Exemple de réponse
Statuts disponibles :
enrich: Contacts en enrichissement
contact: Contacts enrichis, prêts pour génération
validation: En attente de validation
Champs additionnels :
relevance: Score de pertinence (0-10, nullable)
linkedin_url: URL du profil LinkedIn (nullable)
picture: URL de la photo de profil (nullable)
Propriétés de touchpoints :
has_touchpoint_letter: Courrier livré au contact (boolean)
has_touchpoint_letter_flash: QR code flashé par le contact (boolean)
has_returned_letter: Courrier retourné (NPAI/PND) (boolean)
Bloquer un contact
Bloque un contact et tous ses doublons, annule les contenus en attente et ajoute à la blocklist.
https://manuscry.com/api/api/contacts/{leadId}/block
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| leadId | string | Oui | ID hashé du contact |
Exemple de requête
Exemple de réponse
Actions automatiques :
- Le contact et tous ses doublons (même email) sont bloqués
- L'email est ajouté à votre blocklist
- L'adresse postale est ajoutée à la blocklist si disponible
- Toutes les lettres en attente (avant génération) sont annulées
Retour :
duplicates_blocked: Nombre de doublons bloqués en plus du contact principal
emails_cancelled: Toujours 0 pour Manuscry
letters_cancelled: Nombre de lettres annulées
Liste de blocage
Récupère la liste de blocage.
https://manuscry.com/api/api/blocklist
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| type | string | Non | Type de blocage (email, domain, company, siren, address, all) |
| page | integer | Non | Numéro de page |
| per_page | integer | Non | Éléments par page |
Exemple de requête
Exemple de réponse
Types disponibles :
email: Adresse email exacte
domain: Nom de domaine
company: Nom d'entreprise (recherche approximative)
siren: Numéro SIREN (9 chiffres)
address: Identité complète (format: firstname_slug|lastname_slug|zip)
Ajouter à la blocklist
Ajoute un élément à bloquer.
https://manuscry.com/api/api/blocklist
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| type | string | Oui | Type (email, domain, company, siren, address) |
| value | string | Oui | Valeur à bloquer |
Exemple de requête
Exemple de réponse
Supprimer de la blocklist
Supprime un élément de la blocklist par ID ou par valeur.
https://manuscry.com/api/api/blocklist
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| id | string | Non | ID hashé de l'élément à supprimer |
| value | string | Non | Valeur à débloquer (alternative à id) |
Exemple de requête
Exemple de réponse
Méthodes de suppression :
- Par ID : Utilisez le paramètre
idavec l'ID hashé récupéré depuis GET /api/blocklist
- Par valeur : Utilisez le paramètre
valueavec la valeur exacte
Note : Au moins un des deux paramètres (id ou value) doit être fourni. Si les deux sont fournis, id est prioritaire.
Liste des courriers
Récupère les courriers de toutes vos campagnes.
https://manuscry.com/api/api/letters
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| category | string | Non | Catégorie de courriers |
| page | integer | Non | Numéro de page |
| per_page | integer | Non | Éléments par page (1-100) |
| search | string | Non | Recherche textuelle |
| campaign_filter | string | Non | ID hashé de la campagne (recommandé - alias agent_filter accepté) |
Exemple de requête
Exemple de réponse
Catégories disponibles :
to_validate: Courriers en attente de validation
validated: Courriers validés en attente d'envoi
rejected: Courriers refusés en attente de suppression
error: Courriers en erreur
insufficient_funds: Courriers en attente de crédits
in_preparation: Courriers en génération, impression ou attente d'envoi
transiting: Courriers en transit postal
delivered: Courriers délivrés
returned: Courriers retournés (NPAI/PND)
scanned: Courriers avec QR code flashé
not_scanned: Courriers avec QR code non flashé
Statuts disponibles :
validating: En attente de validation utilisateur
generating: En cours de génération des visuels
printing: En attente d'impression
sending: En attente d'envoi
transiting: En transit chez la poste
delivered: Livré
returned: Retourné (NPAI/PND)
cancelled: Annulé
error: Erreur technique
Courriers en attente de validation
Récupère la liste des courriers en attente de validation.
https://manuscry.com/api/api/letters/to-validate
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| page | integer | Non | Numéro de page |
| per_page | integer | Non | Éléments par page (1-100) |
| campaign_filter | string | Non | ID hashé de la campagne (recommandé - alias agent_filter accepté) |
Exemple de requête
Exemple de réponse
Valider un courrier
Valide un courrier pour envoi automatique.
https://manuscry.com/api/api/letters/validate/{letterId}
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| letterId | string | Oui | ID hashé du courrier |
| blocks | array | Non | Blocs de contenu personnalisés |
Exemple de requête
Exemple de réponse
Délai de carence :
Le courrier sera validé définitivement après 60 minutes.
Pendant ce délai, vous pouvez encore le refuser.
Refuser un courrier
Refuse un courrier.
https://manuscry.com/api/api/letters/reject/{letterId}
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| letterId | string | Oui | ID hashé du courrier |
Exemple de requête
Exemple de réponse
Délai de carence :
Le courrier sera supprimé définitivement après 60 minutes.
Pendant ce délai, vous pouvez encore le valider.
Liste des courriers impression autonome
Récupère les courriers d'une campagne en impression autonome avec les URLs des fichiers haute définition à imprimer.
https://manuscry.com/api/api/letters
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaign_filter | string | Oui | ID hashé de la campagne self-print (recommandé - alias agent_filter accepté) |
| category | string | Non | Catégorie (delivered recommandé pour récupérer les courriers prêts) |
| page | integer | Non | Numéro de page |
| per_page | integer | Non | Éléments par page (1-100) |
Exemple de requête
Exemple de réponse
Spécificités impression autonome :
Pour les campagnes en mode impression autonome (is_self_print: true), l'objet campaign contient des champs additionnels :
is_self_print: Indique qu'il s'agit d'une campagne impression autonome
print_files: URLs des fichiers haute définition à télécharger et imprimer
front_url: Image du recto à imprimer
back_url: Image du verso (null pour format A4)
Workflow d'impression :
- Utilisez
category=deliveredpour récupérer uniquement les courriers générés et prêts à imprimer
- Téléchargez les fichiers depuis les URLs fournies dans
print_files
- Imprimez les fichiers en haute qualité (300 DPI recommandé)
- Une fois imprimé, marquez le courrier comme tel via
/api/letters/mark-printed/{letterId}
Dimensions des fichiers :
- Format A6 : 2400px x 1702px (148mm x 105mm en mode paysage)
- Format A4 : 2400px x 3394px (210mm x 297mm en mode portrait)
- Images PNG haute résolution, prêtes pour impression directe
- Pas d'enveloppe fournie (impression client uniquement)
Marquer un courrier comme imprimé
Marque un courrier comme imprimé dans votre système. Permet de suivre les courriers que vous avez déjà imprimés.
https://manuscry.com/api/api/letters/mark-printed/{letterId}
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| letterId | string | Oui | ID hashé du courrier à marquer comme imprimé |
Exemple de requête
Exemple de réponse
Fonctionnement :
- Cet endpoint est réservé exclusivement aux campagnes en impression autonome
- Permet de tracker les courriers que vous avez déjà imprimés dans votre système
- Le champ
is_printedpasse àtrueetprinted_atest automatiquement enregistré avec l'horodatage
- Cette action est irréversible mais n'affecte pas le statut du courrier (reste
delivered)
Restrictions :
- Disponible uniquement pour les campagnes avec
is_self_print: true
- Impossible de modifier les courriers de campagnes annulées (status: cancelled)
- Retourne une erreur 403 si utilisé sur une campagne non self-print
Utilisation recommandée :
Appelez cet endpoint après avoir téléchargé et imprimé physiquement le courrier pour maintenir un suivi précis de vos impressions.
Webhook courrier impression autonome prêt
Webhook déclenché automatiquement quand un courrier en impression autonome est généré et prêt au téléchargement.
Événement : self_print_letter_ready
Déclenchement : Ce webhook est envoyé automatiquement quand un courrier d'une campagne self-print est généré avec succès. Les URLs des images haute définition sont incluses dans le payload pour téléchargement immédiat.
Configuration : Configurez ce webhook dans Manuscry > Paramètres > Webhooks
Payload envoyé
Utilisation recommandée :
- Téléchargez automatiquement les fichiers depuis les URLs fournies
- Déclenchez votre flux d'impression automatique
- Notifiez vos équipes logistiques qu'un nouveau courrier est prêt
Historique des rendez-vous calendrier
Récupère l'historique des rendez-vous pris via la page de booking calendrier d'une campagne.
https://manuscry.com/api/api/campaigns/{campaignId}/calendar-events
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| campaignId | string | Oui | ID hashé de la campagne |
| page | integer | Non | Numéro de page |
| per_page | integer | Non | Éléments par page (1-50) |
Exemple de requête
Exemple de réponse
Endpoints disponibles :
/api/campaigns/{campaignId}/calendar-events(recommandé pour Manuscry)
/api/agents/{agentId}/calendar-events(alias fonctionnel pour compatibilité)
Statuts possibles :
success: Événement créé avec succès dans Google Calendar
failed: Échec de création dans Google Calendar (événement sauvegardé localement)
calendar_disconnected: Calendrier Google non connecté (événement sauvegardé localement)
Important :
Cet historique est un log local des réservations effectuées via la page de booking.
Il n'est pas synchronisé avec Google Calendar et sert uniquement de journal d'audit.
Webhooks
Les webhooks permettent de recevoir des notifications en temps réel des événements de vos campagnes Manuscry.
Configuration : Interface Manuscry > Paramètres > Webhooks
Webhooks disponibles :
- Filtrage par campagne configurable
- Stockés dans votre compte utilisateur
- Configuration d'URL par type d'événement
Format général des webhooks : Chaque webhook est envoyé en POST avec le format JSON suivant :
Format général
Événements courriers disponibles :
1. letter_ready_for_validation - Courrier prêt à être validé
Déclenché lorsqu'un courrier a été généré et attend validation.
Payload letter_ready_for_validation
2. letter_sent - Courrier envoyé au service postal
Déclenché lorsqu'un courrier validé est envoyé à l'impression et à la poste.
Payload letter_sent
3. letter_delivered - Courrier livré au destinataire
Déclenché lorsque le courrier est confirmé livré par La Poste.
Payload letter_delivered
4. letter_returned - Courrier retourné (NPAI/PND)
Déclenché lorsqu'un courrier est retourné par La Poste (adresse incorrecte).
Payload letter_returned
5. qr_code_scanned - QR code flashé sur un courrier
Déclenché lorsqu'un destinataire scanne le QR code sur un courrier.
Payload qr_code_scanned
6. new_calendar_event - Nouveau rendez-vous calendrier
Déclenché lorsqu'un rendez-vous est pris via la page de réservation calendrier.
Payload new_calendar_event
Statuts possibles :
success: Événement créé avec succès dans Google Calendarfailed: Échec de création dans Google Calendar (événement sauvegardé localement)calendar_disconnected: Calendrier Google non connecté (événement sauvegardé localement)
Rechercher une adresse postale
Lance une recherche d'adresse postale à partir d'une URL LinkedIn ou d'informations de contact.
https://manuscry.com/api/api/find-postal-address
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| linkedin_url | string | Non | URL complète du profil LinkedIn (requis si contact_info absent) |
| contact_info | object | Non | Informations de contact (requis si linkedin_url absent) |
| contact_info.first_name | string | Oui | Prénom de la personne |
| contact_info.last_name | string | Oui | Nom de la personne |
| contact_info.company_name | string | Oui | Nom de l'entreprise |
| contact_info.additional_info | string | Non | Informations complémentaires (poste, secteur, localisation) |
Exemple de requête
Exemple de réponse
Coût : 1 crédit par recherche (0.25€ HT)
Traitement asynchrone :
Les recherches sont traitées de manière asynchrone et prennent généralement entre 5 et 10 minutes.
Utilisez l'endpoint de récupération des résultats pour obtenir les adresses trouvées.
Types de recherche :
- Par URL LinkedIn : Envoyez uniquement le paramètre
linkedin_url
- Par informations de contact : Envoyez l'objet
contact_infoavec first_name, last_name, company_name et optionnellement additional_info
Workflows utilisés :
Le système utilise plusieurs sources pour maximiser les chances de trouver des adresses :
- Analyse LinkedIn (profil et entreprise)
- Recherche intelligente sur le web avec IA
- Crawling de sites web d'entreprise
- Déduplication et scoring automatique
Réponses d'erreur :
- 402 : Crédits insuffisants (besoin d'au moins 1 crédit)
- 422 : Validation échouée (paramètres manquants ou invalides)
Récupérer les résultats d'une recherche
Récupère les résultats d'une recherche d'adresse en utilisant l'ID retourné lors de la création.
https://manuscry.com/api/api/find-postal-address/{search_id}
Paramètres
| Nom | Type | Requis | Description |
|---|---|---|---|
| search_id | string | Oui | ID de la recherche retourné lors de la création |
Exemple de requête
Exemple de réponse
Statuts de recherche :
processing: La recherche est en cours. Le champprocessed_atest null. Attendez 5-10 minutes avant de rappeler l'API.
completed: La recherche est terminée avec succès. Le champresultscontient les adresses trouvées.
failed: La recherche a échoué. Le champerror_detailscontient plus d'informations.
Scores de confiance :
Chaque adresse trouvée est accompagnée d'un score de confiance sur 10 :
- 9-10 : Très haute confiance (source officielle comme LinkedIn API)
- 7-8 : Haute confiance (sites web officiels, sources multiples)
- 5-6 : Confiance moyenne (sources secondaires fiables)
- 3-4 : Faible confiance (sources non vérifiées)
Polling recommandé :
Implémentez un polling avec un intervalle de 20 secondes pour vérifier régulièrement le statut des recherches en cours.
Réponse en cours de traitement :
Si la recherche est toujours en cours (status: processing), le champ processed_at sera null et results ne sera pas présent.