Menu
Grafana Cloud

Tests REST API

List all tests

GET /cloud/v6/load_tests

List all available tests.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
$countInclude collection length in the response object as @count.queryfalseboolean
$orderby

Comma-separated list of fields to use when ordering the results. Available fields:

  • id
  • project_id
  • name
  • created
  • updated

The default ascending order can be reversed by appending the desc specifier.

queryfalsestring
$skipThe initial index from which to return the results.queryfalseinteger
$topNumber of results to return per page.
Default: 1000
Maximum: 1000
queryfalseinteger

200 response

OK.

Content type: application/json

LoadTestListResponse properties:

NameDescriptionRequiredType
@countObject count in the collection.falseinteger
@nextLinkA reference to the next page of results. The property is included until there are no more pages of results to retrieve.falsestring , format: uri
valueList of the resulting values.trueArray[LoadTestApiModel]

LoadTestApiModel properties:

NameDescriptionRequiredType
baseline_test_run_idID of a baseline test run used for results comparison.trueinteger | null
createdThe date when the test was created.truestring , format: date-time
idID of the load test.trueinteger
nameUnique name of the test within the project.truestring
project_idID of the parent project.trueinteger
updatedThe date when the test was last updated.truestring , format: date-time
OK example
{
  "@count": 123,
  "@nextLink": "https://api.k6.io/cloud/v6/load_tests?$skip=50\u0026$top=20",
  "value": [
    {
      "baseline_test_run_id": null,
      "created": "2024-12-03T09:53:00.553",
      "id": 1234,
      "name": "Orders API Soak Test",
      "project_id": 312,
      "updated": "2024-12-03T09:53:00.553"
    }
  ]
}

400 response

401 response

403 response

500 response

Delete a load test

DELETE /cloud/v6/load_tests/{id}

Delete a load test.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the load test.pathtrueinteger

204 response

OK.

401 response

403 response

404 response

409 response

Cannot delete test while it’s running.

Content type: application/json

ErrorResponseApiModel properties:

NameDescriptionRequiredType
errortrueErrorApiModel

Details of the error.

ErrorApiModel properties:

NameDescriptionRequiredType
codeService-defined error code.truestring
detailsArray of objects with more specific error information when applicable.falsearray | null
messageHuman-readable string describing the error.truestring
targetA string indicating the target of the error. For example, the name of the property in error.falsestring | null

500 response

Get a load test by ID

GET /cloud/v6/load_tests/{id}

Fetch a single load test.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the load test.pathtrueinteger

200 response

OK.

Content type: application/json

LoadTestApiModel properties:

NameDescriptionRequiredType
baseline_test_run_idID of a baseline test run used for results comparison.trueinteger | null
createdThe date when the test was created.truestring , format: date-time
idID of the load test.trueinteger
nameUnique name of the test within the project.truestring
project_idID of the parent project.trueinteger
updatedThe date when the test was last updated.truestring , format: date-time
OK example
{
  "baseline_test_run_id": null,
  "created": "2024-12-03T09:53:00.553",
  "id": 1234,
  "name": "Orders API Soak Test",
  "project_id": 312,
  "updated": "2024-12-03T09:53:00.553"
}

401 response

403 response

404 response

500 response

Update a load test

PATCH /cloud/v6/load_tests/{id}

Update a load test.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the load test.pathtrueinteger

Request body

Content type: application/json

PatchLoadTestApiModel properties:

NameDescriptionRequiredType
baseline_test_run_idID of a baseline test run used for results comparison.falseinteger | null
nameUnique name of the test within the project.falsestring
Update example
{
  "baseline_test_run_id": 123,
  "name": "New Test Name"
}

204 response

OK.

400 response

401 response

403 response

404 response

409 response

The name is already taken.

Content type: application/json

ErrorResponseApiModel properties:

NameDescriptionRequiredType
errortrueErrorApiModel

Details of the error.

ErrorApiModel properties:

NameDescriptionRequiredType
codeService-defined error code.truestring
detailsArray of objects with more specific error information when applicable.falsearray | null
messageHuman-readable string describing the error.truestring
targetA string indicating the target of the error. For example, the name of the property in error.falsestring | null

500 response

Download the test script

GET /cloud/v6/load_tests/{id}/script

Download the test script.

The script can be either in the form of a single JavaScript file or a k6 .tar archive - the type is identified by the request content type.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the load test.pathtrueinteger

200 response

OK.

Content type: application/x-tar
K6ArchiveScript example
(.tar data)
Content type: text/javascript
TextScript example
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  vus: 10,
  duration: '30s',
  cloud: {
    // Project: Default project
    projectID: 3684621,
    // Test runs with the same name groups test runs together.
    name: 'Test (04/12/2024-20:28:06)'
  }
};

