Skip to content

Upload one ECG data frame

POST
/v3/streams/{stream_id}/frames
curl --request POST \
--url 'https://api.cardio.ai/v3/streams/1/frames?timestamp=1' \
--header 'Content-Type: application/octet-stream' \
--header 'X-Api-Token: <X-Api-Token>' \
--data binary

Appends a single compressed data frame to an already started ECG stream.

Frames may arrive out of order. The timestamp query parameter, measured in microseconds from stream start, is treated as the primary key. If a frame with the same timestamp already exists, the call returns 409 Conflict.

The frame must use the same frame_format, sample_rate, and lead/channel order that were specified when the stream was started with /v3/streams/start.

stream_id
required
integer format: int64
>= 1

Stream identifier.

timestamp
required
integer format: int64

Frame start time in microseconds from stream start.

COMPRESSED_DELTA frame payload.

Media typeapplication/octet-stream
string format: binary

Operation completed successfully.

Bad Request - missing or invalid parameters.

Media typeapplication/json

Error payload carried by every non-2xx response.

object
message
required

Human-readable description of the failure. The wording is not part of the API contract; do not match on it programmatically.

string
reason

Stable machine-readable failure code in snake_case, e.g. “api_token_missing” or “invalid_task_id”. Omitted for 500 responses.

string
Examplegenerated
{
"message": "example",
"reason": "example"
}

Unauthorized - missing, expired, or invalid token.

Media typeapplication/json

Error payload carried by every non-2xx response.

object
message
required

Human-readable description of the failure. The wording is not part of the API contract; do not match on it programmatically.

string
reason

Stable machine-readable failure code in snake_case, e.g. “api_token_missing” or “invalid_task_id”. Omitted for 500 responses.

string
Examplegenerated
{
"message": "example",
"reason": "example"
}

Forbidden - the provided token is not authorized to call this endpoint.

Media typeapplication/json

Error payload carried by every non-2xx response.

object
message
required

Human-readable description of the failure. The wording is not part of the API contract; do not match on it programmatically.

string
reason

Stable machine-readable failure code in snake_case, e.g. “api_token_missing” or “invalid_task_id”. Omitted for 500 responses.

string
Examplegenerated
{
"message": "example",
"reason": "example"
}

Not Found - requested resource does not exist or is unavailable.

Media typeapplication/json

Error payload carried by every non-2xx response.

object
message
required

Human-readable description of the failure. The wording is not part of the API contract; do not match on it programmatically.

string
reason

Stable machine-readable failure code in snake_case, e.g. “api_token_missing” or “invalid_task_id”. Omitted for 500 responses.

string
Examplegenerated
{
"message": "example",
"reason": "example"
}

Conflict - current resource state does not allow the operation.

Media typeapplication/json

Error payload carried by every non-2xx response.

object
message
required

Human-readable description of the failure. The wording is not part of the API contract; do not match on it programmatically.

string
reason

Stable machine-readable failure code in snake_case, e.g. “api_token_missing” or “invalid_task_id”. Omitted for 500 responses.

string
Examplegenerated
{
"message": "example",
"reason": "example"
}

Too Many Requests - rate limit exceeded.

Media typeapplication/json

Error payload carried by every non-2xx response.

object
message
required

Human-readable description of the failure. The wording is not part of the API contract; do not match on it programmatically.

string
reason

Stable machine-readable failure code in snake_case, e.g. “api_token_missing” or “invalid_task_id”. Omitted for 500 responses.

string
Examplegenerated
{
"message": "example",
"reason": "example"
}