# AsOf IDs

One stable key per entity. Cite it beside the Wikidata QID.

Every record on AsOf has an ID that never changes and a URL that resolves to it: as a page, as markdown and as JSON. A Wikidata QID says which thing an entity is. An AsOf ID adds when: the dated, sourced claims about it, what held on a given day and which source said so. Put the URL in your schema.org sameAs next to the Wikidata link, and the ID in identifier, so the crawlers and agents that read your markup can follow it to the record.

## The ID

form: ent_ and the record's slug: ent_google. Slugs are lowercase names with hyphens: openai, google-deepmind, laguna-m-1.  
url: https://asof.is/record/{slug}: the page. Add .md for the markdown twin; https://asof.is/v1/entities/{slug} is the JSON, with ?as_of=YYYY-MM-DD for the state on a date.  
node: https://asof.is/record/{slug}#entity: the @id of the entity in the page's own JSON-LD (Organization, Person or Product).  
by id: https://asof.is/record/ent_google and https://asof.is/v1/entities/ent_google redirect to the slug's URL, so an ID alone resolves.  
stability: An ID is never reused or reassigned. When two records turn out to be one, the dropped slug redirects permanently to the kept one on every surface (page, twin, JSON, timeline), and the dropped ID keeps resolving.  
scope: Organizations, products and models, regulators and public bodies, and people in public roles, in tech and AI first. Narrow on purpose: every record is one the pipeline checks.  

## Beside Wikidata, not instead

- A QID identifies. Wikidata holds an item for most things worth naming, in every language, under CC0; it is the right key for saying which entity you mean, and AsOf uses it that way: every record names its QID where one exists.
- An AsOf ID dates. Behind it sits a ledger, not a description: each claim carries valid_from and valid_to, its sources and a confidence score, and a replaced claim is closed and linked to the one that replaced it, never overwritten. Ask the URL what was true on a day, or what changed since one, and it answers from checked claims only.
- The two reconcile. The record carries the QID, the SEC CIK and the ticker as identifiers in its own markup and JSON, so a reader with any of them reaches the AsOf record, and a reader with the AsOf ID reaches the Wikidata item.
- A record does not wait for an item. A record exists when the pipeline has checked claims about an entity; it names a Wikidata item when one exists. So citing both keys covers an entity before, and after, Wikidata has it.

## In your markup

An organization's own page, with both keys:

```json
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Google",
  "url": "https://www.google.com/",
  "sameAs": [
    "https://www.wikidata.org/wiki/Q95",
    "https://asof.is/record/google"
  ],
  "identifier": [
    {
      "@type": "PropertyValue",
      "propertyID": "wikidata",
      "value": "Q95"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "asof",
      "value": "ent_google",
      "url": "https://asof.is/record/google"
    }
  ]
}
```

An article that names the entity:

```json
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "...",
  "mentions": [
    {
      "@type": "Organization",
      "name": "Google",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q95",
        "https://asof.is/record/google"
      ]
    }
  ]
}
```

- sameAs takes the record's page URL, https://asof.is/record/{slug}, with no fragment and no .md: one URL per entity, the one its ID redirects to. List it beside the Wikidata URL; sameAs is a list.
- identifier takes a PropertyValue with propertyID "asof" and the ID as value; url may carry the page. Keep the Wikidata row too, propertyID "wikidata", value the QID.
- Inside your own JSON-LD graph, a node that is the entity may point at ours by @id, https://asof.is/record/{slug}#entity; between sites, sameAs is the link readers follow.
- Cite the entity, not a claim. A claim's URL (/claim/{id}) is a quotation with a date and a source: use it in a citation, a footnote or citation markup, not in sameAs.
- On the record's side the same markup is already there: every record page declares its Organization, Person or Product with identifier rows for asof, wikidata, cik and ticker, and sameAs to Wikidata, the official website and SEC EDGAR, so the link holds in both directions.

## Where to read an ID

- The record page: the Identifiers box in the sidebar, with a ready-made snippet to paste.
- The JSON: every /v1/entities answer opens with id, name, wikidata and page.
- The twin: /record/{slug}.md opens with id, wikidata, kind and same_as.
- The indexes: https://asof.is/llms.txt lists every entity with its twin; https://asof.is/record.md lists each with its QID.
- Search: https://asof.is/v1/search?q=TEXT resolves a name, ticker or former name to a slug.

## Resolve one

`GET https://asof.is/v1/entities/{slug}[?as_of=YYYY-MM-DD]` is the state, with coverage and sources; the slug is the ID after ent_. `GET https://asof.is/record/{slug}.md` is the same as markdown. The API is described at /api-docs.md.

For Wikidata editors: there is no Wikidata property for AsOf IDs yet. One would be an external identifier taking the slug, with the formatter URL https://asof.is/record/$1. Until then the link runs one way, from the record to the item, and from any page that cites both.
