API développeurs v2.1

Intégrez Nonli avec une référence API claire et prête pour les IA.

Utilisez les tokens API, recherchez les posts et les données de listening, créez des shortlinks, publiez des posts et uploadez des vidéos depuis une documentation unique.

URL de base

https://api.nonli.com/v2.1
65endpoints
11ressources

Démarrage rapide

Trois réflexes suffisent pour authentifier vos appels, limiter les payloads et interroger les données de production proprement.

bash
1curl --location 'https://api.nonli.com/v2.1/brands?size=1&fields=id,name' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
1

Créez un token API

Les administrateurs de société créent et renouvellent les tokens API depuis le back office Nonli.

2

Envoyez le header Bearer

Envoyez le token sur chaque appel authentifié avec Authorization: Bearer YOUR_API_TOKEN. Pour valider un token, appelez l’endpoint brands affiché ici.

3

Demandez les champs utiles

Utilisez fields, filters, filtersOr, excludes, size, page et sort pour garder des réponses compactes, pour les apps comme pour les agents IA.

Notes pour intégration IA

OpenAPI JSON: /api-docs/openapi.json

llms.txt: /llms.txt

  • Préférez /api-docs/openapi.json pour générer des outils et extraire les schémas.
  • Utilisez /llms.txt comme point d’entrée compact et crawlable.
  • Les tokens API sont des identifiants de rôle société, pas des sessions utilisateur web : n’utilisez pas /me avec des tokens Bearer.
  • Ajoutez fields dès que possible pour réduire l’usage de tokens.
  • Respectez les rate limits et parcourez les gros jeux de données avec size/page.

Explorateur d’endpoints

65 endpoints

GETSearch brands/brandsOuvrirGETGet a brand/brands/:brandIdOuvrirGETSearch social accounts/social-accountsOuvrirGETGet a social account/social-accounts/:socialAccountIdOuvrirGETGet publishing quota/social-accounts/publishing-quotaOuvrirGETGet YouTube playlists/social-accounts/youtube/playlistsOuvrirGETGet Pinterest boards/social-accounts/pinterest/boardsOuvrirGETSearch posts/postsOuvrirGETGet a post/posts/:postIdOuvrirGETGet post categories/posts/categoriesOuvrirGETGet post brands/posts/brandsOuvrirGETGet post users/posts/usersOuvrirGETGet post languages/posts/languagesOuvrirGETGet post histogram/posts/histogramOuvrirGETGet post aggregation/posts/aggregationOuvrirGETGet post stats/posts/statsOuvrirPOSTCheck post content/posts/checkOuvrirGETGet post tags/posts/tagsOuvrirGETGet post topics/posts/topicsOuvrirPOSTCreate posts in bulk/posts/bulkOuvrirPUTUpdate posts in bulk/posts/bulkOuvrirDELETEDelete posts in bulk/posts/bulkOuvrirGETSearch shortlinks/shortlinksOuvrirGETGet a shortlink/shortlinks/:shortlinkIdOuvrirGETGet shortlink stats/shortlinks/statsOuvrirGETGet shortlink authors/shortlinks/authorsOuvrirGETGet shortlink brands/shortlinks/brandsOuvrirPOSTCreate a shortlink/shortlinksOuvrirPOSTCreate shortlinks in bulk/shortlinks/bulkOuvrirPUTUpdate a shortlink/shortlinks/:shortlinkIdOuvrirPOSTGenerate a message for a shortlink/shortlinks/:shortlinkId/generate-messageOuvrirGETSearch themes/themesOuvrirGETGet a theme/themes/:themeIdOuvrirPOSTCreate a theme/themesOuvrirPUTUpdate a theme/themes/:themeIdOuvrirDELETEDelete a theme/themes/:themeIdOuvrirGETGet theme roles/themes/rolesOuvrirGETGet social listening/listening/socialOuvrirGETGet organic listening/listening/organicOuvrirGETGet organic content/listening/organic/:organicIdOuvrirGETGet organic stats/listening/organic/statsOuvrirGETGet organic aggregation/listening/organic/aggregationOuvrirGETSuggest organic filter values/listening/organic/suggest/:fieldOuvrirGETGet the leaderboard/posts/leaderboardOuvrirPOSTSearch the leaderboard/posts/leaderboard/_searchOuvrirGETGet leaderboard categories/posts/leaderboard/categoriesOuvrirGETSearch accounts/accountsOuvrirPOSTAdd an account/accountsOuvrirGETGet account categories/accounts/categoriesOuvrirGETSearch account locations/accounts/locationsOuvrirGETGet account stats/accounts/statsOuvrirGETSearch bots/botsOuvrirGETGet a bot/bots/:botIdOuvrirPOSTCreate bots in bulk/bots/bulkOuvrirPUTUpdate bots in bulk/bots/bulkOuvrirDELETEDelete a bot/bots/:botIdOuvrirGETGet bot configuration info/bots/infoOuvrirGETSearch media/mediaOuvrirGETGet media tags/media/tagsOuvrirPOSTUpload an image/upload/imageOuvrirPOSTCreate upload video token/upload/video/tokenOuvrirPOSTCheck uploaded video existence/upload/video/existsOuvrirPOSTUpload video chunk/upload/video/chunkOuvrirPOSTCreate upload document token/upload/document/tokenOuvrirPOSTUpload document chunk/upload/document/chunkOuvrir

Parcours d’intégration courants

5 endpoints
Sur cette page

1.Conventions

Règles communes à tous les endpoints.

Authentification

Envoyez un token API dans le header Authorization à chaque appel authentifié : Authorization: Bearer YOUR_API_TOKEN. Les tokens API représentent un rôle société, pas une session utilisateur web, donc /me n’est pas disponible avec les tokens Bearer. Conservez-les de façon sécurisée, renouvelez-les depuis le back office et ne les mettez jamais dans les query strings.

Pagination

Les endpoints de liste renvoient total et un tableau rows. Parcourez les résultats avec size et un page indexé à zéro jusqu’à récupérer total éléments. Utilisez fields pour garder chaque élément compact.

Dates et fuseaux horaires

