Third-party APIs, without the glue code.
A pack describes a service's actions and triggers in one b3pack.json: request templates, response mapping and the hosts it may reach. Your credentials stay in the vault and are added at the egress proxy, so pack code never sees them.
- API
- /v1/actions
- CLI
- b3os action search · b3os action run
- MCP tools
- actions_*
[01/03] What it does
Search, describe, call
Find an action, read its input schema, call it. Every action is also a valid MCP tool.
GET /v1/actions/search · POST /v1/actions/call
Your credentials
API keys, basic auth, bearer and OAuth tokens that belong to you, bound to the exact hosts the pack declares.
/v1/vault/connections
Triggers for routines
Webhook, polling and schedule triggers start routines when something happens in another service.
GET /v1/actions/triggers
Verified packs
Nodes check each pack's content hash and publisher signature against the registry before loading it.
GET /v1/actions/packs
Call
An agent or routine calls io.b3os/github/create-issue@1 with a connection id.
Template
The pack's request template is filled and validated against its schema.
Egress proxy
The token is added here, only for the host the pack declares.
api.github.com
The response is mapped back through the pack's CEL expressions.
# Find an action
curl -sS "https://beta-api.b3os.org/v1/actions/search?q=create%20github%20issue" \
-H "Authorization: Bearer $B3OS_API_KEY"
# Call it with a stored connection
curl -sS https://beta-api.b3os.org/v1/actions/call \
-H "Authorization: Bearer $B3OS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"io.b3os/github/create-issue@1","input":{"owner":"acme","repo":"web","title":"Checkout button misaligned on mobile"},"connections":{"api":"conn_01m5t6cbgdjs1ketgcqwa2sne8"}}'const res = await fetch("https://beta-api.b3os.org/v1/actions/call", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.B3OS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
ref: "io.b3os/github/create-issue@1",
input: {
owner: "acme",
repo: "web",
title: "Checkout button misaligned on mobile",
},
connections: { api: "conn_01m5t6cbgdjs1ketgcqwa2sne8" },
}),
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const data = await res.json();
console.log(res.headers.get("server-timing"));import os
import httpx
res = httpx.post(
"https://beta-api.b3os.org/v1/actions/call",
headers={"Authorization": f"Bearer {os.environ['B3OS_API_KEY']}"},
json={
"ref": "io.b3os/github/create-issue@1",
"input": {
"owner": "acme",
"repo": "web",
"title": "Checkout button misaligned on mobile",
},
"connections": {"api": "conn_01m5t6cbgdjs1ketgcqwa2sne8"},
},
timeout=65,
)
res.raise_for_status()
data = res.json()
print(res.headers.get("server-timing")){
"name": "actions_call",
"arguments": {
"ref": "io.b3os/github/create-issue@1",
"input": {
"owner": "acme",
"repo": "web",
"title": "Checkout button misaligned on mobile"
},
"connections": {
"api": "conn_01m5t6cbgdjs1ketgcqwa2sne8"
}
}
}- Every pack in the catalog runs on your own credentials or a keyless public API. B3 does not pay for upstream keys, and packs neither route through residential proxies nor sign wallet transactions.
[02/03] Measured
What we measure for actions
Values appear here only from published benchmark runs, each with its raw data. A row that says measuring has no published run yet.
Declarative action overhead
Time added by the action runtime, upstream excluded, for responses up to 16 KB.
Input validation
JSON Schema validation of an action's input.
JavaScript action overhead
Warm overhead of a first-party JavaScript action.
T0 call total minus upstream, per MiB of upstream response, for responses over 16 KB
[03/03] Beta limits
Free during the beta, with caps
Caps per organization
- Action calls per minute
- 300
Metered units
- Action calls
- actions.call