Push rows of your own data into one data source.
POST/api/v1/data-sources/:id/ingest
Send up to 1000 tidy rows in one request. Each row is one metric, one time bucket, one number. Rows land on the tenant that owns the API key: a tenant_id in the body is ignored, because the request schema has no such field.
TWO CREDENTIALS, BOTH REQUIRED. Authorization: Bearer <api key> with the write_data scope names the account. X-Ingest-Secret names the data source; it is shown once when the source is created and once when the secret is rotated. Neither credential works alone.
Re-sending a row that already landed updates it in place, so a replay is always safe. A row is unique on (data source, metric_key, bucket_ts, dimension).
Rows are validated one at a time. One bad row does not throw away the rest: the response names every rejected row by its index in your rows array, with a reason.
ONE DATA SOURCE TRACKS 200 METRIC NAMES. Past that, rows carrying a new metric_key are still stored, but that metric gets no entry in the chart gallery, so no chart appears for it. When a request crosses the limit the response carries a metric_key_limit warning naming what was dropped, and the data source shows the same sentence in Settings > Integrations. Send additional metrics to a second data source. Scope: write_data.
Request
Responses
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
- 500
At least one row landed. accepted counts the rows written, rejected names the ones that did not, by index. A warnings array appears only when something non-fatal happened, such as the data source reaching its 200 metric-name limit; the rows still landed.
The request envelope is wrong: the body is not JSON, there is no rows array, rows is empty, or it carries more than 1000 rows. Nothing was written.
Invalid or missing API key
Either the API key does not carry the write_data scope, or the X-Ingest-Secret header is missing or does not match this data source. Nothing was written.
Resource not found or belongs to another account
The data source is paused. Resume it in Settings > Integrations and retry. Nothing was written.
Every row was rejected. Same body shape as a 200, with accepted at 0 and a reason per row. The data source is marked as failing until a later request lands rows.
Rate limit exceeded
Response Headers
The rows validated but could not be stored. Send the same batch again: rows that already landed are updated in place, so a replay never duplicates.