List interns
curl --request GET \
--url https://openrouter.ai/api/v1/interns \
--header 'Authorization: Bearer <token>'import requests
url = "https://openrouter.ai/api/v1/interns"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://openrouter.ai/api/v1/interns', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://openrouter.ai/api/v1/interns",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://openrouter.ai/api/v1/interns"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://openrouter.ai/api/v1/interns")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/interns")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"attached_vault_id": null,
"createdAt": "2026-09-16T08:30:00.000Z",
"description": "Researches customer questions",
"hostname": "research-assistant.openrouter.ai",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"instructions": null,
"lastFailureMessage": null,
"model": "openai/gpt-5.4",
"name": "research-assistant",
"progress": null,
"status": "running",
"updatedAt": "2026-09-16T08:45:00.000Z",
"vault_id": "b431c59d-6eed-41ac-bc89-9a89be79a121",
"workspaceId": "89f9f5b2-3f89-4eaf-83ca-5ceae149e8bb"
}
],
"has_more": false
}{
"error": {
"code": "invalid_body",
"message": "Invalid list query"
}
}{
"error": {
"code": 401,
"message": "Invalid or missing API key"
}
}{
"error": {
"code": 403,
"message": "Forbidden"
}
}{
"error": {
"code": "not_found",
"message": "Intern not found"
}
}{
"error": {
"code": 408,
"message": "Request timed out"
}
}{
"error": {
"code": "internal_error",
"message": "The request could not be completed"
}
}Interns
List interns
Lists interns visible to the authenticated key, newest first. Filter by workspace and one or more lifecycle statuses. The API key selects the caller, workspace and visible interns. There is no default workspace fallback. Requests on regional hostnames such as eu.openrouter.ai are refused. API key required.
GET
/
interns
List interns
curl --request GET \
--url https://openrouter.ai/api/v1/interns \
--header 'Authorization: Bearer <token>'import requests
url = "https://openrouter.ai/api/v1/interns"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://openrouter.ai/api/v1/interns', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://openrouter.ai/api/v1/interns",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://openrouter.ai/api/v1/interns"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://openrouter.ai/api/v1/interns")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/interns")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"attached_vault_id": null,
"createdAt": "2026-09-16T08:30:00.000Z",
"description": "Researches customer questions",
"hostname": "research-assistant.openrouter.ai",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"instructions": null,
"lastFailureMessage": null,
"model": "openai/gpt-5.4",
"name": "research-assistant",
"progress": null,
"status": "running",
"updatedAt": "2026-09-16T08:45:00.000Z",
"vault_id": "b431c59d-6eed-41ac-bc89-9a89be79a121",
"workspaceId": "89f9f5b2-3f89-4eaf-83ca-5ceae149e8bb"
}
],
"has_more": false
}{
"error": {
"code": "invalid_body",
"message": "Invalid list query"
}
}{
"error": {
"code": 401,
"message": "Invalid or missing API key"
}
}{
"error": {
"code": 403,
"message": "Forbidden"
}
}{
"error": {
"code": "not_found",
"message": "Intern not found"
}
}{
"error": {
"code": 408,
"message": "Request timed out"
}
}{
"error": {
"code": "internal_error",
"message": "The request could not be completed"
}
}Authorizations
API key as bearer token in Authorization header
Query Parameters
Maximum number of interns to return, from 1 through 500.
Required range:
1 <= x <= 500Example:
50
Comma-separated lifecycle statuses to include.
Available options:
awaiting_slack_install, queued, provisioning, running, failed, stopped, destroying, destroy_failed Example:
["queued", "running"]
Only return interns in this workspace. It must match the API key workspace.
Example:
"89f9f5b2-3f89-4eaf-83ca-5ceae149e8bb"