export default function() {
  http.get('https://test.k6.io');
  sleep(1);
}

401 response

403 response

404 response

500 response

Upload the script for a test

PUT /cloud/v6/load_tests/{id}/script

Upload the script for a test.

The script can be either in the form of a single JavaScript text file or a k6 .tar archive - the type is auto-detected by the API. Any received payload that is not a .tar archive is assumed to be a JavaScript file.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the load test.pathtrueinteger

Request body

Content type: application/octet-stream
K6ArchiveScript example
(.tar data)
TextScript example
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  vus: 10,
  duration: '30s',
  cloud: {
    // Project: Default project
    projectID: 3684621,
    // Test runs with the same name groups test runs together.
    name: 'Test (04/12/2024-20:28:06)'
  }
};

export default function() {
  http.get('https://test.k6.io');
  sleep(1);
}

204 response

OK.

400 response

401 response

403 response

404 response

500 response

Start a test in Grafana Cloud

POST /cloud/v6/load_tests/{id}/start

Start a test in Grafana Cloud.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the load test.pathtrueinteger

200 response

OK.

Content type: application/json

The API model for a test run.

TestRunApiModel properties:

NameDescriptionRequiredType
cost

Test run cost details. The cost is available only after test run validation.

  • For test runs still in progress, the value is an estimate of the full cost that will be charged upon successful completion.
  • For finished test runs, the value is the real cost charged for the test run.
trueTestCostApiModel | null
createdDate and time when the test run was started.truestring , format: date-time
distributionList of the load zones configured for the test and the corresponding distribution percentages.truearray | null
endedDate and time when the test run ended. Unset if the test is still running.truestring | null , format: date-time
idID of the test run.trueinteger
noteUser-defined note for the test run.truestring
optionsThe original options object if available.trueobject | null
project_idID of the parent project.trueinteger
resultTest run result. passed if there were no issues, failed if thresholds were breached, error if the execution was not completed.truestring | null
result_detailsAdditional information about the test run result.trueobject | null
retention_expiryTimestamp after which the test run results are deleted or null if the test run is saved.truestring | null , format: date-time
started_byEmail of the user who started the test if started with a user token.truestring | null , format: email
statusCurrent test run status.truestring
status_detailsDetails of the current test run status.trueStatusApiModel
status_historyList of test run status objects sorted by the enter time representing the status history.trueArray[StatusApiModel]
test_idID of the parent test.trueinteger

Details of the test run status.

StatusApiModel properties:

NameDescriptionRequiredType
enteredDate and time when the test run entered the status.truestring , format: date-time
extraExtra information about the indicated status.falseStatusExtraApiModel | null
typeType of simple test run status: created, queued, initializing, running, processing_metrics, completed or aborted.truestring

StatusExtraApiModel properties:

NameDescriptionRequiredType
by_userEmail of the user that set the status if applicable.truestring | null , format: email
codeService-defined error code if applicable.trueinteger | null
messageHuman-readable string describing the error if applicable.truestring | null

TestCostApiModel properties:

NameDescriptionRequiredType
breakdowntrueTestCostBreakdownApiModel
total_vuhTotal number of VUH charged for the test run.true

Breakdown details of the test cost.

TestCostBreakdownApiModel properties:

NameDescriptionRequiredType
browser_vuhNumber of VUH charged for the browser part of the test run.true
protocol_vuhNumber of VUH charged for the protocol part of the test run.true
Started example
{
  "cost": null,
  "created": "2024-06-01T19:00:00Z",
  "distribution": null,
  "ended": null,
  "id": 1234,
  "note": "",
  "options": null,
  "project_id": 12,
  "result": null,
  "result_details": null,
  "retention_expiry": "2024-06-07T19:00:00Z",
  "started_by": "user@example.com",
  "status": "created",
  "status_details": {
    "entered": "2024-06-01T19:00:00Z",
    "type": "created"
  },
  "status_history": [
    {
      "entered": "2024-06-01T19:00:00Z",
      "type": "created"
    }
  ],
  "test_id": 123
}

401 response

403 response

404 response

500 response

List load tests in a project

GET /cloud/v6/projects/{id}/load_tests

List load tests in a project.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
$countInclude collection length in the response object as @count.queryfalseboolean
$orderby

Comma-separated list of fields to use when ordering the results. Available fields:

  • id
  • project_id
  • name
  • created
  • updated

The default ascending order can be reversed by appending the desc specifier.

