Skip to content
Roboto
Esc
↑↓navigate↵open⌘Jpreview

Publish metrics

Record many metric values against one session in a single call.

Answers 201 once the request has been processed, even when the platform refused every value: the response carries one element per submitted metric, in request order, holding either the metric it recorded or the error that refused it. A caller on an API version before 2026-10-05 gets the older shape instead, a succeeded list of stored records beside a failed list of named errors.

Three cases are settled before anything is recorded: a session that does not exist in this org answers 404, a malformed request answers 400, and so does one that omits device_id for a session without exactly one device attached, since there is then no single attached device to record the values against.

A publication that runs out of time answers 504, under RobotoServiceTimeoutException when the invocation’s own deadline expired and RobotoOperationTimeoutException when a statement’s budget did. Either one rolls the publication back, the definitions it created along with the values.

Access control

  • requires_resource_owner
  • Restricted tokens need the API scope api.everything_else
POST/v1/metrics
Authorization
AuthorizationBearer token · headerrequired
Header parameters
X-Roboto-Org-Idstring
X-Roboto-User-Idstring
Request body
requiredapplication/json
session_idstringrequired
device_idstring | null
Show properties
Any of:
null
null
string
string
null
null
metricsMetricEntry[]required
Show properties
Array of MetricEntry
namestringrequired
valuenumberrequired
Responses
201

CREATED

dataobjectrequired
Show properties
responsesBatchResponseElement_MetricRecord_[]required
Show properties
Array of BatchResponseElement_MetricRecord_
dataMetricRecord | null
default: null
Show properties
Any of:
MetricRecord
org_idstringrequired
metric_idstringrequired
namestringrequired
session_idstringrequired
min_timestamp_nsinteger | null
default: null
Show properties
Any of:
integer
integer
null
null
max_timestamp_nsinteger | null
default: null
Show properties
Any of:
integer
integer
null
null
valuenumberrequired
unitstring | null
default: null
Show properties
Any of:
string
string
null
null
device_idstring | null
default: null
Show properties
Any of:
string
string
null
null
invocation_idstring | null
default: null
Show properties
Any of:
string
string
null
null
group_keystring | null
default: null
Show properties
Any of:
string
string
null
null
published_bystringrequired
publishedstring<date-time>required
null
null
errorany
default: null
400

Thrown when the conversation context (messages, system prompt, tool results) exceeds the model's context window limit.

The token estimate and the model's context limit are not carried on the exception, so a caller cannot read usage numbers off it.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
401

Thrown when authentication fails

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
403

Thrown if an operation would exceed a user or org level limit.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
404

Thrown if a user is attempting to perform an action unrecognized by the Roboto platform.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
409

Thrown if there is a conflict between a resource you're creating and another existing resource

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
410

Thrown if a resource is missing or expired.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
500

An error the platform reported that this SDK release cannot resolve to a specific exception class.

Reported for an element of a :py:class:~roboto.http.BatchResponse whose error names a code this release defines no class for, or that arrived without a code, without a message, or as text that is not an error envelope at all. It carries whatever code and message the platform sent, so a caller handling the failure still learns what went wrong; when no message could be read, the message is the error's raw text.

The error envelope carries no status code, so http_status_code reports the 500 inherited from :py:class:RobotoDomainException rather than the status the failure actually had.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
501

Thrown by shimmed out APIs which have not yet been implemented

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
503

Thrown when a service is unavailable, such as when it's under heavy load and can't accept new requests. This is expected to be transient and ought to be retried.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
504

Thrown when the service times out while processing a request. This is exepcted to be transient and ought to be retried.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
507

Thrown when the server cannot complete the request because the response payload exceeds a storage or transport capacity limit (e.g., Lambda response size). This is NOT expected to be transient and should NOT be retried.

errorobject
Show properties
error_codenumber
messagestring
stack_tracestring | null
Try it
Server
Authorization
Parameters
Bodyapplication/json
Request
curl -X POST 'https://api.roboto.ai/v1/metrics' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "session_id": "string",
  "device_id": {},
  "metrics": [
    {
      "name": "string",
      "value": 0
    }
  ]
}'
Response
{
  "data": {
    "responses": [
      {
        "data": null,
        "error": null
      }
    ]
  }
}