Les dates sont en UTC au format ISO-8601, par exemple 2026-05-27T23:59:59Z. Les filtres de plage utilisent ".." entre deux valeurs, par exemple publishedAt:-30 days..now.

Identifiants

Les posts, shortlinks et contenus organic utilisent des UUID (string). Les brands, comptes sociaux et thèmes utilisent des ID entiers. Transmettez les identifiants tels que l’API les renvoie.

Noms de compteurs

Pour les endpoints basés sur des posts, utilisez les noms de compteurs documentés dans sort, filters, filtersOr, excludes, les triggers de bots et les métriques de post-rate. Les endpoints Organic Listening et Shortlink exposent leurs propres compteurs et rejettent les compteurs de posts avec une erreur 400 Bad Request.

2.Paramètres de recherche

La plupart des endpoints de liste partagent la même grammaire de requête.

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order. Counter-backed endpoints can sort by counters.total.<field> or by the counter shorthand itself, for example sort=-engagement on post/social data or sort=-click on organic data.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

3.Compteurs disponibles

Utilisez cette liste comme surface publique des compteurs par famille d’endpoints. Les anciens noms de compteurs remplacés sont volontairement absents.

Posts, Social Listening, and Bots

/posts/posts/categories/posts/brands/posts/users/posts/languages/posts/histogram/posts/aggregation/posts/stats/posts/tags/posts/topics/posts/leaderboard/posts/leaderboard/_search/posts/leaderboard/categories/listening/social/bots/bulk

Compteurs

clickclick_uniquectrengagementfacebook_engagement_per_minuteweighted_facebook_engagementweighted_facebook_engagement_per_minutefacebook_commentfacebook_total_reactionfacebook_sharereachimpressionvideoViewsvideo_views_3secfacebook_post_video_avg_time_watchedvideo_completion_rateoverperformingrepostsquotesmonetizationsnapchat_screenshotssubscriberfacebook_link_clicksfacebook_other_clicksfacebook_photo_viewfacebook_video_playfacebook_post_video_views_60s_excludes_shorterinstagram_savedinstagram_total_interactionsinstagram_clips_replays_countlinkedin_private_click_countyoutube_likesyoutube_dislikesyoutube_estimated_minutes_watched

Note: Use these names in post-backed counter filters, counter sorts, bot trigger counters, and bot post-rate metrics. Facebook reach is requested as reach; the API maps the current Meta reach metric internally. TikTok metrics currently feed the common post counters engagement, facebook_total_reaction, facebook_comment, facebook_share, videoViews, and impression, instead of dedicated TikTok counters. Historical counter names replaced by these public names, and counters that are no longer available from network APIs, are intentionally omitted.

Organic Listening

/listening/organic/listening/organic/stats/listening/organic/aggregation

Compteurs

clicknew_leadquantityamountpaywall_viewpaywall_unlockedpaywall_clickpaywall_subscribe_clickpaywall_login_clicksubscription_completecomment_countvideo_viewsview_in_stockview_out_of_stockpriceprice_variationlow_pricehigh_priceratingreview_countstock

Note: Use these names for standard Organic Listening counter filters and sorts. Legacy Organic counters are intentionally excluded from the public API surface.

Shortlinks

/shortlinks/shortlinks/:shortlinkId/shortlinks/stats/shortlinks/authors/shortlinks/brands

Compteurs

click

Note: Shortlink counter endpoints only expose shortlink counters and reject post counters.

Accounts

/accounts/accounts/stats

Compteurs

follower_count

Note: Use the full counter path on Accounts endpoints, for example sort=-counters.total.follower_count or filters=counters.graph.counter:follower_count. The counter sort shorthand (sort=-follower_count) also resolves. The documented name is resolved to the stored account counter internally; historical internal counter names are intentionally omitted. Post counters such as engagement, reach, or videoViews are invalid for Accounts.

4.Erreurs

Basez votre gestion sur le code HTTP plutôt que sur le texte du message. Les codes gardent leur sens HTTP standard.

StatutSignification
200OKLa requête a réussi.
400Requête invalideLe body ou les paramètres sont mal formés ou échouent à la validation.
401Non authentifiéLe token Bearer du header Authorization est absent ou invalide. Vérifiez la valeur du token ou renouvelez-le depuis le back office avant de rejouer l’appel.
403InterditLe token API est valide mais n’a pas les droits sur cette ressource.
404IntrouvableLa ressource n’existe pas ou n’est pas visible par votre société.
429Trop de requêtesUne limite de débit a été atteinte. Ralentissez et réessayez plus tard.
500Erreur serveurErreur serveur inattendue. Réessayez les lectures idempotentes avec un backoff.

Les réponses d’erreur renvoient un body JSON décrivant le problème, mais c’est le code HTTP qui fait foi : construisez votre gestion d’erreurs autour du code, pas du texte du message.

Bonnes pratiques de gestion

  • Traitez tout statut non-2xx comme un échec et lisez le body JSON pour le contexte.
  • Sur 401, vérifiez la valeur du token API, renouvelez-le si nécessaire, puis rejouez la requête.
  • Sur 429, attendez avant de réessayer, et respectez un header Retry-After s’il est présent.
  • Sur 5xx, réessayez les lectures idempotentes avec un backoff exponentiel.

Référence

5.Brands

2 endpoints

Read the brands attached to the authenticated company. Brand IDs are required by publishing and shortlink workflows.

GET/brands/:brandIdBearer requis

5.2.Get a brand

Return one brand with optional embedded configuration used for publishing, shortlinks, smart images, and URL parameters.

Paramètres query

ChampTypeDescription
fieldsstringComma-separated fields to include.
embedstringCan embed urlParameters, domains, geoblocking, smart image configs, smart message configs, and URLs to stalk.

Champs retournés

ChampTypeDescription
idintUnique brand ID.
namestringBrand name.
shortDomainstringBrand short domain.
domainsBrandDomain[]Configured brand domains when embedded.
urlParametersobject[]URL parameter configuration when embedded.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/brands/1?fields=id,name,shortDomain&embed=domains,urlParameters' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

6.Social accounts

5 endpoints

Read connected social accounts and quota data required before creating or scheduling posts.

