curl --request POST \
--url https://api.opal.dev/v1/apps \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "My Push-only App",
"description": "Bookkeeping app for internal tools.",
"admin_owner_id": "7c86c85d-0651-43e2-a748-d69d658418e8",
"app_type": "OKTA_DIRECTORY",
"visibility": "GLOBAL",
"visibility_group_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"import_visibility": "GLOBAL"
}
'import requests
url = "https://api.opal.dev/v1/apps"
payload = {
"name": "My Push-only App",
"description": "Bookkeeping app for internal tools.",
"admin_owner_id": "7c86c85d-0651-43e2-a748-d69d658418e8",
"app_type": "OKTA_DIRECTORY",
"visibility": "GLOBAL",
"visibility_group_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"import_visibility": "GLOBAL"
}
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({
name: 'My Push-only App',
description: 'Bookkeeping app for internal tools.',
admin_owner_id: '7c86c85d-0651-43e2-a748-d69d658418e8',
app_type: 'OKTA_DIRECTORY',
visibility: 'GLOBAL',
visibility_group_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
import_visibility: 'GLOBAL'
})
};
fetch('https://api.opal.dev/v1/apps', 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://api.opal.dev/v1/apps",
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([
'name' => 'My Push-only App',
'description' => 'Bookkeeping app for internal tools.',
'admin_owner_id' => '7c86c85d-0651-43e2-a748-d69d658418e8',
'app_type' => 'OKTA_DIRECTORY',
'visibility' => 'GLOBAL',
'visibility_group_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'import_visibility' => 'GLOBAL'
]),
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://api.opal.dev/v1/apps"
payload := strings.NewReader("{\n \"name\": \"My Push-only App\",\n \"description\": \"Bookkeeping app for internal tools.\",\n \"admin_owner_id\": \"7c86c85d-0651-43e2-a748-d69d658418e8\",\n \"app_type\": \"OKTA_DIRECTORY\",\n \"visibility\": \"GLOBAL\",\n \"visibility_group_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"import_visibility\": \"GLOBAL\"\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://api.opal.dev/v1/apps")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"My Push-only App\",\n \"description\": \"Bookkeeping app for internal tools.\",\n \"admin_owner_id\": \"7c86c85d-0651-43e2-a748-d69d658418e8\",\n \"app_type\": \"OKTA_DIRECTORY\",\n \"visibility\": \"GLOBAL\",\n \"visibility_group_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"import_visibility\": \"GLOBAL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opal.dev/v1/apps")
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 \"name\": \"My Push-only App\",\n \"description\": \"Bookkeeping app for internal tools.\",\n \"admin_owner_id\": \"7c86c85d-0651-43e2-a748-d69d658418e8\",\n \"app_type\": \"OKTA_DIRECTORY\",\n \"visibility\": \"GLOBAL\",\n \"visibility_group_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"import_visibility\": \"GLOBAL\"\n}"
response = http.request(request)
puts response.read_body{
"app_id": "f454d283-ca87-4a8a-bdbb-df212eca5353",
"name": "Okta Org",
"description": "Okta directory for the engineering team.",
"admin_owner_id": "7c86c85d-0651-43e2-a748-d69d658418e8",
"app_type": "OKTA_DIRECTORY"
}Create app
Creates an App in Opal. Currently supports only Push-only apps (CUSTOM)
and Custom Connector apps (CUSTOM_CONNECTOR).
curl --request POST \
--url https://api.opal.dev/v1/apps \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "My Push-only App",
"description": "Bookkeeping app for internal tools.",
"admin_owner_id": "7c86c85d-0651-43e2-a748-d69d658418e8",
"app_type": "OKTA_DIRECTORY",
"visibility": "GLOBAL",
"visibility_group_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"import_visibility": "GLOBAL"
}
'import requests
url = "https://api.opal.dev/v1/apps"
payload = {
"name": "My Push-only App",
"description": "Bookkeeping app for internal tools.",
"admin_owner_id": "7c86c85d-0651-43e2-a748-d69d658418e8",
"app_type": "OKTA_DIRECTORY",
"visibility": "GLOBAL",
"visibility_group_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"import_visibility": "GLOBAL"
}
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({
name: 'My Push-only App',
description: 'Bookkeeping app for internal tools.',
admin_owner_id: '7c86c85d-0651-43e2-a748-d69d658418e8',
app_type: 'OKTA_DIRECTORY',
visibility: 'GLOBAL',
visibility_group_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
import_visibility: 'GLOBAL'
})
};
fetch('https://api.opal.dev/v1/apps', 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://api.opal.dev/v1/apps",
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([
'name' => 'My Push-only App',
'description' => 'Bookkeeping app for internal tools.',
'admin_owner_id' => '7c86c85d-0651-43e2-a748-d69d658418e8',
'app_type' => 'OKTA_DIRECTORY',
'visibility' => 'GLOBAL',
'visibility_group_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'import_visibility' => 'GLOBAL'
]),
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://api.opal.dev/v1/apps"
payload := strings.NewReader("{\n \"name\": \"My Push-only App\",\n \"description\": \"Bookkeeping app for internal tools.\",\n \"admin_owner_id\": \"7c86c85d-0651-43e2-a748-d69d658418e8\",\n \"app_type\": \"OKTA_DIRECTORY\",\n \"visibility\": \"GLOBAL\",\n \"visibility_group_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"import_visibility\": \"GLOBAL\"\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://api.opal.dev/v1/apps")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"My Push-only App\",\n \"description\": \"Bookkeeping app for internal tools.\",\n \"admin_owner_id\": \"7c86c85d-0651-43e2-a748-d69d658418e8\",\n \"app_type\": \"OKTA_DIRECTORY\",\n \"visibility\": \"GLOBAL\",\n \"visibility_group_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"import_visibility\": \"GLOBAL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opal.dev/v1/apps")
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 \"name\": \"My Push-only App\",\n \"description\": \"Bookkeeping app for internal tools.\",\n \"admin_owner_id\": \"7c86c85d-0651-43e2-a748-d69d658418e8\",\n \"app_type\": \"OKTA_DIRECTORY\",\n \"visibility\": \"GLOBAL\",\n \"visibility_group_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"import_visibility\": \"GLOBAL\"\n}"
response = http.request(request)
puts response.read_body{
"app_id": "f454d283-ca87-4a8a-bdbb-df212eca5353",
"name": "Okta Org",
"description": "Okta directory for the engineering team.",
"admin_owner_id": "7c86c85d-0651-43e2-a748-d69d658418e8",
"app_type": "OKTA_DIRECTORY"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Information needed to create an app. Currently supports only Push-only
apps (CUSTOM) and Custom Connector apps (CUSTOM_CONNECTOR).
The name of the app.
"My Push-only App"
A description of the app.
"Bookkeeping app for internal tools."
The ID of the owner of the app.
"7c86c85d-0651-43e2-a748-d69d658418e8"
The type of the app. Must be CUSTOM (Push-only App) or
CUSTOM_CONNECTOR.
ACTIVE_DIRECTORY, ANTHROPIC, AZURE_AD, AWS, AWS_SSO, CLICKHOUSE, COUPA, CURSOR, CUSTOM, CONFLUENCE, CUSTOM_CONNECTOR, DATABRICKS, DATASTAX_ASTRA, ALICLOUD, DEVIN, DOCUSIGN, DUO, GCP, GIT_HUB, GIT_LAB, GOOGLE_GROUPS, GOOGLE_WORKSPACE, GRAFANA, HUBSPOT, ILEVEL, INCIDENTIO, JIRA, LDAP, LINEAR, MARIADB, MONGO, MONGO_ATLAS, MYSQL, NETSUITE, DATADOG, OKTA_CIAM, OKTA_DIRECTORY, OPENAI_PLATFORM, OPAL, ORACLE_FUSION, PAGERDUTY, POSTGRES, ROOTLY, SALESFORCE, SNOWFLAKE, SLACK, TABLEAU, TAILSCALE, TELEPORT, TWINGATE, VAULT, WORKDAY, ZENDESK, ZOOM, RAMP, WRIKE, VERCEL, AXIOM "OKTA_DIRECTORY"
The visibility of the app. Defaults to GLOBAL when omitted.
GLOBAL, LIMITED "GLOBAL"
The IDs of groups that can see this app when visibility is LIMITED.
The visibility of imported items. Defaults to GLOBAL when omitted.
GLOBAL, LIMITED "GLOBAL"
Required when app_type is CUSTOM_CONNECTOR. Must not be set when
app_type is CUSTOM.
Show child attributes
Show child attributes
Response
The app that was created.
App Object
Description
The App object is used to represent an app to an application.
Usage Example
List from the GET Apps endpoint.
The ID of the app.
"f454d283-ca87-4a8a-bdbb-df212eca5353"
The name of the app.
"Okta Org"
A description of the app.
"Okta directory for the engineering team."
The ID of the owner of the app.
"7c86c85d-0651-43e2-a748-d69d658418e8"
The type of an app.
ACTIVE_DIRECTORY, ANTHROPIC, AZURE_AD, AWS, AWS_SSO, CLICKHOUSE, COUPA, CURSOR, CUSTOM, CONFLUENCE, CUSTOM_CONNECTOR, DATABRICKS, DATASTAX_ASTRA, ALICLOUD, DEVIN, DOCUSIGN, DUO, GCP, GIT_HUB, GIT_LAB, GOOGLE_GROUPS, GOOGLE_WORKSPACE, GRAFANA, HUBSPOT, ILEVEL, INCIDENTIO, JIRA, LDAP, LINEAR, MARIADB, MONGO, MONGO_ATLAS, MYSQL, NETSUITE, DATADOG, OKTA_CIAM, OKTA_DIRECTORY, OPENAI_PLATFORM, OPAL, ORACLE_FUSION, PAGERDUTY, POSTGRES, ROOTLY, SALESFORCE, SNOWFLAKE, SLACK, TABLEAU, TAILSCALE, TELEPORT, TWINGATE, VAULT, WORKDAY, ZENDESK, ZOOM, RAMP, WRIKE, VERCEL, AXIOM "OKTA_DIRECTORY"
The visibility level of the entity.
GLOBAL, LIMITED "GLOBAL"
Validation checks of an apps' configuration and permissions.
Show child attributes
Show child attributes
Configuration for a Custom Connector app. Does not include the signing secret; secrets are write-only and never returned by the API.
Show child attributes
Show child attributes
Was this page helpful?