Recency and Authority — Two Fields AI Uses to Trust You
· 8 min read · Updated
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.
What does a model check before it quotes you?#
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.
Why doesn't a "1 hour ago" badge count?#
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.
Why is a bare author string not enough?#
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.
What does dateModified actually buy you?#
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.
What is the most common date-format 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.
Field reference#
What each field is for, and what breaks when it is missing or wrong.
| Field | Type | Needed | What happens without it |
|---|---|---|---|
datePublished |
ISO 8601 with offset | Always | No recency signal; the page is undateable and ranks as stale |
dateModified |
ISO 8601 with offset | On any update | Corrections never register; old claims keep being quoted |
author |
Person or Organization |
Always | Attribution drops; the quote arrives with no source name |
author.url |
URL | Strongly | No entity to connect the byline to across the web |
publisher |
Organization |
Always | No brand attached to the citation |
mainEntityOfPage |
URL | Strongly | Ambiguity about which URL the markup describes |
The offset is the part people miss. 2026-08-09 parses, but Google's Rich
Results Test reports it as an invalid date-time, because a date with no time
zone is not a moment — it is a different instant in every country.
FAQ#
What is the difference between datePublished and dateModified?#
datePublished is when the page first went live and never changes.
dateModified is when the content last meaningfully changed. Models weigh the
second more heavily for anything time-sensitive, because it answers "is this
still true" rather than "when was this written".
Should I update dateModified to look fresh?#
No. Bumping the date without changing the content is the structured-data equivalent of a doorway page — the claim and the document disagree, and both Google and the crawlers that build citation indexes compare them. Update the field when you update the article, and the signal stays worth something.
Why isn't a visible "Updated 1 hour ago" enough?#
Because it is prose. A machine reading the page sees a string that could be generated, templated, or relative to a build time it cannot resolve. The machine-readable field is what gets parsed; the visible badge is what reassures the human. Ship both, and make them agree.
Does author have to be a Person rather than a string?#
author: "Oleksii Turovskyi" is technically valid and practically useless. A
Person object with a url is an entity that can be linked to a profile, a
body of other work, and a reputation — which is what an authority check is
actually looking for. A string is just characters.
How do I see what a crawler makes of my dates?#
Run the Rich Results Test for Google's reading, and check the raw JSON-LD for the offset. The AEO Checker extension surfaces whether the page carries JSON-LD at all, which is the failure mode that hides behind a green visual check.
Sources#
- schema.org/datePublished · schema.org/dateModified · schema.org/author
- Google Search Central: Article structured data — which date fields Google reads and how
- RFC 3339, Date and Time on the Internet — the offset requirement that trips up date-only values
Part of the Answer Engine Optimization cluster — the full reading order in dependency sequence, plus a glossary of every term used across these articles.
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.