Developer API v2.1

Build on Nonli with a clean, AI-ready API reference.

Use API tokens, search posts and listening data, create shortlinks, publish posts, and upload videos from one documented surface.

Base URL

https://api.nonli.com/v2.1
57endpoints
9resources

Quick start

Three habits are enough to authenticate, keep payloads small, and query production data predictably.

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

Create an API token

Company administrators create and rotate API tokens from the Nonli back office.

2

Send the Bearer header

Send the token on every authenticated request using Authorization: Bearer YOUR_API_TOKEN. To validate a token, call the brands endpoint shown here.

3

Request exact fields

Use fields, filters, filtersOr, excludes, size, page, and sort to keep responses small for both apps and AI agents.

AI integration notes

OpenAPI JSON: /api-docs/openapi.json

llms.txt: /llms.txt

  • Prefer /api-docs/openapi.json for tool generation and schema extraction.
  • Use /llms.txt for a compact crawlable entry point.
  • API tokens are company-role credentials, not web user sessions: do not use /me with Bearer tokens.
  • Use the fields parameter whenever possible to reduce token usage.
  • Respect endpoint rate limits and page through large datasets.

Endpoint explorer

57 endpoints

GETSearch brands/brandsOpenGETGet a brand/brands/:brandIdOpenGETSearch social accounts/social-accountsOpenGETGet a social account/social-accounts/:socialAccountIdOpenGETGet publishing quota/social-accounts/publishing-quotaOpenGETGet YouTube playlists/social-accounts/youtube/playlistsOpenGETGet Pinterest boards/social-accounts/pinterest/boardsOpenGETSearch posts/postsOpenGETGet a post/posts/:postIdOpenGETGet post categories/posts/categoriesOpenGETGet post brands/posts/brandsOpenGETGet post users/posts/usersOpenGETGet post languages/posts/languagesOpenGETGet post histogram/posts/histogramOpenGETGet post aggregation/posts/aggregationOpenGETGet post stats/posts/statsOpenPOSTCheck post content/posts/checkOpenGETGet post tags/posts/tagsOpenGETGet post topics/posts/topicsOpenPOSTCreate posts in bulk/posts/bulkOpenPUTUpdate posts in bulk/posts/bulkOpenDELETEDelete posts in bulk/posts/bulkOpenGETSearch shortlinks/shortlinksOpenGETGet a shortlink/shortlinks/:shortlinkIdOpenGETGet shortlink stats/shortlinks/statsOpenGETGet shortlink authors/shortlinks/authorsOpenGETGet shortlink brands/shortlinks/brandsOpenPOSTCreate a shortlink/shortlinksOpenPOSTCreate shortlinks in bulk/shortlinks/bulkOpenPUTUpdate a shortlink/shortlinks/:shortlinkIdOpenPOSTGenerate a message for a shortlink/shortlinks/:shortlinkId/generate-messageOpenGETGet social listening/listening/socialOpenGETGet organic listening/listening/organicOpenGETGet organic content/listening/organic/:organicIdOpenGETGet organic stats/listening/organic/statsOpenGETGet organic aggregation/listening/organic/aggregationOpenGETSuggest organic filter values/listening/organic/suggest/:fieldOpenGETSearch themes/themesOpenGETGet a theme/themes/:themeIdOpenPOSTCreate a theme/themesOpenPUTUpdate a theme/themes/:themeIdOpenDELETEDelete a theme/themes/:themeIdOpenGETGet theme roles/themes/rolesOpenGETSearch bots/botsOpenGETGet a bot/bots/:botIdOpenPOSTCreate bots in bulk/bots/bulkOpenPUTUpdate bots in bulk/bots/bulkOpenDELETEDelete a bot/bots/:botIdOpenGETGet bot configuration info/bots/infoOpenGETSearch media/mediaOpenGETGet media tags/media/tagsOpenPOSTUpload an image/upload/imageOpenPOSTCreate upload video token/upload/video/tokenOpenPOSTCheck uploaded video existence/upload/video/existsOpenPOSTUpload video chunk/upload/video/chunkOpenPOSTCreate upload document token/upload/document/tokenOpenPOSTUpload document chunk/upload/document/chunkOpen

Common integration flows

5 endpoints
On this page

1.Conventions

Shared rules that apply across every endpoint.

Authentication

