
A feed identity API answers a deceptively difficult question: given a URL or identifier, which continuing publication does it represent? A useful service must do more than fetch XML. It needs a durable data model for feeds and aliases, a resolver that preserves redirect evidence, a validator, a change history, and clear confidence semantics for uncertain matches.
The registry should not become a black box that silently declares two feeds identical. Its value comes from stable identifiers and transparent provenance. Every canonical URL change, alias, merge, split, validation result, and ownership assertion should be represented as data that clients can inspect.
Define the resources before the endpoints
The primary resource is a logical feed record with an immutable feed_id. It has one current canonical URL, zero or more observed aliases, a detected format, associated site URLs, metadata snapshots, and lifecycle status. Items can be represented separately or sampled for identity evidence. Organizations, claims, and validation runs are distinct resources rather than nested text fields.
Model history explicitly. A canonical URL is valid from one time until another. An alias may be observed, redirected, publisher-declared, or disputed. A feed can be active, moved, dormant, unavailable, or retired. Avoid a single mutable record that erases earlier states.
Use opaque, immutable feed IDs
A registry ID should not contain the canonical domain, title, category, or format. Those properties can change. An opaque token such as rssid:feed:01J... or a UUID-based URI remains stable through migrations. Human-readable slugs can be secondary routes that redirect to the immutable identifier.
Do not recycle IDs after deletion or retirement. A tombstone can explain that a record was merged or withdrawn. Reuse would make cached references point to an unrelated publication.
Core read endpoints
A small read surface can cover most integration needs:
GET /v1/feeds/{feed_id}
GET /v1/resolve?url={feed_url}
GET /v1/feeds/{feed_id}/aliases
GET /v1/feeds/{feed_id}/events
GET /v1/feeds/{feed_id}/validation/latest
GET /v1/search?q={title_or_domain}
The feed response should include the canonical URL, format, site relationship, current metadata, status, timestamps, and links to aliases and events. The resolver should return both the matching feed and the evidence used: exact canonical match, known alias, redirect, declared self link, or an inferred similarity requiring review.
Resolver behavior must be bounded
A URL resolver performs network activity and therefore needs strict controls. Normalize the input conservatively, reject unsupported schemes, resolve DNS safely, prevent access to private network ranges, cap redirects, limit response size, enforce timeouts, and parse content with hardened libraries. Server-side request forgery is a primary risk.
Return the requested URL, each redirect hop, final URL, status codes, content type, detected format, and validation summary. Do not hide a redirect chain behind a single canonical string. Provenance is necessary for troubleshooting and identity decisions.
Separate observations from assertions
An observation says what the service fetched at a time. An assertion says what an actor claims, such as “this is the canonical feed” or “this organization controls this domain.” An inference says what the registry concluded from evidence. Mixing those categories turns uncertain data into apparent fact.
Each field should have provenance: source, observed time, verification method, confidence, and expiration if relevant. A title parsed from the feed is different from a title entered by a verified owner. A canonical URL inferred from redirects is different from one explicitly declared by the publisher.
Represent aliases and migrations as events
When a feed moves, create an event that links the previous URL, new URL, redirect evidence, observation time, and actor. Keep the old URL as an alias. Clients can then understand why a resolver maps both addresses to one feed ID and can reconstruct the state at an earlier date.
Merges and splits need similar events. A merge should preserve the source IDs as tombstones or aliases rather than deleting them. A split should create new IDs and state how they descend from the original. These operations should require stronger evidence than an automated content match.
Design confidence as structured evidence
A resolver can expose a result such as verified, high, possible, or unmatched, but the label must be accompanied by signals. A permanent redirect plus stable item-ID overlap is stronger than title similarity. A verified domain-control claim may be stronger than a self link fetched over a compromised route.
Clients should be able to set their own thresholds. A feed reader might automatically follow a high-confidence alias. A compliance archive might require verified publisher control. Returning the evidence lets each consumer make an appropriate decision.
Validation is a resource, not a boolean
Store validation runs with the requested URL, final URL, fetch metadata, parser version, errors, warnings, item count, identifier checks, and timestamps. “Valid” alone loses useful detail. A feed may parse but contain duplicate GUIDs or broken enclosures. Another may have a noncritical profile warning.
Expose recent results and a compact history so clients can detect regressions. Avoid fetching on every read request; use a queue, cache policy, and explicit refresh endpoint with rate limits. A stale result should include its age rather than appear current.
Write operations and ownership
Public users may propose a feed URL, but changes to canonical status, organization ownership, and merges should require authentication and review. Domain control can be verified through DNS, an HTML token, a well-known file, or an authenticated publisher workflow. No single method fits every host, so record the method and time.
Protect against hostile takeover attempts. A temporary redirect or copied feed should not allow a claimant to seize a long-established record. High-impact changes can use delayed activation, notifications to existing verified contacts, and an appeal process.
HTTP and caching semantics
Use stable resource URLs, clear status codes, ETags, and cache headers. A lookup for an unknown ID should be distinguishable from a retired ID. A merged ID can return a redirect to the surviving record or a tombstone document with the replacement link, depending on the API contract.
Resolver requests may be asynchronous when network fetching is required. A client can submit a URL, receive an operation ID, and poll or follow a callback policy. Do not hold connections indefinitely while following slow redirects and parsing large documents.
Document the contract with OpenAPI
A machine-readable API description makes schemas, parameters, errors, authentication, and examples testable. The current standard is described in the OpenAPI Specification 3.2.0. Pin the version used by the registry and publish compatibility notes when the contract changes.
Examples should include uncertain and failure cases, not only a perfect response. Document rate limits, freshness, pagination, merge redirects, validation warnings, and the difference between observed and verified fields. SDK generation is useful, but clarity of semantics matters more than generated code.
Privacy, abuse, and retention
Feeds can include personal data, private tokens, or unlisted content. The service should default to public HTTP and HTTPS sources, redact credentials from logs, avoid indexing private network targets, and provide removal or suppression processes where appropriate. Raw responses may need shorter retention than derived metadata.
Rate limits should account for both API calls and outbound fetches. Attackers can use a resolver to scan hosts or amplify traffic. Cache identical requests, respect reasonable publisher load, identify the crawler, and provide contact information.
Suggested response shape
{
"feed_id": "rssid:feed:01J9W6T2M8Y7KQ4R3N2P1A0BCD",
"canonical_url": "https://example.org/feed/",
"status": "active",
"format": "rss2",
"aliases": 3,
"match": {
"level": "high",
"signals": ["known_alias", "permanent_redirect", "item_id_overlap"]
},
"observed_at": "2026-10-12T17:20:00Z",
"links": {
"events": "/v1/feeds/rssid:feed:01J9.../events",
"validation": "/v1/feeds/rssid:feed:01J9.../validation/latest"
}
}
The response is concise enough for clients while preserving the reason behind the match. Detailed observations can live behind linked resources.
Implementation sequence
- Create the immutable feed, alias, observation, event, and validation models.
- Build a safe fetcher with redirect and network protections.
- Implement exact canonical and alias resolution before similarity matching.
- Add strict parsing and identity-aware validation for RSS, Atom, and JSON Feed.
- Expose evidence-rich read endpoints with caching and pagination.
- Add authenticated claim and review workflows for high-impact changes.
- Publish the API description, version policy, limits, and abuse contact.
- Introduce fingerprint and similarity systems only after provenance is solid.
Conclusion
An RSS feed identity API is a registry of relationships and evidence, not merely a URL fetcher. Its stable feed IDs allow locators to change. Alias and event records preserve history. Validation resources describe quality over time. Resolver responses explain why an observed URL maps to a publication.
Build the transparent data model first, secure the network boundary, and keep uncertain matches reversible. With those foundations, an API can support feed discovery, migration, deduplication, analytics, and archival systems without turning identity into an opaque guess.