GET/social-accounts/:socialAccountIdBearer requis

6.2.Get a social account

Return one connected social account with publishing metadata.

Paramètres query

ChampTypeDescription
fieldsstringComma-separated fields to include.

Champs retournés

ChampTypeDescription
idintSocial account ID.
externalIdstringSocial network account/page ID.
namestringAccount display name.
typestringNetwork type.
brandIdintAssociated brand ID.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/social-accounts/42?fields=id,name,type,externalId,brandId' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/social-accounts/publishing-quotaBearer requis

6.3.Get publishing quota

Return publishing quota information for selected social accounts before scheduling posts.

Paramètres query

ChampTypeDescription
socialAccountsstringComma-separated social account IDs or formatted account descriptors.

Champs retournés

ChampTypeDescription
quotaobjectQuota information grouped by account or network.
usageobjectCurrent usage grouped by account or network.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/social-accounts/publishing-quota?socialAccounts=42,43' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/social-accounts/youtube/playlistsBearer requis

6.4.Get YouTube playlists

Return YouTube playlists for connected YouTube social accounts.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order. Counter-backed endpoints can sort by counters.total.<field> or by the counter shorthand itself, for example sort=-engagement on post/social data or sort=-click on organic data.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of playlists found.
rowsobject[]YouTube playlists available for publishing options.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/social-accounts/youtube/playlists?filters=socialAccountId:42&size=50' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/social-accounts/pinterest/boardsBearer requis

6.5.Get Pinterest boards

Return Pinterest boards for connected Pinterest social accounts.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order. Counter-backed endpoints can sort by counters.total.<field> or by the counter shorthand itself, for example sort=-engagement on post/social data or sort=-click on organic data.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of boards found.
rowsobject[]Pinterest boards available for publishing options.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/social-accounts/pinterest/boards?filters=socialAccountId:42&size=50' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

7.Posts

15 endpoints

Search, create, update, and delete social posts. Bulk write endpoints accept arrays so integrations can synchronize several posts at once.

GET/posts/:postIdBearer requis

7.2.Get a post

Return one post by ID with optional filters and field selection.

Paramètres query

ChampTypeDescription
fieldsstringComma-separated fields to include.
filtersstringOptional filters used to optimize lookup, such as createdAt.
embedstringOptional related data to embed.

Champs retournés

ChampTypeDescription
idstringPost ID.
createdAtdateCreation date.
publishedAtdatePublication date.
messagestringPost message.
postTypestringPost type.
socialAccountSocialAccountTarget social account.
statusintPost status.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/4283ab2d-e3dd-7b1a-7cd6-bbcc71e1xxxx?fields=id,message,postType,publishedAt,socialAccount,status' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/categoriesBearer requis

7.3.Get post categories

Return category aggregations used by post filters and dashboards.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of categories found.
rows.keystringCategory value.
rows.doc_countintNumber of posts in the category.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/categories?filters=brandId:1&size=100' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/brandsBearer requis

7.4.Get post brands

Return brand aggregations for posts visible to the API token role.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of brands found.
rows.keystringBrand identifier or name.
rows.doc_countintNumber of posts for the brand.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/brands?filters=publishedAt:-30%20days..now&size=100' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/usersBearer requis

7.5.Get post users

Return user aggregations for post author and collaboration filters.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of users found.
rows.keystringUser identifier or name.
rows.doc_countintNumber of posts for the user.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/users?filters=brandId:1&size=100' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/languagesBearer requis

7.6.Get post languages

Return language aggregations for post filters.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of languages found.
rows.keystringLanguage code.
rows.doc_countintNumber of posts for the language.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/languages?filters=brandId:1&size=50' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/histogramBearer requis

7.7.Get post histogram

Return time-bucketed post counts or counter values for graphing.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order. Counter-backed endpoints can sort by counters.total.<field> or by the counter shorthand itself, for example sort=-engagement on post/social data or sort=-click on organic data.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.
histogramFieldstringField used as the histogram date source.
histogramIntervalstringBucket interval such as hour, day, week, or month.
histogramTimezonestringTimezone offset used to build buckets.

Champs retournés

ChampTypeDescription
bucketsobject[]Histogram buckets.
buckets.keystringBucket key or date.
buckets.doc_countintNumber of posts in the bucket.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/histogram?filters=brandId:1;publishedAt:2026-05-01T00:00:00Z..2026-05-27T23:59:59Z&histogramField=publishedAt&histogramInterval=day' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/aggregationBearer requis

7.8.Get post aggregation

Return generic aggregations for post dashboards and filter facets.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.
fieldstringField to aggregate.

Champs retournés

ChampTypeDescription
totalintTotal number of aggregation buckets.
rows.keystringBucket key.
rows.doc_countintBucket count.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/aggregation?field=socialAccount.type&filters=brandId:1&size=20' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/statsBearer requis

7.9.Get post stats

Return aggregated post performance statistics for dashboard widgets.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order. Counter-backed endpoints can sort by counters.total.<field> or by the counter shorthand itself, for example sort=-engagement on post/social data or sort=-click on organic data.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
rowsobject[]Stat rows returned by the selected filters.
totalintTotal matching posts or stats rows.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/stats?filters=brandId:1;publishedAt:-30%20days..now&fields=counters.total&size=50' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
POST/posts/checkBearer requis

7.10.Check post content

Validate post content before publishing. The BO uses this endpoint to surface publication warnings.

Paramètres body

ChampTypeDescription
messagestringPost message to validate.
titlestringPost title.
descriptionstringPost description.
socialAccount.typestringTarget social network type.
brandIdintBrand ID.

Champs retournés

ChampTypeDescription
validboolWhether the post content passed validation.
warningsobject[]Warnings returned by publication checks.
errorsobject[]Blocking validation errors.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/check' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "brandId": 1,
6 "message": "Post copy",
7 "socialAccount.type": "linkedin"
8 }'
GET/posts/tagsBearer requis

7.11.Get post tags

Return matching tags for autocomplete and reporting filters.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.
Rate limit200 calls

Paramètres query