queryfalsestring
$skipThe initial index from which to return the results.queryfalseinteger
$topNumber of results to return per page.
Default: 1000
Maximum: 1000
queryfalseinteger
idID of the project.pathtrueinteger

200 response

OK.

Content type: application/json

LoadTestListResponse properties:

NameDescriptionRequiredType
@countObject count in the collection.falseinteger
@nextLinkA reference to the next page of results. The property is included until there are no more pages of results to retrieve.falsestring , format: uri
valueList of the resulting values.trueArray[LoadTestApiModel]

LoadTestApiModel properties:

NameDescriptionRequiredType
baseline_test_run_idID of a baseline test run used for results comparison.trueinteger | null
createdThe date when the test was created.truestring , format: date-time
idID of the load test.trueinteger
nameUnique name of the test within the project.truestring
project_idID of the parent project.trueinteger
updatedThe date when the test was last updated.truestring , format: date-time
OK example
{
  "@count": 123,
  "@nextLink": "https://api.k6.io/cloud/v6/projects/312/load_tests?$skip=50\u0026$top=20",
  "value": [
    {
      "baseline_test_run_id": null,
      "created": "2024-12-03T09:53:00.553",
      "id": 1234,
      "name": "Orders API Soak Test",
      "project_id": 312,
      "updated": "2024-12-03T09:53:00.553"
    }
  ]
}

400 response

401 response

403 response

404 response

500 response

Create a new test

POST /cloud/v6/projects/{id}/load_tests

Create a new test in the project.

The script can be either in the form of a single JavaScript text file or a k6 .tar archive - the type is auto-detected by the API. Any received payload that is not a .tar archive is assumed to be a JavaScript file.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger
idID of the project.pathtrueinteger

Request body

Content type: multipart/form-data

CreateLoadTestApiModel properties:

NameDescriptionRequiredType
nameUnique name of the test within the project.truestring
scriptTest script in the form of a UTF-8 encoded text or a k6 .tar archive.truestring , format: binary

201 response

OK.

Content type: application/json

LoadTestApiModel properties:

NameDescriptionRequiredType
baseline_test_run_idID of a baseline test run used for results comparison.trueinteger | null
createdThe date when the test was created.truestring , format: date-time
idID of the load test.trueinteger
nameUnique name of the test within the project.truestring
project_idID of the parent project.trueinteger
updatedThe date when the test was last updated.truestring , format: date-time
OK example
{
  "baseline_test_run_id": null,
  "created": "2024-12-03T09:53:00.553",
  "id": 1234,
  "name": "Orders API Soak Test",
  "project_id": 312,
  "updated": "2024-12-03T09:53:00.553"
}

400 response

401 response

403 response

404 response

409 response

The name is already taken.

Content type: application/json

ErrorResponseApiModel properties:

NameDescriptionRequiredType
errortrueErrorApiModel

Details of the error.

ErrorApiModel properties:

NameDescriptionRequiredType
codeService-defined error code.truestring
detailsArray of objects with more specific error information when applicable.falsearray | null
messageHuman-readable string describing the error.truestring
targetA string indicating the target of the error. For example, the name of the property in error.falsestring | null

500 response

Validate k6 script options

POST /cloud/v6/validate_options

Verify a test can be run in Grafana Cloud with the provided k6 script options.

Project ID can be specified in the root object as well as under options.cloud.

Request parameters

NameDescriptionInRequiredType
stackId

Numeric ID of the Grafana stack representing the request scope.

  • If the API is called with a Personal API token, the user must be a member of the specified stack.
  • If the API is called with a Grafana Stack API token, the value must be the ID of the corresponding stack.
headertrueinteger

Request body

Content type: application/json

ValidateOptionsRequest properties:

NameDescriptionRequiredType
optionsk6 script options object to validate.trueobject
project_idID of a project where the test belongs.falseinteger | null
ProjectIdInOptions example
{
  "options": {
    "cloud": {
      "distribution": {
        "amazon:us:ashburn": {
          "loadZone": "amazon:us:ashburn",
          "percent": 100
        }
      },
      "projectID": 123456
    },
    "stages": [
      {
        "duration": "1m",
        "target": 20
      },
      {
        "duration": "3m",
        "target": 20
      },
      {
        "duration": "30s",
        "target": 0
      }
    ]
  }
}

200 response

OK.

Content type: application/json

ValidateOptionsResponse properties:

NameDescriptionRequiredType
vuh_usageHow many VUH will be charged for the test.truenumber
OK example
{
  "vuh_usage": 1.5
}

400 response

401 response

403 response

500 response