# Transaction object

Insider trades (Form 4), initial beneficial-ownership statements (Form 3), and institutional holdings reports (Form 13F) reported to the SEC. US filings only. For the Form 4 / Form 3 endpoints, the plan coverage scope ([Coverage scope notice](/documents/coverage.md#coverage-scope-notice)) and history window ([History truncation notice](/documents/coverage.md#history-truncation-notice)) apply as they do elsewhere, on the filing's `filing_date`; the 13F endpoints are organized by the filing **manager** (institution). These endpoints are available on every plan; full-library screening is [`POST /screener/ownership`](/documents/post-screenerownership.md), [`POST /screener/initial-holdings`](/documents/post-screenerinitial-holdings.md) and [`POST /screener/institutional-holdings`](/documents/post-screenerinstitutional-holdings.md), which require **Pro or higher**.

Credits are deducted before the query runs, so a `404` or `403` raised afterwards is still charged.

Returned by `POST /ownership/transactions`, `POST /ownership/transaction-ids`, and `POST /screener/ownership`.

| Field | Meaning |
|-------|---------|
| `id` | Transaction id. Pass to `POST /ownership/transaction-ids`. |
| `is_derivative` | Derivative table row (`true`) or non-derivative (`false`). |
| `transaction_form_type` | `"4"` or `"5"`. |
| `transaction_date`, `transaction_code` | As filed. |
| `transaction_type` | Official SEC name for `transaction_code`. |
| `transaction_type_group` | One of the five SEC groupings — see [`GET /ownership/transaction-types`](/documents/get-ownershiptransaction-types.md). |
| `acquired_disposed_code` | `"A"` acquired, `"D"` disposed, or `null`. The trade's direction. |
| `shares`, `price_per_share`, `transaction_value`, `shares_owned_following` | As filed. `transaction_value` may be `null` or `0`. |
| `transaction_note` | Filer-side note explaining a `null` / `0` value. `null` when absent. |
| `principal_amount_not_shares` | `true` when `shares` holds a debt principal amount. |
| `security_title`, `direct_or_indirect`, `nature_of_ownership` | As filed. |
| `footnote_refs` | Footnote ids for this transaction. Resolve against the filing's `footnotes` map. |
| `source_locator` | Combine with the filing's `source_url_prefix` to build the SEC URL. |
| `restated` | `null`, `"cancelled"`, `"modified"`, or `"added"` — set when an amendment changed this transaction. |
| `prior` | Present only when `restated` is set. The pre-amendment values. |
| `split_adjusted` | Present only when the filed values are not on the current per-share basis. See below. |
| `data_quality_flags` | Present only when at least one rule fires. See below. |

Derivative rows additionally carry `conversion_or_exercise_price`, `exercise_date`, `expiration_date`, `underlying_security_title`, `underlying_security_shares`, `underlying_security_value`, and `value_owned_following`.

## `split_adjusted`

`shares` and `price_per_share` are in the units of the transaction's own trade date. When those differ from the current per-share basis, the block is present:

```json
"split_adjusted": {
  "shares": 4000.0,
  "price_per_share": 125.86,
  "shares_owned_following": 48000.0,
  "underlying_security_shares": null,
  "conversion_or_exercise_price": null,
  "split_adjustment_factor": 4.0
}
```

Absent means the filed values are on the current per-share basis. A field is `null` when the split does not change it (for example a debt principal). `split_adjustment_factor` carries the same meaning as `adjustment_factor` on the metrics API ([`POST /metric/all`](/documents/post-metricall.md)).

## `data_quality_flags`

Rows that fail a consistency check carry one or more of:

`future_transaction_date`, `future_deemed_execution_date`, `zero_price_open_market`, `derivative_date_order`, `negative_shares`, `negative_price`, `negative_transaction_value`, `negative_shares_owned_following`, `value_mismatch`, `manual_flags`.

Rows flagged `manual_flags` also carry a `manual_flags` array of `{code, note}` entries describing the issue.

Flagged rows are excluded from `POST /ownership/transactions`, `POST /ownership/stats` and `POST /screener/ownership` unless `include_anomalies=true` (`trade_filters.include_anomalies` on the screener). Each endpoint reports how many it withheld: the listing in `anomalies_excluded_on_page` (this page only), stats and the screener in `anomalies_excluded_count` (the whole requested range).

## `computed`

`POST /screener/ownership` rows additionally carry a `computed` block with `shares_owned_before` and `own_pct_change`. Each entry has `value`, `status` (`ok` / `unavailable`), `unit`, `formula`, `computed_as`, and `fact_refs` pointing at the inputs. When an input is missing, the entry has only `value` (`null`), `status` (`"unavailable"`) and `computed_as`, which states the reason.
