An AI accepts two judgments before it ever quotes you. First — is this still current? Second — who actually wrote this? Both happen in fractions of a second, both ride on machine-readable signals you either supplied or didn't.
Here's what's actually happening under the hood of the citation pipeline — and where you fit in it.
1. Two checkpoints before the quote#
When an LLM composes an answer and is looking for sources to cite, it runs candidates through two filters:
- Recency check — is the information current? A 2019 article on the Next.js App Router gets dropped instantly.
- Authority check — does the author have weight in this niche? An anonymous Medium post and a senior engineer's post are very far from the same thing for weighted ranking.
No signal — no trust. The AI doesn't guess. It reads what you gave it.
2. datePublished and author — the canonical fields#
Inside the Article Schema.org type, these two fields carry the load. Here's the canonical pattern for embedding the JSON-LD via a <script> block in a Next.js server component:
import React from 'react';
interface PageProps {
params: Promise<{ slug: string }>;
}
export default async function BlogPostPage({ params }: PageProps) {
const { slug } = await params;
const jsonLd = {
"@context": "https://schema.org",
"@type": "Article",
"headline": "Recency and Authority in AI Citations",
"datePublished": "2026-05-07T08:00:00Z",
"dateModified": "2026-05-07T08:00:00Z",
"author": {
"@type": "Person",
"name": "Oleksii Turovskyi",
"url": "https://alexturik.com",
"sameAs": [
"https://github.com/turovskiy",
"https://linkedin.com/in/alexturik",
"https://x.com/alexturik"
]
}
};
return (
<article className="max-w-3xl mx-auto py-10 px-4">
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<header className="mb-8 border-b pb-4">
<h1 className="text-4xl font-bold text-gray-900">
Recency and Authority in AI Citations
</h1>
<time dateTime="2026-05-07T08:00:00Z" className="text-sm text-gray-500 mt-2 block">
May 7, 2026
</time>
</header>
<div className="prose prose-blue lg:prose-lg">
<p>Article body starts here…</p>
</div>
</article>
);
}Perplexity, ChatGPT browse, Google AI Overviews, Claude search — they all look at this structure first. Long before they start parsing your HTML.
3. The "1 hour ago" badge tells machines nothing#
This is where most sites quietly fail. You see "published an hour ago" on the rendered page and assume the date is there. To machines, it isn't.
A text badge is for human eyes only. The crawler ignores it, because the string "1 hour ago" cannot be safely resolved to an exact timestamp without deep context. What an algorithm actually needs:
- Minimum — a semantic
<time datetime="2026-05-07T08:00:00Z">May 7, 2026</time>in the HTML. - Better — a
datePublishedfield in JSON-LD. - Gold standard — both, in HTML and JSON-LD. Duplicating the data here is a feature, not a bug.
4. Author is not a string#
This is the single most common mistake. People write "author": "Oleksii Turovskyi" and move on. Technically valid. Authority — zero.
The right structure is a Person object with an identity graph through the sameAs array. sameAs is the glue that fuses you to your reputation across other ecosystems.
A GitHub account with a commit history, a LinkedIn with relevant experience, a Twitter with expert activity — the AI sees this whole graph and builds a model: who you are, what you're an expert in, whether it's worth quoting you specifically in this knowledge vertical. Without sameAs you're a text string. With it — a person with a reputation footprint.
5. Backup via meta tags#
There are situations where embedding JSON-LD painlessly isn't an option. An old WordPress without access to header.php. A legacy build. A Jamstack with a stale theme. That's when meta tags in <head> step in. Second-tier signal, but AI crawlers do read them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Recency and Authority in AI Citations</title>
<meta property="article:published_time" content="2026-05-07T08:00:00Z">
<meta property="article:modified_time" content="2026-05-07T08:00:00Z">
<meta name="author" content="Oleksii Turovskyi">
</head>
<body>
<article>
<h1>Recency and Authority in AI Citations</h1>
</article>
</body>
</html>This is not a full replacement for the sameAs graph. But it's much better than naked HTML with no signal at all, and definitely better than leaving your authority an open question for a hallucinating model.
6. dateModified — the unsung hero#
This one gets overlooked all the time. You update an old article — add fresh benchmarks, rewrite a section on hooks, fix outdated CLI commands. Without dateModified, AI sees the article as stale based on the original datePublished from 2023. No citation.
Add dateModified and the recency check passes. The article becomes relevant again. Updating content without updating the markup is a guaranteed lost citation. This is one of the cheapest wins in the entire AEO stack.
7. The most common formatting mistake#
"datePublished": "2026/05/07" ✗ invalid
"datePublished": "May 7, 2026" ✗ invalid
"datePublished": "07.05.2026" ✗ invalid
"datePublished": "2026-05-07T08:00:00Z" ✓ ISO 8601, worksSchema.org requires ISO 8601. No exceptions. Plug your URL into validator.schema.org after every template change — it catches this in seconds.
8. Reusable author schema#
Wrap the block once and you get authority signals on every publication, forever:
export function getAuthorSchema() {
return {
"@type": "Person",
"name": "Oleksii Turovskyi",
"url": "https://alexturik.com",
"sameAs": [
"https://github.com/turovskiy",
"https://linkedin.com/in/alexturik",
"https://x.com/alexturik"
]
};
}Call it inside every JSON-LD generator. Write it once — pays back across every post.
Auditing your own site?
Open the Schema Markup Validator on a recently-published post. If datePublished is missing, malformed, or the author is a bare string — your recency and authority checks are silently failing on every AI citation pipeline that visits your domain.
Follow me on LinkedIn for more on AEO architecture. For a structured-data audit or schema implementation on your platform, get in touch.