Accessing Data outside of LNT: REST API¶
LNT provides comprehensive REST APIs to access and manage data stored in the LNT database.
Quick Reference¶
Complete Endpoint Summary¶
Method |
Endpoint |
Authentication Required |
|---|---|---|
GET |
/fields |
No |
GET |
/tests |
No |
GET |
/schema |
No |
POST |
/schema |
Yes |
GET |
/machines |
No |
GET |
/machines/<machine_spec> |
No |
PUT |
/machines/<machine_spec> |
Yes |
POST |
/machines/<machine_spec> |
Yes |
DELETE |
/machines/<machine_spec> |
Yes |
GET |
/runs/<run_id> |
No |
POST |
/runs |
Yes |
DELETE |
/runs/<run_id> |
Yes |
GET |
/samples |
No |
GET |
/samples/<sample_id> |
No |
GET |
/orders/<order_id> |
No |
GET |
/graph/<machine_id>/<test_id>/<field_index> |
No |
GET |
/regression/<machine_id>/<test_id>/<field_index> |
No |
All endpoints are prefixed with: /api/db_<database>/v4/<testsuite>
Overview¶
The REST API provides programmatic access to:
Test suites - Schema definitions and test metadata
Machines - Test execution machines and their configurations
Runs - Test execution results and submission
Samples - Individual test measurements and metrics
Orders - Ordering information for test runs
Regressions - Performance regression data
Graphs - Historical performance data for visualization
All API endpoints follow the pattern:
http://<server>/api/db_<database>/v4/<testsuite>/<resource>
For example:
http://lnt.llvm.org/api/db_default/v4/nts/machines/1330
Response Format¶
All API responses are JSON formatted and include common metadata fields:
generated_by- LNT server version that generated the response
Example response structure:
{
"generated_by": "LNT Server <version>",
"machines": [...],
"runs": [...]
}
All responses include CORS headers (Access-Control-Allow-Origin: *) to support cross-origin requests.
Authentication¶
Read Operations: All GET requests are unauthenticated and publicly accessible.
Write Operations: POST, PUT, and DELETE requests require authentication via an AuthToken HTTP header.
To enable authentication, add the api_auth_token setting to your instance’s lnt.cfg configuration file:
# API Auth Token
api_auth_token = "SomeSecret"
Include this token in the request header:
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/runs/1
Without a valid token, write operations will return HTTP 401 Unauthorized.
Error Handling¶
HTTP Status Codes¶
The API uses standard HTTP status codes:
200 OK - Successful GET request
201 Created - Successful POST request (e.g. schema creation)
301 Moved Permanently - Successful run submission with redirect to the created resource
400 Bad Request - Invalid request data or parameters
401 Unauthorized - Missing or invalid authentication token
404 Not Found - Requested resource does not exist
415 Unsupported Media Type - Invalid Content-Type header
Error Response Format¶
Error responses include a descriptive message:
{
"msg": "Auth Token must be passed in AuthToken header, and included in LNT config.",
"status": 401
}
API Endpoints¶
Test Suite Metadata¶
Fields¶
GET /api/db_<database>/v4/<testsuite>/fields
Lists all sample fields (metrics) defined in the test suite.
Response:
{
"generated_by": "LNT Server <version>",
"fields": [
{
"column_id": 0,
"column_name": "compile_time",
"column_type": "REAL"
},
{
"column_id": 1,
"column_name": "execution_time",
"column_type": "REAL"
}
]
}
Tests¶
GET /api/db_<database>/v4/<testsuite>/tests
Lists all tests registered in the test suite.
Response:
{
"generated_by": "LNT Server <version>",
"tests": [
{
"id": 1,
"name": "test.compile.time"
},
{
"id": 2,
"name": "test.execution.time"
}
]
}
Schema¶
GET /api/db_<database>/v4/<testsuite>/schema
Returns the complete test suite schema definition.
Response: The full schema object in JSON format.
POST /api/db_<database>/v4/<testsuite>/schema
Creates or updates a test suite schema. Requires authentication.
Headers:
AuthToken: <token>(required)Content-Type: application/x-yaml(required)
Request Body: YAML schema definition (see schemas/ directory for examples)
Example:
curl --request POST \
--header "AuthToken: SomeSecret" \
--header "Content-Type: application/x-yaml" \
--data-binary @my_suite.yaml \
http://localhost:8000/api/db_default/v4/my_suite/schema
Response (201 Created):
{
"generated_by": "LNT Server <version>",
"testsuite": "my_suite",
"schema": {}
}
Error Responses:
400 Bad Request - Invalid YAML, missing required fields, or schema validation errors
401 Unauthorized - Missing or invalid AuthToken
415 Unsupported Media Type - Content-Type is not application/x-yaml
Machines¶
List Machines¶
GET /api/db_<database>/v4/<testsuite>/machines
Lists all machines registered in the test suite.
Response:
{
"generated_by": "LNT Server <version>",
"machines": [
{
"id": 1,
"name": "machine1",
"info": {}
}
]
}
Machine Details¶
GET /api/db_<database>/v4/<testsuite>/machines/<machine_spec>
Retrieves detailed information about a specific machine and all runs executed on it.
Parameters:
machine_spec- Machine ID (numeric) or machine name (string)
Response:
{
"generated_by": "LNT Server <version>",
"machine": {
"id": 1,
"name": "machine1",
"info": {}
},
"runs": [
{
"id": 101,
"machine_id": 1,
"order": {},
"start_time": "2026-01-15T10:30:00"
}
]
}
Error Responses:
404 Not Found - Machine not found or ambiguous name (use ID instead)
Delete Machine¶
DELETE /api/db_<database>/v4/<testsuite>/machines/<machine_spec>
Deletes a machine and all associated runs. Requires authentication.
Headers:
AuthToken: <token>(required)
Response: Streaming text response showing deletion progress
Example:
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/machines/1
Update Machine¶
PUT /api/db_<database>/v4/<testsuite>/machines/<machine_spec>
Updates machine information. Requires authentication.
Headers:
AuthToken: <token>(required)Content-Type: application/json(required)
Request Body:
{
"machine": {
"name": "new_name",
"info": {}
}
}
Machine Operations¶
POST /api/db_<database>/v4/<testsuite>/machines/<machine_spec>
Performs special operations on machines. Requires authentication.
Headers:
AuthToken: <token>(required)
Rename Machine:
curl --request POST \
--header "AuthToken: SomeSecret" \
--data "action=rename&name=new_machine_name" \
http://localhost:8000/api/db_default/v4/nts/machines/1
Merge Machines:
Merges all runs from one machine into another, then deletes the source machine.
curl --request POST \
--header "AuthToken: SomeSecret" \
--data "action=merge&into=2" \
http://localhost:8000/api/db_default/v4/nts/machines/1
Error Responses:
400 Bad Request - Missing action parameter, invalid action, or operation-specific errors
401 Unauthorized - Missing or invalid AuthToken
Runs¶
Get Run¶
GET /api/db_<database>/v4/<testsuite>/runs/<run_id>
Retrieves complete information about a specific run, including all sample data.
Response:
{
"generated_by": "LNT Server <version>",
"run": {
"id": 101,
"machine_id": 1,
"order_id": 50,
"start_time": "2026-01-15T10:30:00",
"end_time": "2026-01-15T11:30:00"
},
"machine": {
"id": 1,
"name": "machine1"
},
"tests": [
{
"id": 1001,
"run_id": 101,
"name": "test.compile.time",
"compile_time": 1.23,
"execution_time": 0.45
}
]
}
Error Responses:
404 Not Found - Run not found
Delete Run¶
DELETE /api/db_<database>/v4/<testsuite>/runs/<run_id>
Deletes a specific run and all associated sample data. Requires authentication.
Headers:
AuthToken: <token>(required)
Example:
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/runs/101
Submit Run¶
POST /api/db_<database>/v4/<testsuite>/runs
Submits new test run data to the database. Requires authentication.
Headers:
AuthToken: <token>(required)Content-Type: application/json(required)
Query Parameters:
select_machine- Machine selection strategy (default: “match”)merge- Run ID to merge with (optional)ignore_regressions- Skip regression detection (optional, boolean)
Request Body: JSON or Property List formatted run data (see Importing Data for format)
Response (301 Moved Permanently):
{
"success": true,
"run_id": 102,
"result_url": "http://localhost:8000/api/db_default/v4/nts/runs/102"
}
Error Responses:
400 Bad Request - Invalid data format or submission rejected
401 Unauthorized - Missing or invalid AuthToken
Samples¶
Get Sample¶
GET /api/db_<database>/v4/<testsuite>/samples/<sample_id>
Retrieves a specific sample’s data.
Response:
{
"generated_by": "LNT Server <version>",
"samples": [
{
"id": 1001,
"run_id": 101,
"test_id": 1,
"compile_time": 1.23,
"execution_time": 0.45
}
]
}
Query Samples¶
GET /api/db_<database>/v4/<testsuite>/samples?runid=<id>&runid=<id>...
Retrieves sample data for multiple runs. Useful for bulk data export.
Query Parameters:
runid- Run ID (can be specified multiple times)
Example:
curl "http://localhost:8000/api/db_default/v4/nts/samples?runid=101&runid=102&runid=103"
Response:
{
"generated_by": "LNT Server <version>",
"samples": [
{
"id": 1001,
"run_id": 101,
"name": "test.compile.time",
"llvm_project_revision": "abc123",
"compile_time": 1.23
},
{
"id": 1002,
"run_id": 102,
"name": "test.compile.time",
"llvm_project_revision": "def456",
"compile_time": 1.25
}
]
}
Empty samples (all fields are null) are omitted from results.
Error Responses:
400 Bad Request - No runid parameters provided
Orders¶
Get Order¶
GET /api/db_<database>/v4/<testsuite>/orders/<order_id>
Retrieves order information (version/revision tracking).
Response:
{
"generated_by": "LNT Server <version>",
"orders": [
{
"id": 50,
"llvm_project_revision": "abc123",
"previous_order_id": 49
}
]
}
Graphs and Regressions¶
Graph Data¶
GET /api/db_<database>/v4/<testsuite>/graph/<machine_id>/<test_id>/<field_index>
Retrieves time-series data for graphing a specific metric on a machine/test combination.
Query Parameters:
limit- Maximum number of data points to return (optional)
Response:
[
[
"abc123",
1.23,
{
"label": "abc123",
"date": "2026-01-15 10:30:00",
"runID": "101"
}
],
[
"def456",
1.25,
{
"label": "def456",
"date": "2026-01-16 10:30:00",
"runID": "102"
}
]
]
Each data point is an array: [revision, value, metadata]
Regression Data¶
GET /api/db_<database>/v4/<testsuite>/regression/<machine_id>/<test_id>/<field_index>
Retrieves regression information for a specific metric on a machine/test combination.
Response:
[
{
"id": 1,
"title": "Performance regression in test.compile.time",
"state": "active",
"end_point": ["def456", 1.35]
}
]
Error Responses:
404 Not Found - Invalid machine, test, or field
Usage Examples¶
List all machines:
curl http://localhost:8000/api/db_default/v4/nts/machines
Get run details:
curl http://localhost:8000/api/db_default/v4/nts/runs/101
Delete a run:
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/runs/101
Bulk sample export:
curl "http://localhost:8000/api/db_default/v4/nts/samples?runid=101&runid=102&runid=103" \
| python -m json.tool