This guide is for the technical team integrating Nonli on a publisher website. Nonli also provides a personalised setup page with the exact values for your domain.
1. Whitelist our IP addresses#
To prevent our crawlers from being blocked, allow the following IP addresses on your servers, firewall or WAF.
| OVH | Hetzner | |
|---|---|---|
| 51.77.188.71 | 130.211.76.244 | 167.235.24.250 |
| 51.83.116.244 | 104.155.62.41 | 167.235.65.20 |
| 51.255.141.214 | 34.77.85.234 | 116.203.102.173 |
| 51.68.75.27 | 77.42.68.147 | |
| 51.38.196.174 | 89.167.4.248 | |
| 54.36.13.238 | 89.167.13.146 | |
| 54.36.18.68 | 46.224.230.139 |
You can also fetch the up-to-date list programmatically: www.nonli.com/crawler-ips.json (structured) or www.nonli.com/crawler-ips.txt (plain text).
2. Choose your SDK domain#
For security and GDPR reasons, the SDK must run on a subdomain of your main domain. Create a CNAME record:
l.yourdomain.com → CNAME → tls.non.li
Important: do not enable the Cloudflare proxy (orange cloud) on this record. It would conflict with our own Cloudflare proxy, so keep it as DNS only (grey cloud).
Nonli documents an SDK configuration that can fall within the consent exemption described by the CNIL. Since 22 January 2025, our SDK no longer sets any cookie and our link shortener sets no Nonli application cookie; neither creates visitor identifiers. SDK and shortlink counters are aggregated by content, link or domain; technical infrastructure processing, such as TLS, security or exception logs, remains separate from audience measurement.
3. Install the SDK#
Add this script just before the closing </body> tag on every article page, and any page likely to be shared on social media. Set your SDK subdomain below and copy the generated snippet.
You can also prefill it from the URL with ?domain=l.yourdomain.com.
1<script type="text/javascript">2window._nli=window._nli||[],function(){var n,e,i=window._nli||(window._nli=[]);i.loaded||((n=document.createElement("script")).defer=!0,n.src="https://l.yourdomain.com/sdk.js",(e=document.getElementsByTagName("script")[0]).parentNode.insertBefore(n,e),i.loaded=!0)}();3</script>4. Add Open Graph meta tags#
Open Graph tags let us read your articles correctly. The dates matter the most.
4.1. Core article tags#
1<meta property="og:title" content="Article title">2<meta property="og:url" content="https://www.mysite.com/canonical-url-of-article.html">3<meta property="og:description" content="Article description">4
5<!-- These 3 meta tags are particularly important: -->6<meta property="og:type" content="article">7<meta property="article:published_time" content="2022-06-06T11:54:30Z">8<meta property="article:modified_time" content="2022-06-06T12:21:12Z">4.2. Image tags#
1<!-- Use large uncropped images > 1000px -->2<meta property="og:image" content="https://www.mysite.com/myimage.jpg">3<meta property="og:image:alt" content="Image description">For images, use large uncropped visuals above 1000 px. JPG and PNG are the safest formats for metadata parsers, and the image should stay below 8 MB.
4.3. Section and keyword tags#
1<!-- article:section classifies content by section (category) -->2<meta property="article:section" content="Sport" />3
4<!-- article:tag classifies content with keywords, spread across several tags -->5<meta property="article:tag" content="keyword 1" />6<meta property="article:tag" content="keyword 2" />7<meta property="article:tag" content="keyword 3" />Use one article:section for the main category and repeat article:tag once per keyword.
5. Add schema.org structured data#
Add JSON-LD in the page <head>.
5.1. NewsArticle#
NewsArticle is the main structured data object. articleSection gives us the article sections and keywords gives us the tags. Authors are usually already well described, but the object must still include at least one author.
1{2 "@context": "https://schema.org",3 "@type": "NewsArticle",4 "mainEntityOfPage": {5 "@type": "WebPage",6 "@id": "https://www.example.com/category/my-article.php"7 },8 // A unique identifier to avoid duplicate content very quickly9 "identifier": "123456",10 "headline": "Main article title",11 "alternativeHeadline": "Alternative title or article lead",12 "description": "Complete article description for SEO",13 "keywords": ["keyword1", "keyword2", "keyword3"],14 // It might be interesting to add articleSection to make it appear in the categories:15 "articleSection": ["Main category", "Secondary category"],16 "author": [17 {18 "url": "https://www.example.com/author",19 "@type": "Person",20 "name": "First Last",21 "jobTitle": "Journalist",22 "address": "City"23 }24 ],25 "datePublished": "2025-09-29T10:00:00Z",26 "dateModified": "2025-09-29T15:30:00Z",27 "isAccessibleForFree": true28}Use isAccessibleForFree: false if the article is behind a paywall.
5.2. ImageObject#
If the article has a main image, include it through the image field in NewsArticle.
1{2 "@type": "ImageObject",3 "url": "https://www.example.com/images/hero.jpg",4 "width": 1200,5 "height": 630,6 "caption": "Image description"7}5.3. VideoObject#
If an article contains a video, add a separate VideoObject JSON-LD block.
1{2 "@context": "https://schema.org",3 "@type": "VideoObject",4 "name": "Video title",5 "description": "Video description",6 "thumbnailUrl": [7 "https://www.example.com/video-thumbnail.jpg"8 ],9 "uploadDate": "2025-09-29T08:00:00+00:00",10 "duration": "PT1M54S",11 "contentUrl": "https://www.example.com/video/123/file.mp4",12 "embedUrl": "https://www.example.com/embed/123",13 "interactionStatistic": {14 "@type": "InteractionCounter",15 "interactionType": { "@type": "WatchAction" },16 "userInteractionCount": 564701817 },18 "regionsAllowed": "FR"19}6. Final checklist#
NewsArticle: includeidentifier,datePublished,dateModified, and at least oneauthor.- Dates: use ISO 8601, either UTC (
Z) or with a timezone offset. - Open Graph: add
og:type=article, publication and modification dates, onearticle:section, and onearticle:tagper keyword. - JSON-LD: expose categories with
articleSectionand tags with thekeywordsarray. - Images: use a large uncropped
og:image, addog:image:alt, and include image dimensions in JSON-LD when possible. - Videos: add
VideoObjectonly when the article embeds a video.
For a guided integration walkthrough, request a demo.