Send an API token in the Authorization header on every authenticated call: Authorization: Bearer YOUR_API_TOKEN. API tokens represent a company role, not a web user session, so /me is not available with Bearer tokens. Store tokens securely, rotate them from the back office, and never put them in query strings.

Pagination

List endpoints return total plus a rows array. Page through results with size and a zero-based page until you have collected total items. Use fields to keep each item small.

Dates and timezones

Timestamps are UTC in ISO-8601, for example 2026-05-27T23:59:59Z. Date-range filters use ".." between two values, for example publishedAt:-30 days..now.

Identifiers

Posts, shortlinks, and organic items use string UUIDs. Brands, social accounts, and themes use integer IDs. Pass identifiers exactly as the API returns them.

2.Search parameters

Most list endpoints share the same query grammar.

FieldTypeDescription
sizeintMaximum number of results to return.Default: 20 or endpoint-specific
pageintZero-based page number.Default: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item.

3.Errors

Branch on the HTTP status code rather than parsing error message text. Status codes carry their standard HTTP meaning.

StatusMeaning
200OKThe request succeeded.
400Bad requestThe payload or query parameters were malformed or failed validation.
401UnauthorizedThe Authorization Bearer token is missing or invalid. Check the token value or rotate it from the back office before replaying the call.
403ForbiddenThe API token is valid but lacks permission for this resource.
404Not foundThe resource does not exist or is not visible to your company.
429Too many requestsA rate limit was reached. Slow down and retry later.
500Server errorUnexpected server error. Retry idempotent reads with backoff.

Error responses return a JSON body that describes the problem, but the HTTP status code is the contract: build error handling around the status code, not the message text.

Handling guidance

  • Treat any non-2xx status as a failure and read the JSON body for context.
  • On 401, check the API token value, rotate it if needed, and replay the request.
  • On 429, back off before retrying, and respect a Retry-After header when one is present.
  • On 5xx, retry idempotent reads with exponential backoff.

Reference

4.Brands

2 endpoints

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

GET/brands/:brandIdBearer required

4.2.Get a brand

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

Query parameters

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

Response fields

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

Example

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'

5.Social accounts

5 endpoints

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

GET/social-accounts/:socialAccountIdBearer required

5.2.Get a social account

Return one connected social account with publishing metadata.

Query parameters

FieldTypeDescription
fieldsstringComma-separated fields to include.

Response fields

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

Example

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 required

5.3.Get publishing quota

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

Query parameters

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

Response fields

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

Example

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 required

5.4.Get YouTube playlists

Return YouTube playlists for connected YouTube social accounts.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 20 or endpoint-specific
pageintZero-based page number.Default: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

5.5.Get Pinterest boards

Return Pinterest boards for connected Pinterest social accounts.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 20 or endpoint-specific
pageintZero-based page number.Default: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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'

6.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 required

6.2.Get a post

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

Query parameters

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

Response fields

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

Example

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 required

6.3.Get post categories

Return category aggregations used by post filters and dashboards.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.4.Get post brands

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

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.5.Get post users

Return user aggregations for post author and collaboration filters.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.6.Get post languages

Return language aggregations for post filters.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.7.Get post histogram

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

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 20 or endpoint-specific
pageintZero-based page number.Default: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item.
histogramFieldstringField used as the histogram date source.
histogramIntervalstringBucket interval such as hour, day, week, or month.
histogramTimezonestringTimezone offset used to build buckets.

Response fields

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

Example

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 required

6.8.Get post aggregation

Return generic aggregations for post dashboards and filter facets.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.
fieldstringField to aggregate.

Response fields

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

Example

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 required

6.9.Get post stats

Return aggregated post performance statistics for dashboard widgets.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 20 or endpoint-specific
pageintZero-based page number.Default: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.10.Check post content

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

Body parameters

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

Response fields

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

Example

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 required

6.11.Get post tags

Return matching tags for autocomplete and reporting filters.

Rate limit200 calls

Query parameters

FieldTypeDescription
sizeintCount of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.12.Get post topics

Return matching topics for autocomplete and reporting filters.

Rate limit200 calls

Query parameters

FieldTypeDescription
sizeintCount of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

6.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

Body parameters

FieldTypeDescription
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.

Response fields

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

Example

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 required

6.14.Update posts in bulk

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

Rate limit200 calls

Body parameters

FieldTypeDescription
checkBeforeUpdateboolCheck posts before updating them and skip update if checks fail.
updatePostOnNetworkboolUpdate posts on the social network. Set false to update Nonli only.Default: 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.

