# Filing timestamps

Point-in-time (PIT) queries filter rows using a single timestamp. The response returns the timestamp used. Set `visible_by` to `published_at`, `available_at`, or `committed_at`.

Reference page. Updated 2026-08-26 against the corpus described on [coverage](https://pit.aqx.llc/docs/coverage).

## The five fields

Every row includes all five timestamp fields. `visible_by` accepts three of them. The response returns `event_at` and `acceptance_at` as read-only fields on the row.

| Field | What it records | Query clock |
| --- | --- | --- |
| `event_at` | When the underlying event happened, where the publisher states one. | No |
| `published_at` | The filer, publisher, or index clock. This is the default. | Yes |
| `available_at` | The first public availability we hold evidence for. Null where we hold none. | Yes |
| `acceptance_at` | SEC `ACCEPTANCE-DATETIME` from the filing header, converted from Eastern. It records when EDGAR accepted the submission, which is earlier than dissemination. | No |
| `committed_at` | When we wrote the row. A 2026 backfill of a 2020 filing carries a 2026 `committed_at`. | Yes |

`acceptance_at` is populated only for filings where we fetched the EDGAR header. Most SEC rows have null. Read this field per row. Do not assume an entire partition (one source, one day) contains it.

## visible_by

`visible_by` accepts `published_at`, `available_at`, or `committed_at`. If empty or omitted, it defaults to `published_at`. Any other value (including `event_at` and `acceptance_at`) returns HTTP 400 with `invalid_clock`.

**visible_by=acceptance_at — 400 · invalid_clock**

```
{
  "status": "error",
  "count": null,
  "error": {
    "code": "invalid_clock",
    "message": "visible_by must be one of published_at, available_at, committed_at. Received: \"acceptance_at\"",
    "param": "visible_by"
  }
}
```

A row matches when its chosen timestamp is less than or equal to `as_of`. Both timestamps use UTC and the comparison is inclusive. For example, `as_of=2023-03-10T23:59:59Z` includes a row stamped 23:59:59 on that day.

## Asking for a clock the corpus does not hold

Requesting `available_at` for a source without availability evidence returns HTTP 409. The response sets `count` to null and includes an `availability.` key under `coverage.missing` that names the source and day.

**example=svb · visible_by=available_at — 409 · coverage_missing**

```
$ curl -s "https://api.pit.aqx.llc/v1/sample/news?example=svb&as_of=2023-03-10T23:59:59Z&visible_by=available_at"

{
  "visible_by": "available_at",
  "status": "coverage_missing",
  "results": [],
  "count": null,
  "coverage": {
    "touched": ["sec.edgar/2023-03-10", …],
    "missing": ["availability.sec.edgar/2023-03-10"]
  }
}
```

All 563,594 `sec.edgar` rows have `available_at: null`, so every strict cut over SEC data returns HTTP 409 today. Federal Register public inspection and CFTC Commitments of Traders include this timestamp and return normal responses. See [Coverage](https://pit.aqx.llc/docs/coverage) for all refusal rules.

## Where available_at comes from

`availability_basis` describes the evidence behind `available_at`. Use this field to distinguish an actual receipt timestamp from a published release schedule.

| `availability_basis` | Meaning | Where it appears |
| --- | --- | --- |
| `unknown` | No evidence of first availability, and `available_at` is null. | All of `sec.edgar`, all of `us.ofac.sdn`, and the 2,208 Federal Register special filings. |
| `ofr_regular_pi` | The Office of the Federal Register's documented 08:45 America/New_York public-inspection batch. | 19,528 `us.federal_register.pi` rows. |
| `scheduled_release` | A release time the publisher states in advance. | All 1,149 `us.cftc.cot` rows, at 15:30 America/New_York on the release date. |

The 08:45 Eastern batch converts to 13:45Z in winter and 12:45Z in summer due to daylight saving time. During the two annual daylight saving transitions, ambiguous wall-clock times fail during ingest instead of guessing the instant.

## Dates with no time

When a publisher provides only a date without a time, the system sets the timestamp to the end of that day rather than the start.

| Source | Date-only case | `published_at` |
| --- | --- | --- |
| `sec.edgar` | Every daily-index row. The index gives Date Filed and no time. | Later of Date Filed and the index's own day, at `23:59:59Z` |
| `us.federal_register.pi` | A special filing with no `filed_at`. | Available-on date at `23:59:59Z` |

If EDGAR lists a filing after its filing date, the dates differ. Across the 204 SEC index files in the corpus, 197 rows have a Date Filed earlier than the index that first listed them. These rows use the index date because that is when the filing appeared in the public feed.

Setting timestamps to the start of the day would make filings visible before publication. For example, `2023-03-10T00:00:00Z` is 19:00 on 9 March in New York. The SVB 8-K was accepted at 17:23 Eastern on the 10th, so a day-start timestamp would make it visible 22 hours and 23 minutes early. Because timestamps use the end of the day, treat `published_at` on date-only rows as an upper bound with day-level resolution.

The upper bound remains within the same UTC day, so `partition_date` matches the UTC date of `published_at`. To query an entire day, set `as_of` to `23:59:59Z` or later. Earlier cutoffs exclude all date-only rows for that day. When an intraday timestamp exists, the system uses it instead of the day-end bound. Examples include the Federal Register `filed_at`, the 08:45 public-inspection batch, and `acceptance_at` from EDGAR headers.

## One filing, three cuts

The SVB receivership 8-K (accession `0001193125-23-067777`) has four timestamps and produces three possible query cuts.

- **published_at**: `2023-03-10T23:59:59Z`: date-only row with a day-end bound.
- **available_at**: `null`, with `availability_basis: unknown`
- **acceptance_at**: `2023-03-10T22:23:03Z`: converted from `ACCEPTANCE-DATETIME 20230310172303` Eastern.
- **committed_at**: 2026: set by the backfill job timestamp.

| Call | Result |
| --- | --- |
| `?example=svb&as_of=2023-03-09T20:00:00Z` | **200 · count 0** The 8-K did not exist yet. |
| `?example=svb&as_of=2023-03-10T23:59:59Z` | **200 · count 1** Default `published_at`. |
| `…&visible_by=available_at` | **409 · count null** SEC holds no availability evidence. |

You can test these three cuts on the [as-of demo](https://pit.aqx.llc/demo?example=svb) or review [the 8-K worked example](https://pit.aqx.llc/use/sec-8k-as-of).

## Two lanes

The lane field indicates how a row received its timestamp. Each row contains one lane value, and query results never mix lanes. `certified_pit` rows come from a stored, hashed publisher document. `forward_first_seen` rows record when our poller first detected the item, which may be later than the publisher release time.

Backfill jobs set `available_at` to null. This field requires proof of first public availability recorded at ingestion time. A backfill job running in 2026 cannot verify when an item was reachable in 2020.
