# Syted: complete reference Syted is a subscription service that researches, writes and publishes SEO articles for SaaS companies. The articles are served through an authenticated API and rendered by the customer's own application, so the blog lives at yourdomain.com/blog rather than on a hosted subdomain. Website: https://syted.ai Price: $99 per month, 30 articles per month Package: @syted/next on npm --- ## 1. The problem it solves Search results for the same phrase can serve entirely different audiences. A keyword with 1,600 monthly searches, a difficulty of 5 out of 100 and an $8 cost per click looks like an obvious target on any keyword tool. Opening the results can reveal that every page ranking for it is an agency reporting dashboard, a white-label PDF builder or a Looker Studio template, none of which sells what the customer sells. Volume and difficulty describe a query. They say nothing about who is asking or what they expect to find. That information exists only on the results page. Syted reads that page before writing. When what ranks does not match what the customer sells, the keyword is skipped and the reason is recorded. A skipped article is the intended behaviour. ## 2. How an article is produced 1. Keyword research runs every two weeks and fills a queue of candidate topics. Running it per article would multiply the data cost with no gain, since the underlying metrics move slowly. 2. Every morning, one topic leaves the queue. The live search results for it are fetched fresh, including the AI Overview when there is one. 3. The intent check compares what ranks against the customer's own description of their product and audience. A mismatch stops the run before any tokens are spent on writing. 4. A brief is built from what actually ranks: the questions people ask, the sections competitors cover, the angle nobody has taken. 5. The article is written against that brief and against the list of facts the customer allows the writer to state. 6. A separate review pass reads the draft against the brief, the fact list and the quality rules. It scores the draft and reports what is wrong. 7. Articles that pass are published. Articles that fail are stored as drafts and surfaced in the dashboard, never pushed to the customer's site. ## 3. What the customer configures - Product description and what it does - Who buys it, in their own words - Facts the writer may state: prices, plan names, limits, published numbers - Phrases that must never appear - Tone and reading level - Internal pages worth linking to - Competitors, so their names are handled deliberately rather than by accident Nothing about the product is inferred. A claim outside the fact list is not written, which is what stops an article inventing a price the customer does not charge. ## 4. LLM visibility Syted measures how often the customer's domain appears in ChatGPT answers, weekly, and which domains are cited instead of them on the same questions. That second list is usually more useful than the first: it is the real competitive set for the answer, and it is rarely the set the customer assumed. No guarantee of a recommendation is offered, because none is possible. The number is reported and tracked over time. ## 5. Integration ### Install npm i @syted/next Set the API key in the server environment. It must never reach the browser. SYTED_API_KEY=ab_live_... ### Turnkey mode One file renders the whole blog. // app/blog/[[...slug]]/page.tsx import { createBlogPage } from '@syted/next' const blog = createBlogPage({ title: 'Blog', siteUrl: 'https://acme.com', headerOffset: 64, cta: { eyebrow: 'Acme', title: 'Ship your changelog in minutes', description: 'Free while you are under 100 users.', buttonLabel: 'Start free', href: '/signup', }, }) export default blog.Page export const generateStaticParams = blog.generateStaticParams export const generateMetadata = blog.generateMetadata export const revalidate = 3600 It renders the index, the article pages, canonical URLs, Open Graph and Twitter metadata, BlogPosting and BreadcrumbList JSON-LD, a reading progress bar pinned to the top of the window, a sticky table of contents built from the article's own headings, a CTA card in the right rail and a CTA banner at the end of the article. Options: title, description, basePath (default /blog), siteUrl, cta, footerCta, toc (default true), tocLabel, headerOffset in pixels, theme ('light' or 'auto'), pageSize, and classes for root, index, indexTitle, post, postTitle and prose. No CSS framework is required. Styles are injected by the component and driven by CSS variables on .ab-root: --ab-fg, --ab-muted, --ab-faint, --ab-border, --ab-hairline, --ab-surface, --ab-accent, --ab-radius, --ab-max, --ab-font. Redefining one in the host stylesheet overrides the package. ### Data-only mode For teams who render their own design. import { createClient } from '@syted/next/client' const blog = createClient() const { articles, total } = await blog.list({ limit: 20, tag: 'seo' }) const article = await blog.get('some-slug') // article.body is Markdown const { tags } = await blog.tags() const entries = await blog.sitemap() Building blocks are exported separately: import { renderArticle, ReadingProgress, TableOfContents } from '@syted/next' const { html, headings } = renderArticle(article.body) // headings: [{ depth: 2 | 3, text, id }] The ids in the HTML match the ids in the headings array, so a custom table of contents resolves without extra work. ### Instant updates // app/api/syted/revalidate/route.ts export { POST } from '@syted/next' SYTED_WEBHOOK_SECRET=... Syted calls this route on publish so the new article appears immediately instead of waiting for the cache to expire. ### Sitemap // app/sitemap.ts import { createClient } from '@syted/next/client' export default async function sitemap() { const entries = await createClient().sitemap() return entries.map((e) => ({ url: e.loc, lastModified: e.lastmod, changeFrequency: e.changefreq, priority: e.priority, })) } ## 6. Public API Base URL https://syted.ai/api/v1, bearer token authentication with the site API key. GET /articles?limit=&offset=&tag=&locale= -> { articles, total, limit, offset } GET /articles/:slug -> { article } with Markdown body and ready-to-inject jsonLd GET /tags -> { tags: [{ name, count }] } GET /sitemap -> { entries: [{ loc, lastmod, changefreq, priority }] } 401 means the key is invalid or the subscription is no longer active. ## 7. Pricing and terms - $99 per month, a single plan - 30 articles per month - Keyword research and live SERP verification included; no separate SEO tool subscription is needed - Cancel in one click from the dashboard, with no retention flow and no call - After cancellation the articles stop being served and disappear from the site. They are not exported. This is stated on the pricing page rather than left to be discovered later. ## 8. What Syted is not It is not an SEO reporting or rank tracking tool. It does not audit sites, build backlinks, manage ad campaigns or write on demand from a prompt. It researches, writes and publishes articles on a schedule.