curl --request GET \
--url https://openrouter.ai/api/v1/vault/interns/{internId}/connections \
--header 'Authorization: Bearer <token>'import requests
url = "https://openrouter.ai/api/v1/vault/interns/{internId}/connections"
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/vault/interns/{internId}/connections', 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/vault/interns/{internId}/connections",
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/vault/interns/{internId}/connections"
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/vault/interns/{internId}/connections")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/vault/interns/{internId}/connections")
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": [
{
"key": "github"
},
{
"key": "linear"
}
],
"routing": {
"agent_id": "intern_123",
"custom_origins": [],
"github": {
"apps": [
{
"app_id": "71000003",
"app_slug": "openrouter-interns",
"installations": [
{
"account": "OpenRouterTeam",
"account_type": "organization",
"coverage": {
"checked_at": "2026-10-27T19:30:00.000Z",
"repository_count": 42,
"selection": "all"
},
"credential_id": "cred_1",
"holds_token": true,
"is_enabled": true,
"is_off_for_intern": false
}
],
"member_links": [
{
"holds_token": true,
"login": "gfadlallah",
"member_user_id": "user_1"
}
],
"scope": "workspace"
}
],
"tokens": []
},
"google": {
"accounts": []
},
"host_rules": [
{
"holds_secret": false,
"host": "api.openai.com",
"secret_name": "openai_api_key"
}
],
"mcp_origins": [
{
"account_key": null,
"holds_secret": true,
"host": "mcp.linear.app",
"injects": "bearer",
"is_personal": false,
"routes": [
{
"host": "mcp.linear.app",
"path_prefix": null
}
]
}
],
"read_at": "2026-10-27T20:00:00.000Z",
"secrets": [
{
"created_at": "2026-09-15T10:00:00.000Z",
"hosts": [
"api.linear.app"
],
"name": "linear_api_key",
"scope": "workspace"
}
],
"slack": {
"member_links": []
}
},
"routing_text": "## Connections\n\n..."
}List the connections an intern can use
Lists the connections in scope for the intern, by the key of their card on the dashboard’s Connections tab: github, slack, google, a catalog MCP server such as linear or notion, or mcp:<host> for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. ori features add checks a feature’s ori.requires.connections against this list. routing is the vault’s routing table for the intern: the credentials it holds and what it would inject each for, from the same lookups the egress proxy picks a credential with, GitHub repository coverage read through the installation token and cached. routing_text is that table as the lines the intern reads in its instructions. Never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key’s active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern’s own API key is confined to that intern: it can always read the intern’s secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as eu.openrouter.ai are refused. API key required.
curl --request GET \
--url https://openrouter.ai/api/v1/vault/interns/{internId}/connections \
--header 'Authorization: Bearer <token>'import requests
url = "https://openrouter.ai/api/v1/vault/interns/{internId}/connections"
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/vault/interns/{internId}/connections', 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/vault/interns/{internId}/connections",
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/vault/interns/{internId}/connections"
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/vault/interns/{internId}/connections")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/vault/interns/{internId}/connections")
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": [
{
"key": "github"
},
{
"key": "linear"
}
],
"routing": {
"agent_id": "intern_123",
"custom_origins": [],
"github": {
"apps": [
{
"app_id": "71000003",
"app_slug": "openrouter-interns",
"installations": [
{
"account": "OpenRouterTeam",
"account_type": "organization",
"coverage": {
"checked_at": "2026-10-27T19:30:00.000Z",
"repository_count": 42,
"selection": "all"
},
"credential_id": "cred_1",
"holds_token": true,
"is_enabled": true,
"is_off_for_intern": false
}
],
"member_links": [
{
"holds_token": true,
"login": "gfadlallah",
"member_user_id": "user_1"
}
],
"scope": "workspace"
}
],
"tokens": []
},
"google": {
"accounts": []
},
"host_rules": [
{
"holds_secret": false,
"host": "api.openai.com",
"secret_name": "openai_api_key"
}
],
"mcp_origins": [
{
"account_key": null,
"holds_secret": true,
"host": "mcp.linear.app",
"injects": "bearer",
"is_personal": false,
"routes": [
{
"host": "mcp.linear.app",
"path_prefix": null
}
]
}
],
"read_at": "2026-10-27T20:00:00.000Z",
"secrets": [
{
"created_at": "2026-09-15T10:00:00.000Z",
"hosts": [
"api.linear.app"
],
"name": "linear_api_key",
"scope": "workspace"
}
],
"slack": {
"member_links": []
}
},
"routing_text": "## Connections\n\n..."
}Authorizations
API key as bearer token in Authorization header
Path Parameters
UUID of an intern in the workspace selected by the API key.
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
Response
The connections the intern can use.
Show child attributes
Show child attributes
The intern's routing table, for the intern's own key only; null for any other caller or when the vault could not build it in time. The keys still list.
Show child attributes
Show child attributes
The routing table as the plain lines the intern reads in its instructions' Connections section, or a notice that it could not be read; null for a caller other than the intern.
Was this page helpful?