BashBrainTeammatesPricingDevelopersGet a test key

Connected apps

The apps each user connects through a sign-in link, and the apps they may choose from.

Send Authorization: Bearer vk_test_... on every call.

RoutesOpen one for every field it takes and answers.

GET/v1/appsThe apps your users may connect, after your allowlist.

Your API key, scope runtime or all. On the card: connect. Every call here is a checked sample.

Request5 fields

Query

limitintegerHow many items per page, 1 to 100. Default 20.
Type
integer
cursorstringWhere to go on from: the next_cursor of the page before, unchanged. Absent: the first page.
Type
string
searchstringOnly apps whose name holds these words.
Type
string
categorystringOnly apps of this category.
Type
string
deployment_idstringOnly the apps this deployment allows (its apps), by its dep_ id or name. Absent: the company default's.
Type
string
Answers 2002 fields
dataobject[]The items on this page.
object"app"Always app.
Type
"app"
slugstringThe app's name in calls: what app takes when you connect it.
Example
gmail
namestringThe app's name, as people read it.
Example
Gmail
descriptionstringWhat the app is, in a line.
Type
string
categorystring | nullWhat kind of app it is, such as email; null when it has none.
Type
string | null
logo_urlstringThe app's logo, an image URL.
Type
string
connectablebooleanfalse when Vestra cannot connect it yet.
Type
boolean
no_authbooleantrue when it needs no sign-in: its tools just run.
Type
boolean
next_cursorstring | nullSend it as cursor for the next page; null on the last page.
Type
string | null
TypeScript
const catalog = await vestra.connect.catalog();
Python
catalog = vestra.connect.catalog()
CLI
vestra connect --catalog
HTTP
# Get a sign-in link for one app. It is for one user: send them its url.curl "$VESTRA_BASE_URL/v1/connections" \  -H "Authorization: Bearer $VESTRA_API_KEY" \  -H "Content-Type: application/json" \  -d '{ "user_id": "traveller-42", "app": "gmail" }' # List their apps. You can also list the catalog your users may pick from.curl "$VESTRA_BASE_URL/v1/connections?user_id=traveller-42" \  -H "Authorization: Bearer $VESTRA_API_KEY" curl "$VESTRA_BASE_URL/v1/apps?search=calendar" \  -H "Authorization: Bearer $VESTRA_API_KEY" # Disconnect an app. user_id says whose connection it is.curl -X DELETE "$VESTRA_BASE_URL/v1/connections/con_7hs?user_id=traveller-42" \  -H "Authorization: Bearer $VESTRA_API_KEY"
MCP
{  "method": "tools/call",  "params": {    "name": "connect",    "arguments": { "user": "traveller-42", "app": "gmail" }  }}
POST/v1/connectionsGet a connect link for one app, for one user (user_id) or the company's own Bash.

After consent the user lands on your return_url (or your first allowed one, or our own page), and a webhook fires. The link carries the id of the connection it makes.

Your API key, scope runtime or all. On the card: connect. Every call here is a checked sample.

GET/v1/connectionsThe connected apps of one user (user_id), or of the company's own Bash.

Your API key, scope runtime or all. On the card: connect. Every call here is a checked sample.

GET/v1/connections/{connection_id}One connection's status.

user_id names whose it is.

Your API key, scope runtime or all. On the card: connect. Over HTTP it is made from the contract: fill in each {…} and every value.

DELETE/v1/connections/{connection_id}Disconnect.

user_id names whose it is.

Your API key, scope runtime or all. On the card: connect. Every call here is a checked sample.

GET/v1/connect/returnHosted by us.

The app sends the user here after consent; we record it and forward them to your return_url. You never call it.

No key: anyone may call it. On the card: connect. Over HTTP it is made from the contract: fill in every value.