Response fields

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

Example

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 required

6.15.Delete posts in bulk

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

Rate limit100 calls

Body parameters

FieldTypeDescription
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.Default: false

Response fields

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

Example

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 }'

8.Listening

6 endpoints

Search social-network performance and organic website content signals.

GET/listening/organic/:organicIdBearer required

8.3.Get organic content

Return one indexed organic content item by ID.

Query parameters

FieldTypeDescription
fieldsstringComma-separated fields to include.

Response fields

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

Example

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 required

8.4.Get organic stats

Return aggregated Organic Listening performance statistics.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 20 or endpoint-specific
pageintZero-based page number.Default: 0
qstringFull-text search query.
qfstringComma-separated fields used by the full-text query.
sortstringSort expression. Prefix a field with "-" for descending order.
filtersstringAND filters on item fields. Use semicolons between filters and ".." for ranges.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
fieldsstringComma-separated fields to include in each returned item.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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 required

8.5.Get organic aggregation

Return generic aggregations for Organic Listening dashboards and filters.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.
fieldstringField to aggregate.

Response fields

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

Example

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 required

8.6.Suggest organic filter values

Return autocomplete suggestions for an Organic Listening field.

Query parameters

FieldTypeDescription
qstringSuggestion query.
sizeintCount of suggestions to return.Default: 10
filtersstringOptional filters to constrain suggestions.

Response fields

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

Example

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

9.Themes

6 endpoints

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

GET/themes/:themeIdBearer required

9.2.Get a theme

Return one saved theme by ID.

Query parameters

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

Response fields

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

Example

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 required

9.3.Create a theme

Create a saved theme from listening or post filters.

Body parameters

FieldTypeDescription
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.

Response fields

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

Example

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 required

9.4.Update a theme

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

Body parameters

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

Response fields

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

Example

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 required

9.5.Delete a theme

Delete a saved theme.

Response fields

FieldTypeDescription
deletedboolWhether the theme was deleted.

Example

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

9.6.Get theme roles

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

Response fields

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

Example

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

10.Bots

6 endpoints

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

GET/bots/:botIdBearer required

10.2.Get a bot

Return one bot by UUID.

Query parameters

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

Response fields

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

Example

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 required

10.3.Create bots in bulk

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

Body parameters

FieldTypeDescription
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.

Example

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 "fieldMapping": [
36 {
37 "source": "title",
38 "target": "message"
39 }
40 ],
41 "sourceMessage": "title",
42 "sourceTitle": "title",
43 "sourceImage": "og_image"
44 }
45 ]
46 }'

Response example

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 required

10.4.Update bots in bulk

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

Body parameters

FieldTypeDescription
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.

Example

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 }'

Response example

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 required

10.5.Delete a bot

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

Example

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 required

10.6.Get bot configuration info

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

Query parameters

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

Response fields

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

Example

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'

11.Media

2 endpoints

Search reusable media and metadata used by the publishing composer.

GET/media/tagsBearer required

11.2.Get media tags

Return media tags for autocomplete and asset filtering.

Query parameters

FieldTypeDescription
sizeintMaximum number of results to return.Default: 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.
filtersOrstringOR filters on item fields. Example: "status:200,203".
excludesstringExclude results when a field contains a value.
existsstringComma-separated fields that must exist in each returned item.

Response fields

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

Example

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

12.Uploads

6 endpoints

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

POST/upload/imageBearer required

12.1.Upload an image

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

Body parameters

FieldTypeDescription
b64Image*stringBase64 encoded image.
keepFormatboolKeep the original format when possible.
faceDetectboolRun face detection/cropping assistance.Default: true

Response fields

FieldTypeDescription
slugstringFontan image slug.
urlstringImage URL when available.

Example

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 required

12.2.Create upload video token

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

Body parameters

FieldTypeDescription
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.

Response fields

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

Example

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 required

12.3.Check uploaded video existence

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

Body parameters

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

Response fields

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

Example

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 required

12.4.Upload video chunk

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

Body parameters

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

Response fields

FieldTypeDescription
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.

Example

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 required

12.5.Create upload document token

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

Body parameters

FieldTypeDescription
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.

Response fields

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

Example

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 required

12.6.Upload document chunk

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

Body parameters

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

Response fields

FieldTypeDescription
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.

Example

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 }'