Update API pages with v0.78.0

This commit is contained in:
netbirddev
2026-09-03 19:24:35 +00:00
parent b5ef5c2b8a
commit 46cb61ed6b
3 changed files with 538 additions and 14 deletions
+499 -3
View File
@@ -6,7 +6,7 @@ export const title = 'Agent Network'
<Row>
<Col>
Returns a paginated, server-side-filtered list of agent-network (LLM) access log entries. Available only when the account has log collection enabled; otherwise entries are not retained.
Returns a paginated, server-side-filtered list of agent-network (LLM) access log entries. Available only when the account has log collection enabled; otherwise entries are not retained. Callers without the account-wide grant are not denied - the response is scoped to their own requests (any user_id or group_id filter is overridden).
### Query Parameters
<Properties>
@@ -360,7 +360,7 @@ echo $response;
<Row>
<Col>
Returns a paginated, server-side-filtered list of agent-network (LLM) access logs grouped by session. The page unit is a session (total_records counts sessions); each session carries an aggregate summary and its ordered entries. Requests the client sent no session id for each form their own singleton group. Accepts the same filters as the flat access-logs endpoint. Available only when the account has log collection enabled.
Returns a paginated, server-side-filtered list of agent-network (LLM) access logs grouped by session. The page unit is a session (total_records counts sessions); each session carries an aggregate summary and its ordered entries. Requests the client sent no session id for each form their own singleton group. Accepts the same filters as the flat access-logs endpoint. Available only when the account has log collection enabled. Callers without the account-wide grant are not denied - the response is scoped to their own requests (any user_id or group_id filter is overridden).
### Query Parameters
<Properties>
@@ -783,7 +783,7 @@ echo $response;
<Row>
<Col>
Returns agent-network token and cost usage aggregated into time buckets, server-side filtered. Usage is always collected (independent of log collection).
Returns agent-network token and cost usage aggregated into time buckets, server-side filtered. Usage is always collected (independent of log collection). Callers without the account-wide grant are not denied - the response is scoped to their own usage (any user_id or group_id filter is overridden).
### Query Parameters
<Properties>
@@ -1220,6 +1220,213 @@ echo $response;
---
## Retrieve the caller's Agent Network agent config {{ tag: 'GET' , label: '/api/agent-network/agent-config' }}
<Row>
<Col>
Returns everything the caller needs to configure a local AI tool and nothing more - the account's Agent Network endpoint plus the providers and models the caller's own policies allow. Available to every authenticated user regardless of role; the response never contains provider credentials, policy or guardrail configuration, or providers the caller cannot reach.
</Col>
<Col sticky>
<CodeGroup title="Request" tag="GET" label="/api/agent-network/agent-config">
```bash {{ title: 'cURL' }}
curl -X GET https://api.netbird.io/api/agent-network/agent-config \
-H 'Accept: application/json' \
-H 'Authorization: Token <TOKEN>'
```
```js
const axios = require('axios');
let config = {
method: 'get',
maxBodyLength: Infinity,
url: '/api/agent-network/agent-config',
headers: {
'Accept': 'application/json',
'Authorization': 'Token <TOKEN>'
}
};
axios(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
```
```python
import requests
import json
url = "https://api.netbird.io/api/agent-network/agent-config"
headers = {
'Accept': 'application/json',
'Authorization': 'Token <TOKEN>'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
```
```go
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.netbird.io/api/agent-network/agent-config"
method := "GET"
client := &http.Client {
}
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Accept", "application/json")
req.Header.Add("Authorization", "Token <TOKEN>")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
```
```ruby
require "uri"
require "json"
require "net/http"
url = URI("https://api.netbird.io/api/agent-network/agent-config")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"
request["Authorization"] = "Token <TOKEN>"
response = https.request(request)
puts response.read_body
```
```java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
Request request = new Request.Builder()
.url("https://api.netbird.io/api/agent-network/agent-config")
.method("GET")
.addHeader("Accept", "application/json")
.addHeader("Authorization: Token <TOKEN>")
.build();
Response response = client.newCall(request).execute();
```
```php
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.netbird.io/api/agent-network/agent-config',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'Authorization: Token <TOKEN>'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Example' }}
{
"configured": {
"type": "boolean",
"description": "False only when the account has no Agent Network set up. A caller that no policy covers yet still reads as configured, with an empty providers list."
},
"endpoint": "https://calm-otter.proxy.example.com",
"providers": [
{
"name": "Bedrock prod",
"catalog_id": "bedrock_api",
"api_flavor": "anthropic",
"all_models_allowed": {
"type": "boolean",
"description": "True when no model allowlist restricts this provider for the caller; models then lists the declared or catalog models as a courtesy."
},
"models": [
"anthropic.claude-sonnet-4-5"
]
}
]
}
```
```json {{ title: 'Schema' }}
{
"configured": "boolean",
"endpoint": "string",
"providers": [
{
"name": "string",
"catalog_id": "string",
"api_flavor": "string",
"all_models_allowed": "boolean",
"models": [
"string"
]
}
]
}
```
</CodeGroup>
</Col>
</Row>
---
## Retrieve Agent Network settings {{ tag: 'GET' , label: '/api/agent-network/settings' }}
<Row>
@@ -4034,6 +4241,285 @@ echo $response;
---
## Discover the models a provider credential can reach {{ tag: 'POST' , label: '/api/agent-network/catalog/providers/models' }}
<Row>
<Col>
Asks the vendor which models the supplied credential can actually use, so the provider form can offer a live list instead of only the static catalog. The endpoint, auth header and response shape are taken from the catalog entry, never from the request.
Supply either an api_key together with the upstream_url being configured (before the provider is saved), or a provider_id of an existing record to reuse its stored credential.
Returns 422 for a catalog provider that has no listing endpoint (most gateways); the caller should fall back to the catalog's own model list. A model whose price the shipped table does not know is returned with pricing_known false, and the operator must set rates for it.
### Request-Body Parameters
<Properties><Property name="catalog_provider_id" type="string" required={true}>
Catalog provider to query (AgentNetworkCatalogProvider.id). Determines the listing endpoint, the auth header and the response shape.
</Property>
<Property name="upstream_url" type="string" required={false}>
The upstream being configured. Used to reach vendors that serve their listing from the same host as inference, and to read back the region for those whose host embeds one. Sent alongside provider_id, it overrides the stored upstream, so an edit can be listed against the URL on the form before it is saved.
</Property>
<Property name="api_key" type="string" required={false}>
Credential to query the vendor with, for a provider that has not been saved yet. Mutually exclusive with provider_id.
</Property>
<Property name="provider_id" type="string" required={false}>
Existing Agent Network provider record to query with. Its stored credential is used, and its upstream unless upstream_url overrides it, so the form can refresh the list without the client holding the key.
</Property>
</Properties>
</Col>
<Col sticky>
<CodeGroup title="Request" tag="POST" label="/api/agent-network/catalog/providers/models">
```bash {{ title: 'cURL' }}
curl -X POST https://api.netbird.io/api/agent-network/catalog/providers/models \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Token <TOKEN>' \
--data-raw '{
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
}'
```
```js
const axios = require('axios');
let data = JSON.stringify({
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: '/api/agent-network/catalog/providers/models',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': 'Token <TOKEN>'
},
data : data
};
axios(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
```
```python
import requests
import json
url = "https://api.netbird.io/api/agent-network/catalog/providers/models"
payload = json.dumps({
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
})
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Token <TOKEN>'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
```
```go
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.netbird.io/api/agent-network/catalog/providers/models"
method := "POST"
payload := strings.NewReader(`{
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
req.Header.Add("Authorization", "Token <TOKEN>")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
```
```ruby
require "uri"
require "json"
require "net/http"
url = URI("https://api.netbird.io/api/agent-network/catalog/providers/models")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Accept"] = "application/json"
request["Authorization"] = "Token <TOKEN>"
request.body = JSON.dump({
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
})
response = https.request(request)
puts response.read_body
```
```java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, '{
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
}');
Request request = new Request.Builder()
.url("https://api.netbird.io/api/agent-network/catalog/providers/models")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.addHeader("Authorization: Token <TOKEN>")
.build();
Response response = client.newCall(request).execute();
```
```php
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.netbird.io/api/agent-network/catalog/providers/models',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{
"catalog_provider_id": "bedrock_api",
"upstream_url": "https://bedrock-runtime.eu-central-1.amazonaws.com",
"api_key": "sk-...",
"provider_id": "ch8i4ug6lnn4g9hqv7m0"
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Token <TOKEN>'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
</CodeGroup>
<CodeGroup title="Response">
```json {{ title: 'Example' }}
{
"models": [
{
"id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0",
"label": "EU Anthropic Claude Haiku 4.5",
"pricing_known": true,
"input_per_1k": 0.005,
"output_per_1k": 0.015,
"cached_input_per_1k": 0.000075,
"cache_read_per_1k": 0.0003,
"cache_creation_per_1k": 0.00375
}
]
}
```
```json {{ title: 'Schema' }}
{
"models": [
{
"id": "string",
"label": "string",
"pricing_known": "boolean",
"input_per_1k": "number",
"output_per_1k": "number",
"cached_input_per_1k": "number",
"cache_read_per_1k": "number",
"cache_creation_per_1k": "number"
}
]
}
```
</CodeGroup>
</Col>
</Row>
---
## List all Agent Network Providers {{ tag: 'GET' , label: '/api/agent-network/providers' }}
<Row>
@@ -4271,6 +4757,13 @@ echo $response;
<Row>
<Col>
Connects a new Agent Network AI provider for the account.
The credential is checked against the vendor's model listing before the provider is stored, so a record the vendor will not accept is refused rather than saved. A rejected credential, a listing endpoint that does not resolve or answer, a vendor outage, and a timeout all block the write and return 422.
What that proves about the upstream URL is narrower than the URL itself. Only its host is used: the listing is requested over HTTPS at the path the catalog entry declares, so a configured scheme or path is neither used nor validated here. Where the catalog entry has a listing host of its own — Bedrock, whose listing comes from the control plane — even the host is only resolved, never contacted, so a public host that does not answer is still stored.
Only what cannot be checked at all is exempt and stored unverified: a catalog provider with no listing endpoint, one with no host to derive a listing from, an upstream resolving to a private address the management service will not dial, and a provider configured to skip TLS verification.
### Request-Body Parameters
@@ -5010,6 +5503,9 @@ echo $response;
<Row>
<Col>
Update an existing Agent Network AI provider.
When the upstream URL, the API key or the catalog provider changes, the record is checked against the vendor before the change is stored, and a refusal returns 422 without replacing what was there. Switching TLS verification back on is the fourth trigger: a provider exempt from the check was stored unverified, so the edit that ends the exemption is the first opportunity to check it. Where one of the four does fire, an update that omits the API key is checked against the stored one. Edits touching none of them — a rename, model rows, price edits — are stored without a check, as are the cases the create description lists as unverifiable.
### Path Parameters
<Properties>
+33 -11
View File
@@ -206,7 +206,9 @@ echo $response;
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
},
"result": {
"upload_key": "upload_key_123"
@@ -240,7 +242,9 @@ echo $response;
"bundle_for": "boolean",
"bundle_for_time": "integer",
"log_file_count": "integer",
"anonymize": "boolean"
"anonymize": "boolean",
"anonymize_level": "string",
"upload_url": "string"
},
"result": {
"upload_key": "string"
@@ -308,7 +312,9 @@ curl -X POST https://api.netbird.io/api/peers/{peerId}/jobs \
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -333,7 +339,9 @@ let data = JSON.stringify({
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -380,7 +388,9 @@ payload = json.dumps({
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -427,7 +437,9 @@ func main() {
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -493,7 +505,9 @@ request.body = JSON.dump({
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -522,7 +536,9 @@ RequestBody body = RequestBody.create(mediaType, '{
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -567,7 +583,9 @@ curl_setopt_array($curl, array(
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
}
}
],
@@ -809,7 +827,9 @@ echo $response;
"bundle_for": true,
"bundle_for_time": 2,
"log_file_count": 100,
"anonymize": false
"anonymize": false,
"anonymize_level": "strict",
"upload_url": "https://upload.debug.netbird.io"
},
"result": {
"upload_key": "upload_key_123"
@@ -841,7 +861,9 @@ echo $response;
"bundle_for": "boolean",
"bundle_for_time": "integer",
"log_file_count": "integer",
"anonymize": "boolean"
"anonymize": "boolean",
"anonymize_level": "string",
"upload_url": "string"
},
"result": {
"upload_key": "string"
+6
View File
@@ -221,6 +221,7 @@ echo $response;
"rosenpass_enabled": true,
"rosenpass_permissive": false,
"server_ssh_allowed": true,
"remote_jobs_allowed": true,
"disable_client_routes": false,
"disable_server_routes": false,
"disable_dns": false,
@@ -279,6 +280,7 @@ echo $response;
"rosenpass_enabled": "boolean",
"rosenpass_permissive": "boolean",
"server_ssh_allowed": "boolean",
"remote_jobs_allowed": "boolean",
"disable_client_routes": "boolean",
"disable_server_routes": "boolean",
"disable_dns": "boolean",
@@ -514,6 +516,7 @@ echo $response;
"rosenpass_enabled": true,
"rosenpass_permissive": false,
"server_ssh_allowed": true,
"remote_jobs_allowed": true,
"disable_client_routes": false,
"disable_server_routes": false,
"disable_dns": false,
@@ -569,6 +572,7 @@ echo $response;
"rosenpass_enabled": "boolean",
"rosenpass_permissive": "boolean",
"server_ssh_allowed": "boolean",
"remote_jobs_allowed": "boolean",
"disable_client_routes": "boolean",
"disable_server_routes": "boolean",
"disable_dns": "boolean",
@@ -912,6 +916,7 @@ echo $response;
"rosenpass_enabled": true,
"rosenpass_permissive": false,
"server_ssh_allowed": true,
"remote_jobs_allowed": true,
"disable_client_routes": false,
"disable_server_routes": false,
"disable_dns": false,
@@ -967,6 +972,7 @@ echo $response;
"rosenpass_enabled": "boolean",
"rosenpass_permissive": "boolean",
"server_ssh_allowed": "boolean",
"remote_jobs_allowed": "boolean",
"disable_client_routes": "boolean",
"disable_server_routes": "boolean",
"disable_dns": "boolean",