ChampTypeDescription
sizeintCount of results to return.Défaut: 10
prefixstringTag prefix.
selectedstringAlready selected tags, comma separated.
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of items found.
rows.keystringTag.
rows.doc_countintNumber of posts where the tag was found.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/tags?filters=publishedAt:-30%20days..now;socialAccount.type:facebook&size=100' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/posts/topicsBearer requis

7.12.Get post topics

Return matching topics for autocomplete and reporting filters.

  • Post-backed endpoints accept the documented post counters in counter filters and counter sorts, and responses echo the counter names the request used. Historical counter names replaced by public counter names are intentionally omitted.
Rate limit200 calls

Paramètres query

ChampTypeDescription
sizeintCount of results to return.Défaut: 10
prefixstringTopic prefix.
selectedstringAlready selected topics, comma separated.
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of items found.
rows.keystringTopic.
rows.doc_countintNumber of posts where the topic was found.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/topics?filters=publishedAt:-30%20days..now;socialAccount.type:facebook&size=100' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
POST/posts/bulkBearer requis

7.13.Create posts in bulk

Create a collection of posts. Use postType "flying" with a shortlink mappingId to publish a flying link.

Rate limit200 calls

Paramètres body

ChampTypeDescription
post*Post[]Array of post objects.
->brandId*intBrand ID used to create the post.
->postType*stringNonli post type: text, video, link, photo, album, flying, reel, document, etc.
->shortlink.mappingIdstringRelated shortlink ID.
->messagestringPost message.
->titlestringDisplayed post title.
->descriptionstringLink or media description.
->schedule.startDatedateScheduled publication start date. If schedule is omitted, the post is published now.
->image[].fontanSlugstringFontan image slug.
->image[].urlstringExternal image URL.
->video[].mappingIdstringUploaded video ID.

Champs retournés

ChampTypeDescription
Post[]Post[]Created posts with status and additional values.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/bulk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "post": [
6 {
7 "brandId": 1,
8 "shortlink": {
9 "mappingId": "c9d00b2d-06bf-7aa6-aa33-50690e55xxxx"
10 },
11 "postType": "flying"
12 }
13 ]
14 }'
PUT/posts/bulkBearer requis

7.14.Update posts in bulk

Update a collection of posts. Send post.id and, when available, createdAt to optimize lookup.

Rate limit200 calls

Paramètres body

ChampTypeDescription
checkBeforeUpdateboolCheck posts before updating them and skip update if checks fail.
updatePostOnNetworkboolUpdate posts on the social network. Set false to update Nonli only.Défaut: true
post*Post[]Array of post objects to update.
->id*stringPost ID.
->createdAtdateCreation date, used to optimize the update request.
->shortIdstringNew short ID.
->scheduleobjectScheduling information. Empty object publishes now.
->messagestringUpdated post message.

Champs retournés

ChampTypeDescription
Post[]Post[]Updated posts with status and additional values.

Exemple

bash
1curl --location --request PUT 'https://api.nonli.com/v2.1/posts/bulk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "post": [
6 {
7 "id": "4283ab2d-e3dd-7b1a-7cd6-bbcc71e1xxxx",
8 "shortId": "new-short-id",
9 "schedule": {}
10 }
11 ]
12 }'
DELETE/posts/bulkBearer requis

7.15.Delete posts in bulk

Delete a collection of posts. The async flag can be used for background deletion.

Rate limit100 calls

Paramètres body

ChampTypeDescription
post*Post[]Array of posts to delete.
->id*stringPost ID to delete.
->socialAccountExternalIdstringExternal social account ID.
->createdAtdateCreation date of the post to delete.
asyncboolDelete posts asynchronously.Défaut: false

Champs retournés

ChampTypeDescription
Post[]Post[]Deleted posts or per-item errors.

Exemple

bash
1curl --location --request DELETE 'https://api.nonli.com/v2.1/posts/bulk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "post": [
6 {
7 "id": "4283ab2d-e3dd-7b1a-7cd6-bbcc71e1xxxx",
8 "createdAt": "2024-11-26T10:07:36Z"
9 }
10 ]
11 }'

9.Themes

6 endpoints

Read saved theme filters used by listening, publishing, and automation workflows.

GET/themes/:themeIdBearer requis

9.2.Get a theme

Return one saved theme by ID.

Paramètres query

ChampTypeDescription
fieldsstringComma-separated fields to include.
embedstringUse embed=roles to include associated roles.

Champs retournés

ChampTypeDescription
idintUnique theme ID.
namestringName.
valuestringTheme filters object.
queryStringsobjectPrebuilt query strings for matching sections.
scopestringVisibility scope.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/themes/123?fields=id,name,value,queryStrings,scope&embed=roles' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
POST/themesBearer requis

9.3.Create a theme

Create a saved theme from listening or post filters.

Paramètres body

ChampTypeDescription
name*stringTheme name.
type*stringTheme type, for example listening or post.
scopestringVisibility scope for API tokens: team, bot, or public.
langstringLanguage code.
value*objectTheme filters and section configuration.

Champs retournés

ChampTypeDescription
idintCreated theme ID.
namestringTheme name.
queryStringsobjectPrebuilt query strings.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/themes' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "name": "Editorial performance",
6 "type": "listening",
7 "scope": "team",
8 "lang": "fr",
9 "value": {
10 "filters": {
11 "brandId": [1]
12 }
13 }
14 }'
PUT/themes/:themeIdBearer requis

9.4.Update a theme

Update a saved theme and rebuild its query strings when the value changes.

Paramètres body

ChampTypeDescription
namestringTheme name.
scopestringVisibility scope.
valueobjectTheme filters and section configuration.

Champs retournés

ChampTypeDescription
idintUpdated theme ID.
namestringTheme name.
queryStringsobjectPrebuilt query strings.

Exemple

bash
1curl --location --request PUT 'https://api.nonli.com/v2.1/themes/123' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "name": "Updated theme"
6 }'
DELETE/themes/:themeIdBearer requis

9.5.Delete a theme

Delete a saved theme.

Champs retournés

ChampTypeDescription
deletedboolWhether the theme was deleted.

Exemple

