App Instance API
Create App Instance
Create a new app instance for a team.
POST
/
v2
/
app-instances
Create App Instance
curl --request POST \
--url https://public.api.serval.com/v2/app-instances \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"teamId": "<string>",
"externalServiceInstanceId": "<string>",
"name": "<string>",
"customServiceId": "<string>",
"defaultAccessPolicyId": "<string>",
"accessRequestsEnabled": true
}
'import requests
url = "https://public.api.serval.com/v2/app-instances"
payload = {
"teamId": "<string>",
"externalServiceInstanceId": "<string>",
"name": "<string>",
"customServiceId": "<string>",
"defaultAccessPolicyId": "<string>",
"accessRequestsEnabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
teamId: '<string>',
externalServiceInstanceId: '<string>',
name: '<string>',
customServiceId: '<string>',
defaultAccessPolicyId: '<string>',
accessRequestsEnabled: true
})
};
fetch('https://public.api.serval.com/v2/app-instances', 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://public.api.serval.com/v2/app-instances",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'teamId' => '<string>',
'externalServiceInstanceId' => '<string>',
'name' => '<string>',
'customServiceId' => '<string>',
'defaultAccessPolicyId' => '<string>',
'accessRequestsEnabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public.api.serval.com/v2/app-instances"
payload := strings.NewReader("{\n \"teamId\": \"<string>\",\n \"externalServiceInstanceId\": \"<string>\",\n \"name\": \"<string>\",\n \"customServiceId\": \"<string>\",\n \"defaultAccessPolicyId\": \"<string>\",\n \"accessRequestsEnabled\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public.api.serval.com/v2/app-instances")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"teamId\": \"<string>\",\n \"externalServiceInstanceId\": \"<string>\",\n \"name\": \"<string>\",\n \"customServiceId\": \"<string>\",\n \"defaultAccessPolicyId\": \"<string>\",\n \"accessRequestsEnabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public.api.serval.com/v2/app-instances")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"teamId\": \"<string>\",\n \"externalServiceInstanceId\": \"<string>\",\n \"name\": \"<string>\",\n \"customServiceId\": \"<string>\",\n \"defaultAccessPolicyId\": \"<string>\",\n \"accessRequestsEnabled\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"customServiceId": "<string>",
"id": "<string>",
"teamId": "<string>",
"externalServiceInstanceId": "<string>",
"name": "<string>",
"accessRequestsEnabled": true,
"defaultAccessPolicyId": "<string>",
"customServiceName": "<string>",
"tagIds": [
"<string>"
],
"integrationIds": [
"<string>"
],
"a2aAgentCard": {
"name": "<string>",
"description": "<string>",
"url": "<string>",
"version": "<string>",
"skills": [
{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"tags": [
"<string>"
],
"examples": [
"<string>"
],
"inputModes": [
"<string>"
],
"outputModes": [
"<string>"
]
}
],
"workflowId": "<string>",
"lastSyncedAt": "2025-01-15T01:30:15.000Z",
"securitySchemes": [
{
"name": "<string>",
"kind": "A2A_AGENT_SECURITY_SCHEME_KIND_UNSPECIFIED",
"openIdConnectUrl": "<string>",
"flow": "<string>",
"oauth2MetadataUrl": "<string>",
"scopes": [
"<string>"
]
}
]
},
"routeDirectFromWorker": true
}
}Authentication and permissions
Token requirements: User-based token (OAuth) or Organization-scoped API key or Team-scoped API key. Send a bearer access token for one of these identities. The permissions and resource restrictions below also apply.
| Credential | Access requirements |
|---|---|
| Organization-scoped API key | apps:write |
| Team-scoped API key | apps:write |
| User-based token (OAuth) | Supported, subject to permissions |
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
- CreateAppInstanceRequest
- CreateAppInstanceRequest
The ID of the team.
The external service instance ID (e.g., GitHub org name, Okta domain, AWS account ID).
The name of the app instance.
The ID of a custom service to create the app instance for.
The default access policy for the app instance (optional).
Whether access requests are enabled for the app instance. Unset keeps the server default (enabled on creation).
Response
200 - application/json
Success
The created app instance.
- data
- data
Show child attributes
Show child attributes
Was this page helpful?
⌘I
Create App Instance
curl --request POST \
--url https://public.api.serval.com/v2/app-instances \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"teamId": "<string>",
"externalServiceInstanceId": "<string>",
"name": "<string>",
"customServiceId": "<string>",
"defaultAccessPolicyId": "<string>",
"accessRequestsEnabled": true
}
'import requests
url = "https://public.api.serval.com/v2/app-instances"
payload = {
"teamId": "<string>",
"externalServiceInstanceId": "<string>",
"name": "<string>",
"customServiceId": "<string>",
"defaultAccessPolicyId": "<string>",
"accessRequestsEnabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
teamId: '<string>',
externalServiceInstanceId: '<string>',
name: '<string>',
customServiceId: '<string>',
defaultAccessPolicyId: '<string>',
accessRequestsEnabled: true
})
};
fetch('https://public.api.serval.com/v2/app-instances', 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://public.api.serval.com/v2/app-instances",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'teamId' => '<string>',
'externalServiceInstanceId' => '<string>',
'name' => '<string>',
'customServiceId' => '<string>',
'defaultAccessPolicyId' => '<string>',
'accessRequestsEnabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public.api.serval.com/v2/app-instances"
payload := strings.NewReader("{\n \"teamId\": \"<string>\",\n \"externalServiceInstanceId\": \"<string>\",\n \"name\": \"<string>\",\n \"customServiceId\": \"<string>\",\n \"defaultAccessPolicyId\": \"<string>\",\n \"accessRequestsEnabled\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public.api.serval.com/v2/app-instances")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"teamId\": \"<string>\",\n \"externalServiceInstanceId\": \"<string>\",\n \"name\": \"<string>\",\n \"customServiceId\": \"<string>\",\n \"defaultAccessPolicyId\": \"<string>\",\n \"accessRequestsEnabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public.api.serval.com/v2/app-instances")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"teamId\": \"<string>\",\n \"externalServiceInstanceId\": \"<string>\",\n \"name\": \"<string>\",\n \"customServiceId\": \"<string>\",\n \"defaultAccessPolicyId\": \"<string>\",\n \"accessRequestsEnabled\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"customServiceId": "<string>",
"id": "<string>",
"teamId": "<string>",
"externalServiceInstanceId": "<string>",
"name": "<string>",
"accessRequestsEnabled": true,
"defaultAccessPolicyId": "<string>",
"customServiceName": "<string>",
"tagIds": [
"<string>"
],
"integrationIds": [
"<string>"
],
"a2aAgentCard": {
"name": "<string>",
"description": "<string>",
"url": "<string>",
"version": "<string>",
"skills": [
{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"tags": [
"<string>"
],
"examples": [
"<string>"
],
"inputModes": [
"<string>"
],
"outputModes": [
"<string>"
]
}
],
"workflowId": "<string>",
"lastSyncedAt": "2025-01-15T01:30:15.000Z",
"securitySchemes": [
{
"name": "<string>",
"kind": "A2A_AGENT_SECURITY_SCHEME_KIND_UNSPECIFIED",
"openIdConnectUrl": "<string>",
"flow": "<string>",
"oauth2MetadataUrl": "<string>",
"scopes": [
"<string>"
]
}
]
},
"routeDirectFromWorker": true
}
}
