---
title: "Append rows to a dataset; bad rows are reported by number."
method: POST
path: "/v1/datasets/{id}/rows"
---

# Append rows to a dataset; bad rows are reported by number.

`POST /v1/datasets/{id}/rows`

## Request

- Base URL: `http://127.0.0.1:10108`
- URL: `http://127.0.0.1:10108/v1/datasets/{id}/rows`
- Auth: HTTP bearer

Appends up to 5000 rows to the dataset; existing rows are kept. Rows that do not fit the columns are skipped and reported by number.

## Path parameters

- `id` string, required

## Request body

- object
  - `rows` object[], required: One object per row, keyed by column name; every value must be a string — convert numbers and dates to text before sending

## Response `200`

How many rows were appended, and the numbers of the rows refused.

- object
  - `imported` integer, required
  - `rejected` object[], required
    - `lineNo` integer, required
    - `reason` 'fieldCount' | 'unclosedQuote' | 'unknownColumn' | 'emptyRow', required

## Other responses

- `400`: The id is not a uuid, the body is not `{rows: object[]}`, or more than 5000 rows.
- `401`: No bearer token, or not a token this app issued. The body is empty: it never says which.
- `403`: Refused by the plan: it no longer includes the local API (checked on every request), or it does not allow this action (profile or schedule limit, parallel runs). A request whose Host header is not loopback is also 403, with an empty body.
- `404`: No dataset with this id.
- `500`: Veilus failed: storage could not be read or written, or a task panicked. The message says what failed; retrying rarely helps.

---

[API](https://skmtc.dev/veilus/apis/veilus-local-api.md) · [All operations](https://skmtc.dev/veilus/apis/veilus-local-api/llms.txt) · [OpenAPI document](https://skmtc.dev/veilus/apis/veilus-local-api/revisions/67ac3818f9d2?raw)