bash
1curl --location --request DELETE 'https://api.nonli.com/v2.1/themes/123' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/themes/rolesBearer requis

9.6.Get theme roles

Return roles that can be associated with team-scoped themes.

Champs retournés

ChampTypeDescription
totalintTotal number of roles found.
rowsAclRoles[]Available roles.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/themes/roles' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

10.Listening

6 endpoints

Search social-network performance and organic website content signals.

GET/listening/organic/:organicIdBearer requis

10.3.Get organic content

Return one indexed organic content item by ID.

Paramètres query

ChampTypeDescription
fieldsstringComma-separated fields to include.

Champs retournés

ChampTypeDescription
idstringOrganic content ID.
canonicalUrlstringCanonical URL.
titlestringTitle.
descriptionstringDescription.
publishedAtdatePublication date.
counters.totalCounterTotal[]Aggregated counters.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/listening/organic/8f14e45fceea167a5a36dedd4bea2543?fields=id,title,canonicalUrl,counters.total' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/listening/organic/statsBearer requis

10.4.Get organic stats

Return aggregated Organic Listening performance statistics.

  • Organic Listening endpoints accept standard Organic Listening counters only. Post counters such as engagement, reach, or videoViews are invalid for Organic Listening and return 400 Bad Request.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order. Counter-backed endpoints can sort by counters.total.<field> or by the counter shorthand itself, for example sort=-engagement on post/social data or sort=-click on organic data.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
rowsobject[]Stat rows returned by the selected filters.
totalintTotal matching content or stats rows.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/listening/organic/stats?filters=type:article;publishedAt:-30%20days..now&fields=counters.total' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/listening/organic/aggregationBearer requis

10.5.Get organic aggregation

Return generic aggregations for Organic Listening dashboards and filters.

  • Organic Listening endpoints accept standard Organic Listening counters only. Post counters such as engagement, reach, or videoViews are invalid for Organic Listening and return 400 Bad Request.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.
fieldstringField to aggregate.

Champs retournés

ChampTypeDescription
totalintTotal number of buckets.
rows.keystringBucket key.
rows.doc_countintBucket count.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/listening/organic/aggregation?field=type&filters=publishedAt:-30%20days..now&size=20' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/listening/organic/suggest/:fieldBearer requis

10.6.Suggest organic filter values

Return autocomplete suggestions for an Organic Listening field.

Paramètres query

ChampTypeDescription
qstringSuggestion query.
sizeintCount of suggestions to return.Défaut: 10
filtersstringOptional filters to constrain suggestions.

Champs retournés

ChampTypeDescription
rowsobject[]Suggested field values.
rows.keystringSuggested value.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/listening/organic/suggest/title?q=election&size=10' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

11.Leaderboard

3 endpoints

Rank social accounts by an aggregated post counter over any post filter set. Rows combine ranking values with account profile data.

GET/posts/leaderboardBearer requis

11.1.Get the leaderboard

Return social accounts ranked by an aggregated post counter, with per post type breakdowns and account profile data.

  • aggregationField and additionalAggregationFields accept the documented post counter names, such as engagement, reach, videoViews, click, ctr, overperforming, or monetization. The API resolves each documented name to the stored counter internally; historical internal counter names are intentionally undocumented.
  • Counters built from public network data, such as engagement or videoViews, rank any listened account. Counters that require account ownership automatically restrict the leaderboard to social accounts the API token can access.
  • Leaderboard filters and sorts accept the shorthand fields name, slug, category, and verificationStatus, resolved to the matching socialAccount fields internally.

Paramètres query

ChampTypeDescription
aggregationField*stringDocumented post counter used to rank accounts, for example engagement, reach, videoViews, click, ctr, overperforming, or monetization.
additionalAggregationFieldsstringComma-separated additional documented counters to aggregate per account. Each counter is returned on the row under the requested counter name.
sizeintCount of accounts to return, between 1 and 200.Défaut: 20
pageintZero-based page number.Défaut: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query, for example title,message,description,category.
sortstringRanking direction. Use counters.total.<counter> with the documented counter name, for example sort=-counters.total.engagement. Defaults to descending on aggregationField.
filtersstringAND filters on post fields, such as publishedAt ranges or socialAccount.type. The shorthand fields name, slug, category, and verificationStatus filter the matching socialAccount fields.
filtersOrstringOR filters on post fields.
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in matching posts.

Champs retournés

ChampTypeDescription
LeaderboardRow[]LeaderboardRow[]Accounts ranked by the aggregated counter. The response is a JSON array without a total wrapper.
->externalIdstringSocial network account/page ID.
->namestringAccount display name.
->typestringSocial network: facebook, instagram, linkedin, etc.
->slugstringAccount slug.
->picturestringAccount profile picture URL.
->websitestringAccount website.
->docCountintNumber of posts matching the filters for the account.
->valuefloatAggregated aggregationField value across matching posts.
->percentfloatAggregated value relative to the account fan count.
->typesobjectPer post type breakdown keyed by post type, each entry with type, docCount, value, and percent.
->fanCountintAccount fan count.
->followerCountintEstimated follower count.
->verificationStatusstringNetwork verification status.
->createdAtdateAccount creation date.
->countersCounterTotal[]Account counter totals.
-><counter>objectOne entry per additionalAggregationFields counter, keyed by the requested counter name, with value, docCount, and types.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/leaderboard?aggregationField=engagement&additionalAggregationFields=videoViews&filters=publishedAt:-30%20days..now;socialAccount.type:facebook&size=10' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

Exemple de réponse

json
1[
2 {
3 "externalId": "339028534278",
4 "name": "Media page",
5 "type": "facebook",
6 "slug": "@mediapage",
7 "picture": "https://...",
8 "docCount": 1240,
9 "value": 458200,
10 "percent": 12.4,
11 "fanCount": 3690000,
12 "followerCount": 3720000,
13 "verificationStatus": "blue_verified",
14 "types": {
15 "link": { "type": "link", "docCount": 980, "value": 310500, "percent": 8.4 },
16 "video": { "type": "video", "docCount": 260, "value": 147700, "percent": 4.0 }
17 },
18 "videoViews": {
19 "externalId": "339028534278",
20 "docCount": 260,
21 "value": 985000,
22 "types": {
23 "video": { "type": "video", "docCount": 260, "value": 985000 }
24 }
25 }
26 }
27]
GET/posts/leaderboard/categoriesBearer requis

