---
title: "add rows"
method: POST
path: "/datasets/{id}/rows"
tags: ["Dataset CRUD"]
---

# add rows

`POST /datasets/{id}/rows`

## Request

- Base URL: `https://api.riveterhq.com/v1`
- URL: `https://api.riveterhq.com/v1/datasets/{id}/rows`
- Auth: HTTP bearer

Append up to 100 rows, each an object keyed by input column name (missing columns are empty). Free. Rows that duplicate an existing one on the index column are skipped and counted in `skipped_duplicates`. New rows' cells are `pending`; fill them with [POST /enrich](#tag/enrich/post/enrich) `{ "dataset_id": ... }`. More than 100 rows: [POST /datasets/{id}/rows/import](#tag/dataset-crud/post/datasets/{id}/rows/import).

## Path parameters

- `id` string, required

## Request body

- object
  - `rows` object[], required: Objects keyed by input column name

## Response `201`

The rows inserted

- object
  - `rows` DatasetRow[]
    - `id` string: row_...
    - `position` integer: Insertion order, from 1 (the row number a user sees); stable, and the paging cursor
    - `input` object: Input values by column name
    - `cells` object: Cells by output column name (every output column is present; in a run's `output.rows`, only the columns the fill covered)
    - `credits` number: Credits fills have charged for this row so far (each row run counted once)
    - `not_found_reason` string, nullable: The agent's one sentence on what it could not find on this row and why, from its last successful run; null when it found every column or has not run
    - `created_at` string, date-time
    - `updated_at` string, date-time
  - `skipped_duplicates` integer
  - `row_count` integer

## Other responses

- `400`: The request is malformed or names a conflicting parameter combination
- `401`: Missing or invalid API key (`request_status` body — see the AuthError schema)
- `403`: The API key's account may not access this resource or endpoint (`forbidden`), or the account has not migrated to Datasets yet (`feature_not_enabled` — open Datasets in the app and click "Migrate to Datasets")
- `404`: No resource with that id on this account
- `422`: The request is valid but can't be executed (e.g. insufficient_credits, credit_cap_exceeded when max_credits is set, validation failure)

## Changes

- **2026-11-13** `fac56b649559`: 2 info
  - api tag `Dataset CRUD` added
  - api tag `Datasets` removed
- **2026-10-30** `dcb4d45ade1a`: 8 info
  - added the optional property `error/credit_detail/estimate/oneOf[#/components/schemas/CreditEstimate]/typical` to the response with the `400` status
  - added the optional property `error/credit_detail/estimate/oneOf[#/components/schemas/CreditEstimate]/typical` to the response with the `403` status
  - added the optional property `error/credit_detail/estimate/oneOf[#/components/schemas/CreditEstimate]/typical` to the response with the `404` status
  - added the optional property `error/credit_detail/estimate/oneOf[#/components/schemas/CreditEstimate]/typical` to the response with the `422` status
  - …4 more
- **2026-10-19** `76aabcc5686b`: 2 info
  - api tag `Datasets` added
  - api tag `Datasets (beta)` removed
- **2026-10-13** `029668894d33`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/riveterhq/apis/riveter-api/changes/datasets/:id/rows/post.md)

---

[API](https://skmtc.dev/riveterhq/apis/riveter-api.md) - [All operations](https://skmtc.dev/riveterhq/apis/riveter-api/llms.txt) - [OpenAPI document](https://skmtc.dev/riveterhq/apis/riveter-api/revisions/fac56b649559?raw)
