openapi: 3.0.1 info: title: Hamming AI REST API description: >- REST API for the Hamming AI testing, evaluation, and observability platform for voice and LLM AI agents. Covers experiments and test runs, voice/call testing, datasets, custom scorers, monitoring/tracing ingestion, and the prompt registry. Endpoints and request shapes are derived from Hamming's public documentation (docs.hamming.ai) and the official open-source SDKs (github.com/HammingHQ/evals-py, evals-ts). Authentication uses a Bearer API key created at hamming.ai/settings. termsOfService: https://hamming.ai/terms contact: name: Hamming AI url: https://hamming.ai version: '1.0' servers: - url: https://app.hamming.ai/api/rest description: Hamming REST API base URL security: - bearerAuth: [] tags: - name: Experiments description: Create and run experiments and experiment items. - name: Voice Testing description: Run voice agents against datasets and retrieve experiment calls. - name: Datasets description: Manage datasets of test cases and scenarios. - name: Scoring description: Register custom scoring functions. - name: Monitoring description: Ingest traces, logs, and production call logs. - name: Prompts description: List and fetch versioned prompts from the registry. paths: /experiments: post: operationId: createExperiment tags: - Experiments summary: Create an experiment description: Creates a new experiment (evaluation run) bound to a dataset. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateExperimentRequest' responses: '200': description: The created experiment. content: application/json: schema: $ref: '#/components/schemas/Experiment' '401': $ref: '#/components/responses/Unauthorized' /experiments/{experimentId}: patch: operationId: updateExperiment tags: - Experiments summary: Update an experiment description: Updates an experiment, for example to set its terminal status. parameters: - $ref: '#/components/parameters/ExperimentId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateExperimentRequest' responses: '200': description: The updated experiment. content: application/json: schema: $ref: '#/components/schemas/Experiment' '401': $ref: '#/components/responses/Unauthorized' /experiments/{experimentId}/items: post: operationId: startExperimentItem tags: - Experiments summary: Start an experiment item description: >- Starts an experiment item for a single dataset item, capturing the input and any associated metadata. parameters: - $ref: '#/components/parameters/ExperimentId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/StartExperimentItemRequest' responses: '200': description: The started experiment item. content: application/json: schema: $ref: '#/components/schemas/ExperimentItem' '401': $ref: '#/components/responses/Unauthorized' /experiments/{experimentId}/items/{itemId}: patch: operationId: endExperimentItem tags: - Experiments summary: End an experiment item description: >- Ends an experiment item, recording the produced output, scores, and status. parameters: - $ref: '#/components/parameters/ExperimentId' - name: itemId in: path required: true description: The experiment item identifier. schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EndExperimentItemRequest' responses: '200': description: The updated experiment item. content: application/json: schema: $ref: '#/components/schemas/ExperimentItem' '401': $ref: '#/components/responses/Unauthorized' /voice-agent/{agentId}/run: post: operationId: runVoiceAgent tags: - Voice Testing summary: Run a voice agent against a dataset description: >- Starts a voice experiment by placing simulated outbound calls from the specified voice agent against the scenarios in a dataset, returning the identifier of the created voice experiment. parameters: - name: agentId in: path required: true description: The voice agent identifier. schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RunVoiceAgentRequest' responses: '200': description: The created voice experiment. content: application/json: schema: $ref: '#/components/schemas/RunVoiceAgentResponse' '401': $ref: '#/components/responses/Unauthorized' /voice-experiment/{voiceExperimentId}/calls: get: operationId: getVoiceExperimentCalls tags: - Voice Testing summary: Get voice experiment calls description: >- Returns the array of calls that were run as part of a voice experiment, each including its scoring status. parameters: - name: voiceExperimentId in: path required: true description: The voice experiment identifier. schema: type: string responses: '200': description: The calls in the voice experiment. content: application/json: schema: type: array items: $ref: '#/components/schemas/VoiceCall' '401': $ref: '#/components/responses/Unauthorized' /test-runs/create-livekit-rooms: post: operationId: createLivekitRooms tags: - Voice Testing summary: Create LiveKit rooms for a test run description: >- Creates LiveKit rooms for a direct agent-to-agent test run without traditional telephony, returning an experiment identifier and per-item room connection details. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateLivekitRoomsRequest' responses: '200': description: The created experiment and room details. content: application/json: schema: $ref: '#/components/schemas/CreateLivekitRoomsResponse' '401': $ref: '#/components/responses/Unauthorized' /datasets: get: operationId: listDatasets tags: - Datasets summary: List datasets description: Lists the datasets available to the account. responses: '200': description: An array of datasets. content: application/json: schema: type: array items: $ref: '#/components/schemas/Dataset' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createDataset tags: - Datasets summary: Create a dataset description: Creates a new dataset of test cases or scenarios. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateDatasetRequest' responses: '200': description: The created dataset. content: application/json: schema: $ref: '#/components/schemas/Dataset' '401': $ref: '#/components/responses/Unauthorized' /datasets/{datasetId}: get: operationId: getDataset tags: - Datasets summary: Load a dataset description: Loads a dataset together with its items. parameters: - name: datasetId in: path required: true description: The dataset identifier. schema: type: string responses: '200': description: The dataset with its items. content: application/json: schema: $ref: '#/components/schemas/DatasetWithItems' '401': $ref: '#/components/responses/Unauthorized' /scoring/register-functions: post: operationId: registerScoringFunctions tags: - Scoring summary: Register custom scoring functions description: >- Registers one or more custom scoring functions used to score experiment results. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RegisterScoringFunctionsRequest' responses: '200': description: The registered scoring configuration. content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /traces: post: operationId: ingestTraces tags: - Monitoring summary: Ingest traces description: >- Ingests a batch of trace events (generations, retrievals, spans) from instrumented experiment or monitoring sessions. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/IngestTracesRequest' responses: '200': description: Traces accepted. content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /logs: post: operationId: ingestLogs tags: - Monitoring summary: Ingest logs description: Ingests a batch of log messages from monitored agents. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/IngestLogsRequest' responses: '200': description: Logs accepted. content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /v2/call-logs: post: operationId: ingestCallLog tags: - Monitoring summary: Ingest a production call log description: >- Forwards a production voice call log (for example a provider call-ended event payload) to Hamming for monitoring and scoring against real customer calls. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CallLogRequest' responses: '200': description: Call log accepted. content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' /prompts: get: operationId: listPrompts tags: - Prompts summary: List prompts description: Lists prompts in the registry, optionally filtered by label. parameters: - name: label in: query required: false description: Filter prompts by label. schema: type: string responses: '200': description: An array of prompts. content: application/json: schema: type: array items: $ref: '#/components/schemas/Prompt' '401': $ref: '#/components/responses/Unauthorized' /prompts/{slug}: get: operationId: getPrompt tags: - Prompts summary: Get a prompt description: >- Fetches a single prompt by slug, optionally pinned to a label or version. parameters: - name: slug in: path required: true description: The prompt slug. schema: type: string - name: label in: query required: false description: Fetch the prompt version associated with this label. schema: type: string - name: version in: query required: false description: Fetch a specific prompt version. schema: type: string responses: '200': description: The prompt content. content: application/json: schema: $ref: '#/components/schemas/Prompt' '401': $ref: '#/components/responses/Unauthorized' components: securitySchemes: bearerAuth: type: http scheme: bearer description: >- A Hamming API key passed as a Bearer token in the Authorization header. Create a key at hamming.ai/settings. parameters: ExperimentId: name: experimentId in: path required: true description: The experiment identifier. schema: type: string responses: Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: Error: type: object properties: error: type: string description: A human-readable error message. CreateExperimentRequest: type: object required: - name - datasetId properties: name: type: string description: A name for the experiment. datasetId: type: string description: The dataset the experiment runs over. dataset: type: string description: Alias accepted for the dataset identifier. metadata: type: object additionalProperties: true description: Arbitrary metadata to attach to the experiment. UpdateExperimentRequest: type: object properties: status: type: string description: The experiment status, e.g. RUNNING, FINISHED, FAILED. Experiment: type: object properties: id: type: string name: type: string datasetId: type: string status: type: string createdAt: type: string format: date-time StartExperimentItemRequest: type: object required: - datasetItemId properties: datasetItemId: type: string description: The dataset item this experiment item evaluates. input: type: object additionalProperties: true description: The input provided to the runner. metadata: type: object additionalProperties: true EndExperimentItemRequest: type: object properties: output: type: object additionalProperties: true description: The output produced by the runner. scores: type: object additionalProperties: true description: A map of score name to score value. status: type: string description: Terminal status of the item, e.g. FINISHED or FAILED. ExperimentItem: type: object properties: id: type: string experimentId: type: string datasetItemId: type: string status: type: string output: type: object additionalProperties: true scores: type: object additionalProperties: true RunVoiceAgentRequest: type: object required: - dataset_id properties: dataset_id: type: string description: The dataset of scenarios to run the agent against. to_number: type: string description: The phone number to place the simulated outbound call to. RunVoiceAgentResponse: type: object properties: voice_experiment_id: type: string description: The identifier of the created voice experiment. VoiceCall: type: object properties: id: type: string status: type: string description: Call status. scoring_status: type: string description: Scoring status of the call. recording_url: type: string transcript: type: string CreateLivekitRoomsRequest: type: object required: - datasetId properties: datasetId: type: string description: The dataset to create rooms for. datasetItemIds: type: array description: Optional subset of dataset item identifiers to create rooms for. items: type: string CreateLivekitRoomsResponse: type: object properties: experimentId: type: string rooms: type: array items: type: object properties: roomName: type: string url: type: string datasetItemId: type: string token: type: string CreateDatasetRequest: type: object required: - name properties: name: type: string description: The dataset name. items: type: array description: Optional initial dataset items. items: $ref: '#/components/schemas/DatasetItem' Dataset: type: object properties: id: type: string name: type: string createdAt: type: string format: date-time DatasetItem: type: object properties: id: type: string input: type: object additionalProperties: true output: type: object additionalProperties: true metadata: type: object additionalProperties: true DatasetWithItems: allOf: - $ref: '#/components/schemas/Dataset' - type: object properties: items: type: array items: $ref: '#/components/schemas/DatasetItem' RegisterScoringFunctionsRequest: type: object required: - scoring properties: scoring: type: array description: The custom scoring function definitions to register. items: type: object properties: name: type: string type: type: string IngestTracesRequest: type: object required: - traces properties: traces: type: array items: type: object additionalProperties: true IngestLogsRequest: type: object required: - logs properties: logs: type: array items: type: object additionalProperties: true CallLogRequest: type: object description: >- A production call log payload. Hamming accepts provider call-ended event payloads (for example from Retell) for monitoring. additionalProperties: true Prompt: type: object properties: slug: type: string label: type: string version: type: string content: type: string description: The prompt content.