11.3.Get leaderboard categories

Return the per post type counter breakdown for selected leaderboard accounts.

  • aggregationField and additionalAggregationFields accept the documented post counter names, such as engagement, reach, videoViews, click, ctr, overperforming, or monetization. The API resolves each documented name to the stored counter internally; historical internal counter names are intentionally undocumented.

Paramètres query

ChampTypeDescription
accountIds*stringComma-separated external account IDs, from the externalId of leaderboard rows.
aggregationField*stringDocumented post counter to aggregate per post type.
sizeintCount of accounts to return, between 1 and 200.Défaut: 20
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on post fields.
filtersOrstringOR filters on post fields.
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in matching posts.

Champs retournés

ChampTypeDescription
LeaderboardCategoryRow[]LeaderboardCategoryRow[]Per account post type breakdown. The response is a JSON array without a total wrapper.
->externalIdstringSocial network account/page ID.
->typesobjectBreakdown keyed by post type, each entry with value and docCount for the aggregated counter.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/posts/leaderboard/categories?accountIds=339028534278,224444370873&aggregationField=engagement&filters=publishedAt:-30%20days..now' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

12.Accounts

5 endpoints

Search and manage the social accounts tracked by Social Listening, such as media pages and competitors. These are listening entities, distinct from the connected social accounts used for publishing.

POST/accountsBearer requis

12.2.Add an account

Add a social account to Social Listening. The account is fetched from the network, activated for listening, and returned. Requires a role with the listening manage permission.

Paramètres body

ChampTypeDescription
network*stringSocial network of the account: facebook, instagram, linkedin, etc.
accountIdstringExternal account ID or slug on the network. Provide accountId or slug.
slugstringAccount slug on the network. Provide accountId or slug.
instanceUrlstringInstance URL, required for federated networks such as Mastodon.

Champs retournés

ChampTypeDescription
AccountAccountCreated or updated account, with the same fields as search results.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/accounts' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "network": "facebook",
6 "slug": "mediapage"
7 }'
GET/accounts/categoriesBearer requis

12.3.Get account categories

Return account category aggregations for autocomplete and listening filters.

  • The category filter and query field resolve to the localized account category internally; filter with category:<value> rather than a localized field path.
Rate limit200 calls

Paramètres query

ChampTypeDescription
sizeintCount of results to return.Défaut: 10
prefixstringCategory prefix.
selected*stringAlready selected categories, comma separated. Send an empty value when no category is selected yet.
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on account fields.
filtersOrstringOR filters on account fields.
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Champs retournés

ChampTypeDescription
totalintTotal number of categories found.
rows.keystringCategory value.
rows.doc_countintNumber of accounts in the category.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/accounts/categories?prefix=News&selected=&filters=type:facebook&size=10' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/accounts/locationsBearer requis

12.4.Search account locations

Return location accounts, such as city pages, matching a query. Local index results are combined with a remote network search. A type filter selecting the social network is required.

Paramètres query

ChampTypeDescription
sizeintCount of results to return.Défaut: 20
qstringLocation search query.
filters*stringAND filters. The type:<network> filter selecting the social network to search is required.

Champs retournés

ChampTypeDescription
totalintTotal number of locations found.
rowsAccount[]Location accounts, including geoname data.
qstringEcho of the search query.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/accounts/locations?q=Paris&filters=type:facebook&size=20' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/accounts/statsBearer requis

12.5.Get account stats

Return aggregated account counter statistics with optional trend and histogram data.

  • Accounts endpoints expose account counters only, currently follower_count (account fans or followers). The API resolves this documented name to the stored account counter internally, and responses echo the name the request used. Address it with the full counter path, for example sort=-counters.total.follower_count or filters=counters.graph.counter:follower_count. Post counters such as engagement or reach are invalid for Accounts.

Paramètres query

ChampTypeDescription
filtersstringAND filters on account fields.
filtersOrstringOR filters on account fields.
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each item.
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
metricstringAggregation metric: sum, avg, med, or percentiles.
dateTimeRangestringDate-time range used to calculate the trend.
timezonestringTimezone used to resolve previous periods for the trend.
percentilefloatQueried percentile when metric is percentiles.
granularitystringHistogram granularity: hour, day, week, month, or year. Auto-selected from the filtered period when omitted.

Champs retournés

ChampTypeDescription
totalobject[]Aggregated counter totals.
total.fieldstringAccount counter field.
total.valuefloatAggregated value.
total.trendfloatTrend versus the previous period when dateTimeRange is provided.
graphobject[]Counter histograms.
graph.counterstringAccount counter field.
graph.histogramobject[]Time-bucketed counter values.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/accounts/stats?filters=type:facebook;listeningActivated:true;counters.graph.counter:follower_count&metric=sum&granularity=day' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

13.Bots

6 endpoints

Manage automation bots that transform sources such as feeds, themes, or social accounts into publishable posts.

GET/bots/:botIdBearer requis

13.2.Get a bot

Return one bot by UUID.

Paramètres query

ChampTypeDescription
fieldsstringComma-separated fields to include.
embedstringCan embed running and spamControl.

Champs retournés

ChampTypeDescription
idstringBot UUID.
titlestringBot title.
brandIdintBrand attached to the bot.
activationobjectActivation and scheduling state.
sourceobjectSource configuration.
targetobject[]Target configurations.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/bots/5c9b6e52-8d4e-4f16-9f16-c01e9cbbd9e1?fields=id,title,brandId,activation,source,target&embed=running' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
POST/bots/bulkBearer requis

13.3.Create bots in bulk

Create one or more bots. Source and target URNs must reference resources visible to the API token role.

  • Bot trigger counters and post-rate metrics use the documented post counters. Percentile-based triggers resolve the documented counter name before calculating the percentile.

Paramètres body

