---
title: "Ingest Research Rows"
method: POST
path: "/api/ingest/research-rows"
tags: ["ingest"]
---

# Ingest Research Rows

`POST /api/ingest/research-rows`

## Request

- Base URL: `https://api.equity-rank.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.equity-rank.com/api/ingest/research-rows`
- Auth: HTTP bearer

Validate row-by-row, not batch-wide. Before 2026-10-01 a single malformed row
(e.g. a non-ISO date that slipped past the shaping script) 422'd the ENTIRE
request, and `edgar_pit_ingest_client.post_all` treats any 4xx as fatal and aborts
the whole run -- the Owner Daily Desk `insider-history` pull landed only 6 of
~6,811 symbols because one bad row, thousands of rows in, killed every batch after
it (the rows already fetched were never lost -- they just never got re-sent,
because the run died). A 422 is now reserved for a structurally wrong request (an
unknown table, or a batch where EVERY row fails); a batch with some good and some
bad rows inserts the good ones and reports the rest as `rows_rejected` so the
caller can see it without the run dying.

## Request body

- ResearchRowsBatch
  - `table` 'listing_status_snapshot' | 'dividend_history' | 'split_history' | 'earnings_surprise_history' | 'benchmark_price_history', required
  - `rows` object[]

## Response `200`

Successful Response

- ResearchRowsResult
  - `table` string, required
  - `rows_sent` integer, required
  - `rows_rejected` integer, required
  - `run_id` string, nullable, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/equity-rank/apis/equity-rank-api.md) · [All operations](https://skmtc.dev/equity-rank/apis/equity-rank-api/llms.txt) · [OpenAPI document](https://skmtc.dev/equity-rank/apis/equity-rank-api/revisions/c2f2463fee33?raw)
