Server-rendered vs. JavaScript content
Labels can only be verified for content that is in your page source.
Server-rendered vs. inserted by JavaScript
Our server confirms a label by fetching your page's HTML, the same HTML a browser receives before any JavaScript runs, and looking for the marked content in it. So:
- Content in the server's HTML is verified. That includes plain HTML, server-side rendered and statically generated pages, WordPress and other CMS pages, and Next.js server-side rendering, static generation and Server Components (Client Components that render on the server count too). Client-side navigation in such apps is fine: label.js registers the content under the new page's address, and our server fetches that address's HTML.
- Content inserted by JavaScript after the page loads is labeled but never verified. label.js sees it and draws the label, and the record is created as pending, but our server can't find it in the HTML. Its verify page says "We couldn't confirm this label on your-hostname", the dashboard shows "Some marked content wasn't in the page's HTML when our server checked" under Needs attention, the labeled content list hides these rows unless you choose Not confirmed in its status filter, and records that never verify are eventually removed by our daily cleanup. This is the case for content fetched in the browser (for example in a React
useEffect) and for apps that render everything in the browser (Vite or Create React App single-page apps).
How to tell which case a page is in: open the page, use your browser's View page source (Ctrl+U, or ⌥⌘U on a Mac), not the developer tools' Elements panel, and search for data-disclarion and a few words of the AI text. Found in the source: it will verify. Only in the Elements panel: it was inserted by JavaScript. The curl command under Check that it works does the same from a terminal. The fix is to render the marked content on the server (or prerender it). If that isn't possible, use the Python SDK's track_content() from your backend instead.