ChampTypeDescription
bot*Bot[]Bots to create.
->title*stringBot title.
->brandId*intBrand attached to the bot.
->autoboolIf false, created posts are kept for review before publishing.
->activationobjectActivation state and optional time window.
->timezonestringTimezone used for activation windows.
->runCyclePeriodobjectMinimum and maximum minutes between source reads.
->scheduleobjectPost scheduling options.
->source*objectSource object with a Nonli URN.
->target*object[]Target objects with Nonli URNs.
->postobject[]Post template configuration.
->fieldMappingobject[]Source-to-target field mappings.
->sourceMessagestringSource field used to build the post message.
->sourceTitlestringSource field used to build the post title.
->sourceImagestringSource field used to build the post image.
->trigger.counter[].fieldstringCounter field that must reach trigger.counter[].triggerValue before the bot posts. Accepts documented post counter names such as engagement or reach for social-account sources.
->trigger.counter[].triggerValueintCounter threshold used by the trigger.
->trigger.counter[].metricstringOptional aggregation metric used to calculate the trigger value, for example percentiles. The trigger counter field is resolved from the documented counter name before the aggregation is built.
->postRate.modestringPost type selection mode. Use manual for fixed post-type ratios, auto_all to auto-select from all post types, or auto_photo_link to auto-select between photo and link posts.
->postRate.metricstringPerformance metric used by automatic post type selection. Accepts documented post counter names such as engagement, reach, videoViews, and monetization.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/bots/bulk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "bot": [
6 {
7 "title": "Morning feed review",
8 "brandId": 1,
9 "auto": false,
10 "activation": {
11 "alive": false
12 },
13 "timezone": "Europe/Paris",
14 "runCyclePeriod": {
15 "min": 30,
16 "max": 60
17 },
18 "source": {
19 "urn": "urn:nonli:feed:https://example.com/rss.xml",
20 "name": "Editorial feed"
21 },
22 "target": [
23 {
24 "urn": "urn:nonli:sa:facebook:PAGE_ID",
25 "name": "Facebook page"
26 }
27 ],
28 "post": [
29 {
30 "index": 0,
31 "prefix": "",
32 "suffix": ""
33 }
34 ],
35 "trigger": {
36 "counter": [
37 {
38 "field": "engagement",
39 "triggerValue": 75,
40 "metric": "percentiles"
41 }
42 ]
43 },
44 "postRate": {
45 "mode": "auto_all",
46 "metric": "engagement"
47 },
48 "fieldMapping": [
49 {
50 "source": "title",
51 "target": "message"
52 }
53 ],
54 "sourceMessage": "title",
55 "sourceTitle": "title",
56 "sourceImage": "og_image"
57 }
58 ]
59 }'

Exemple de réponse

json
1[
2 {
3 "id": "5c9b6e52-8d4e-4f16-9f16-c01e9cbbd9e1",
4 "title": "Morning feed review",
5 "brandId": 1,
6 "activation": {
7 "alive": false
8 }
9 },
10 {
11 "error": "Bot creation failed"
12 }
13]
PUT/bots/bulkBearer requis

13.4.Update bots in bulk

Update one or more bots. Each item must include the bot UUID and only the fields to change.

  • Bot trigger counters and post-rate metrics use the documented post counters. Percentile-based triggers resolve the documented counter name before calculating the percentile.

Paramètres body

ChampTypeDescription
bot*Bot[]Bots to update.
->id*stringBot UUID.
->titlestringBot title.
->brandIdintBrand attached to the bot.
->autoboolWhether the bot publishes automatically.
->activationobjectActivation state and optional time window.
->runCyclePeriodobjectMinimum and maximum minutes between source reads.
->scheduleobjectPost scheduling options.
->sourceobjectSource object with a Nonli URN.
->targetobject[]Target objects with Nonli URNs.
->postobject[]Post template configuration.
->fieldMappingobject[]Source-to-target field mappings.
->trigger.counter[].fieldstringCounter field that must reach trigger.counter[].triggerValue before the bot posts. Accepts documented post counter names such as engagement or reach for social-account sources.
->trigger.counter[].triggerValueintCounter threshold used by the trigger.
->trigger.counter[].metricstringOptional aggregation metric used to calculate the trigger value, for example percentiles. The trigger counter field is resolved from the documented counter name before the aggregation is built.
->postRate.modestringPost type selection mode. Use manual for fixed post-type ratios, auto_all to auto-select from all post types, or auto_photo_link to auto-select between photo and link posts.
->postRate.metricstringPerformance metric used by automatic post type selection. Accepts documented post counter names such as engagement, reach, videoViews, and monetization.

Exemple

bash
1curl --location --request PUT 'https://api.nonli.com/v2.1/bots/bulk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "bot": [
6 {
7 "id": "5c9b6e52-8d4e-4f16-9f16-c01e9cbbd9e1",
8 "title": "Morning feed review",
9 "activation": {
10 "alive": true
11 },
12 "runCyclePeriod": {
13 "min": 45,
14 "max": 90
15 }
16 }
17 ]
18 }'

Exemple de réponse

json
1[
2 {
3 "id": "5c9b6e52-8d4e-4f16-9f16-c01e9cbbd9e1",
4 "title": "Morning feed review",
5 "brandId": 1,
6 "activation": {
7 "alive": true
8 }
9 },
10 {
11 "error": "Bot update failed"
12 }
13]
DELETE/bots/:botIdBearer requis

13.5.Delete a bot

Delete one bot by UUID. A successful deletion returns HTTP 204 with no response body.

Exemple

bash
1curl --location --request DELETE 'https://api.nonli.com/v2.1/bots/5c9b6e52-8d4e-4f16-9f16-c01e9cbbd9e1' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'
GET/bots/infoBearer requis

13.6.Get bot configuration info

Return schedule periods, target validation rules, and bot configuration constraints used to build valid bot payloads.

Paramètres query

ChampTypeDescription
sourceUrnstringOptional source URN to evaluate source-specific configuration.
targetUrnstringOptional target URN to evaluate target-specific configuration.

Champs retournés

