API basics
Interroger une collection de ressources
La plupart des endpoints de collection (GET /v1/<resource_type>) supportent les paramètres de requête filters, sort, fields et la pagination via skip & limit. Nous répondons toujours en JSON (Content-Type: application/json).
https://rest.leadfox.co/v1/contact?filters=email = [email protected]
https://rest.leadfox.co/v1/contact?sort=email
https://rest.leadfox.co/v1/contact?fields=_id,email
https://rest.leadfox.co/v1/contact?skip=0&limit=10
Assurez-vous que vos URLs sont toujours correctement encodées ; par simplicité et lisibilité, elles ne le sont pas dans les exemples :
filters=properties.firstname = John|john,properties.lastname = Doe|doe
^ ^ ^ ^
filters=properties.firstname%20=%20John|john,properties.lastname%20=%20Doe|doe
^^^ ^^^ ^^^ ^^^
Règles générales du schéma
- Les IDs sont des chaînes hexadécimales comme
abcdef123456789000000000(ObjectIds MongoDB). - Les ressources ont
- un attribut
_id, identifiant unique de la ressource. - un attribut
_owner, identifiant unique duClientpropriétaire de la ressource.
- un attribut
- La plupart des dates (datetimes) sont au format ISO 8601 comme
2025-01-01T00:00:00.000Z.- Toujours converties et stockées en UTC.
- Dans de rares cas, nous pouvons utiliser un timestamp en millisecondes.
Syntaxe des filtres
Utilisez une virgule , entre les conditions pour un AND.
Utilisez une barre verticale | entre les valeurs pour un OR.
Utilisez un point . pour accéder aux attributs d'un objet imbriqué comme properties.firstname.
Utilisez un point . pour accéder aux attributs d'un objet imbriqué dans un tableau comme lists.list.
Les opérateurs sont sensibles à la casse : a = John et a = john ne retournent pas les mêmes ressources.
attribute = <value>
attribute != <value>
attribute > <value>
attribute >= <value>
attribute < <value>
attribute <= <value>
attribute exists <true|false>
- Objet imbriqué
- Tableau d'objets imbriqués
filters=properties.firstname = John|john,properties.lastname = Doe|doe
^ ^
[
{ "properties": { "firstname": "John", "lastname": "Doe" } },
// ...
]
filters=lists.list = 000000000000000000000000
^
[
{ "lists": [{ "list": "000000000000000000000000" }] },
// ...
]
À faire et à ne pas faire
| À FAIRE | À NE PAS FAIRE | |
|---|---|---|
| Vous DEVEZ mettre un espace de chaque côté de l'opérateur | a = <value> | a=<value> |
N'utilisez la barre verticale | (OR) qu'entre des valeurs | a = <value>|<value> | a = <value>,<value> |
N'utilisez la virgule , (AND) qu'entre des conditions | a = <value>,b = <value> | a = <value>|b = <value> |
Vous NE DEVEZ PAS mettre d'espace autour d'une barre verticale | ou d'une virgule , | a = <value>|<value>a = <value>,b = <value> | a = <value> | <value>a = <value> , b = <value> |
| Référencer un attribut à droite de l'opérateur ne fonctionne pas, seules les valeurs statiques sont permises | obj.a = <value> | obj.a = obj.b |
| Référencer un attribut plusieurs fois ne fonctionne pas, une seule condition par attribut est permise (la dernière l'emporte) | obj.a >= 0,obj.a < 100 |
filters=properties.firstname = John|john,properties.lastname = Doe|doe
^ ^^^ ^ ^
Cette syntaxe est assez limitée. Par exemple, vous ne pouvez que combiner les conditions en AND ; le OR entre conditions et les conditions avancées avec parenthèses () ne sont pas permis. C'est généralement suffisant pour les cas de base comme filtrer vos contacts par adresse email ou vos listes par nom.
Attention en filtrant un tableau d'objets imbriqués, le résultat peut ne pas être celui attendu :
filters=lists.list = 67f427c5328bb26a393d64ca,lists.time >= 2025-01-01
^ ^
Retourne les ressources ayant au moins un élément qui satisfait la première condition lists.list = 67f427c5328bb26a393d64ca AND au moins un élément (potentiellement différent) qui satisfait la seconde condition lists.time >= 2025-01-01. Filtrer sur des éléments qui satisfont les deux conditions à la fois n'est pas supporté pour le moment.
Syntaxe de tri
Utilisez des virgules , pour trier sur plusieurs fields à la fois.
Utilisez un moins - devant un field pour trier en ordre décroissant.
sort=email
sort=-email
sort=_id,email
Syntaxe des fields
Comme nous utilisons du JSON avec des tableaux et des objets imbriqués, il peut être utile de ne récupérer que ce dont vous avez besoin pour réduire la taille des réponses.
Utilisez des virgules , pour ne récupérer que les fields voulus.
Utilisez un point . pour récupérer les attributs d'un objet imbriqué comme properties.firstname.
Utilisez un point . pour récupérer les attributs d'un objet imbriqué dans un tableau comme lists.list.
- Objet imbriqué
- Tableau d'objets imbriqués
fields=email,properties.firstname,properties.lastname
[
{
"_id": "000000000000000000000000",
"_owner": "000000000000000000000000",
"email": "...",
"properties": {
"firstname": "...",
"lastname": "..."
}
},
// ...
]
fields=lists.list
[
{
"_id": "000000000000000000000000",
"_owner": "000000000000000000000000",
"lists": [
{ "list": "000000000000000000000000" },
// ...
]
},
// ...
]
_id & _owner sont toujours retournés, même sans être demandés.
Il n'existe pas de syntaxe pour demander les fields par défaut en y ajoutant ou en en retirant un sous-ensemble ; pour y arriver, vous devez envoyer la liste complète manuellement.
Syntaxe de pagination
Utilisez skip & limit pour parcourir de grands ensembles de résultats.
skip=0&limit=10
skip=10&limit=10
skip=20&limit=10
...
Le limit par défaut est actuellement 100 mais pourrait changer.
PUT, pas PATCH
Nous ne supportons pas la méthode PATCH ; notre PUT se comporte simplement comme un PATCH. Lors de la mise à jour d'une entité, vous pouvez donc envoyer des données partielles et seuls les fields fournis seront mis à jour.
- Objet imbriqué
- Tableau
Attention en mettant à jour un objet imbriqué dans une entité. Par défaut, l'objet imbriqué complet est remplacé. Pour ne mettre à jour qu'un sous-ensemble de ses attributs, utilisez la notation par point . pour cibler l'attribut voulu.
- Complet
- Sous-ensemble
PUT /v1/<entity_type>/<id> HTTP/1.1
Host: rest.leadfox.co
Authorization: JWT <jwt>
Content-Type: application/json
{ "foo": { "bar": "new value" } }
PUT /v1/<entity_type>/<id> HTTP/1.1
Host: rest.leadfox.co
Authorization: JWT <jwt>
Content-Type: application/json
{ "foo.bar": "new value" }
L'objet imbriqué Contact.properties est un cas particulier : l'objet complet est fusionné plutôt que remplacé. La notation par point n'est pas supportée pour celui-ci.
Lors de la mise à jour d'un tableau dans une entité, le tableau complet est remplacé. Pour ajouter ou retirer des éléments, récupérez d'abord le tableau actuel, modifiez-le de votre côté, puis renvoyez le tableau mis à jour dans la requête PUT.
Certaines entités ont des endpoints dédiés pour ajouter ou retirer des éléments d'un tableau, comme l'attribut lists du Contact. Consultez la référence API pour plus de détails.