ChampTypeDescription
schedulePeriodsobjectAvailable schedule period identifiers and labels.
targetValidationConfigsobjectValidation rules by target type.
configobjectBot defaults and constraints, including AI generated text and consultation frequency.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/bots/info?sourceUrn=urn%3Anonli%3Afeed%3Ahttps%3A%2F%2Fexample.com%2Frss.xml&targetUrn=urn%3Anonli%3Asa%3Afacebook%3APAGE_ID' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

14.Media

2 endpoints

Search reusable media and metadata used by the publishing composer.

GET/media/tagsBearer requis

14.2.Get media tags

Return media tags for autocomplete and asset filtering.

Paramètres query

ChampTypeDescription
sizeintMaximum number of results to return.Défaut: 20 or endpoint-specific
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges. Send the separators ":", ";", "," and ".." as raw characters: search endpoints read the raw query string and treat percent-encoded separators as literal value characters. Percent-encode only characters inside values, such as spaces (%20). On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
filtersOrstringOR filters on item fields. Example: "status:200,203". On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
excludesstringExclude results when a field contains a value. On post-backed counter filters, documented counter names are resolved for counters.total.field, counters.graph.counter, counters.histogram.field, and counters.period.field.
existsstringComma-separated fields that must exist in each returned item. Fields must belong to the endpoint entity; invalid fields return 400 Bad Request.

Champs retournés

ChampTypeDescription
totalintTotal number of tags found.
rows.keystringTag value.
rows.doc_countintNumber of media items using the tag.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/media/tags?size=100' \
2 --header 'Authorization: Bearer YOUR_API_TOKEN'

15.Uploads

6 endpoints

Upload images, videos, and documents before attaching them to posts.

POST/upload/imageBearer requis

15.1.Upload an image

Upload a base64 image and receive the Fontan slug used by posts and shortlinks.

Paramètres body

ChampTypeDescription
b64Image*stringBase64 encoded image.
keepFormatboolKeep the original format when possible.
faceDetectboolRun face detection/cropping assistance.Défaut: true

Champs retournés

ChampTypeDescription
slugstringFontan image slug.
urlstringImage URL when available.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/upload/image' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "b64Image": "data:image/png;base64,iVBORw0KGgo...",
6 "keepFormat": true
7 }'
POST/upload/video/tokenBearer requis

15.2.Create upload video token

Create or resume an upload session. The response includes chunkSize, which defines the maximum chunk size to send.

Paramètres body

ChampTypeDescription
name*stringFile name.
type*stringVideo MIME type.
size*intFile size in bytes.
md5sum*stringUnique video ID, md5 encoded.
durationintVideo duration in seconds.
widthintVideo width in pixels.
heightintVideo height in pixels.
titlestringVideo title.
descriptionstringVideo description.
customTagstring[]Video custom tags.

Champs retournés

ChampTypeDescription
tokenstringUpload token.
sizeintFile size in bytes.
chunkSizeintChunk size in bytes.
chunkIndexintNext chunk index.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/upload/video/token' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "md5sum": "64bed820ce612754d1e3e957edfc69c7",
6 "name": "35427-407130886_small.mp4",
7 "size": 1338788,
8 "type": "video/mp4",
9 "title": "My video title",
10 "description": "My video description",
11 "customTag": ["foo", "bar"]
12 }'
POST/upload/video/existsBearer requis

15.3.Check uploaded video existence

Check if a video already exists before starting a chunked upload.

Paramètres body

ChampTypeDescription
md5sum*stringUnique video ID, md5 encoded.
name*stringFile name.

Champs retournés

ChampTypeDescription
existsboolWhether the video already exists.
idstringExisting video ID when found.
urlstringExisting video URL when found.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/upload/video/exists' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "md5sum": "64bed820ce612754d1e3e957edfc69c7",
6 "name": "35427-407130886_small.mp4"
7 }'
POST/upload/video/chunkBearer requis

15.4.Upload video chunk

Upload one base64 chunk for a video upload session. The final response includes the video id and URL.

Paramètres body

ChampTypeDescription
token*stringUpload token.
chunk*intChunk number.
data*stringChunk bytes as base64.

Champs retournés

ChampTypeDescription
sizeintUploaded size after this chunk.
idstringVideo ID, returned when the last chunk has been uploaded.
urlstringVideo URL, returned when the last chunk has been uploaded.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/upload/video/chunk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "token": "e5bab8115967331ce0db284e03622cf0",
6 "chunk": 1,
7 "data": "AAAAIGZ0eXBtcDQyAAAAAG1wNDJtcDQxaXNvbWF2YzEAABF9b..."
8 }'
POST/upload/document/tokenBearer requis

15.5.Create upload document token

Create or resume a document upload session. The response includes chunkSize for chunked upload.

Paramètres body

ChampTypeDescription
name*stringFile name.
type*stringDocument MIME type, commonly application/pdf.
size*intFile size in bytes.
md5sum*stringUnique document ID, md5 encoded.
titlestringDocument title.
descriptionstringDocument description.
pageCountintNumber of pages in the document.

Champs retournés

ChampTypeDescription
tokenstringUpload token.
sizeintFile size in bytes.
chunkSizeintChunk size in bytes.
chunkIndexintNext chunk index.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/upload/document/token' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "md5sum": "64bed820ce612754d1e3e957edfc69c7",
6 "name": "press-release.pdf",
7 "size": 1024000,
8 "type": "application/pdf",
9 "title": "Press release",
10 "pageCount": 3
11 }'
POST/upload/document/chunkBearer requis

15.6.Upload document chunk

Upload one base64 chunk for a document upload session. The final response includes the document id and URL.

Paramètres body

ChampTypeDescription
token*stringUpload token.
chunk*intChunk number.
data*stringChunk bytes as base64.

Champs retournés

ChampTypeDescription
sizeintUploaded size after this chunk.
idstringDocument ID, returned when the last chunk has been uploaded.
urlstringDocument URL, returned when the last chunk has been uploaded.

Exemple

bash
1curl --location 'https://api.nonli.com/v2.1/upload/document/chunk' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer YOUR_API_TOKEN' \
4 --data '{
5 "token": "e5bab8115967331ce0db284e03622cf0",
6 "chunk": 1,
7 "data": "JVBERi0xLjQKJc..."
8 }'