curl --request PUT \
--url https://api-dev.narrative.io/v2/apps/{app_slug}/manifest \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"manifest_version": "1.0.0",
"display_name": "Facebook Connector",
"capabilities": [],
"api_url": "https://facebook-connector.example.com/api",
"required_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"app_token_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"ui_url": "https://facebook-connector.example.com",
"launch_path": {
"type": "native",
"path": "connector-settings"
},
"embedding": {
"device_permissions": [
"<string>"
],
"initial_guest_path": "/"
},
"pages": [
{
"eligible_path": "connector-settings",
"navigation": {
"title": "Connector Settings",
"icon": "display-list",
"pill": "<string>",
"show_as_button": true,
"button_variant": "<string>"
},
"visible_path": "<string>"
}
],
"listing": {
"short_description": "<string>",
"long_description": "<string>",
"meta_description": "<string>",
"background_color": "#E7E3CE",
"merchandising_sections": [
{
"title": "<string>",
"subtitle": "<string>",
"order": 123,
"image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
}
}
],
"tags": [
"<string>"
]
}
}
'import requests
url = "https://api-dev.narrative.io/v2/apps/{app_slug}/manifest"
payload = {
"manifest_version": "1.0.0",
"display_name": "Facebook Connector",
"capabilities": [],
"api_url": "https://facebook-connector.example.com/api",
"required_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"app_token_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"ui_url": "https://facebook-connector.example.com",
"launch_path": {
"type": "native",
"path": "connector-settings"
},
"embedding": {
"device_permissions": ["<string>"],
"initial_guest_path": "/"
},
"pages": [
{
"eligible_path": "connector-settings",
"navigation": {
"title": "Connector Settings",
"icon": "display-list",
"pill": "<string>",
"show_as_button": True,
"button_variant": "<string>"
},
"visible_path": "<string>"
}
],
"listing": {
"short_description": "<string>",
"long_description": "<string>",
"meta_description": "<string>",
"background_color": "#E7E3CE",
"merchandising_sections": [
{
"title": "<string>",
"subtitle": "<string>",
"order": 123,
"image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
}
}
],
"tags": ["<string>"]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
manifest_version: '1.0.0',
display_name: 'Facebook Connector',
capabilities: [],
api_url: 'https://facebook-connector.example.com/api',
required_scopes: [{resource: 'datasets', access: 'read'}],
app_token_scopes: [{resource: 'datasets', access: 'read'}],
ui_url: 'https://facebook-connector.example.com',
launch_path: {type: 'native', path: 'connector-settings'},
embedding: {device_permissions: ['<string>'], initial_guest_path: '/'},
pages: [
{
eligible_path: 'connector-settings',
navigation: {
title: 'Connector Settings',
icon: 'display-list',
pill: '<string>',
show_as_button: true,
button_variant: '<string>'
},
visible_path: '<string>'
}
],
listing: {
short_description: '<string>',
long_description: '<string>',
meta_description: '<string>',
background_color: '#E7E3CE',
merchandising_sections: [
{
title: '<string>',
subtitle: '<string>',
order: 123,
image: {
name: '<string>',
image: '<string>',
image_type: 'image/svg+xml',
alt_text: '<string>',
width: 123,
height: 123
}
}
],
tags: ['<string>']
}
})
};
fetch('https://api-dev.narrative.io/v2/apps/{app_slug}/manifest', 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-dev.narrative.io/v2/apps/{app_slug}/manifest",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'manifest_version' => '1.0.0',
'display_name' => 'Facebook Connector',
'capabilities' => [
],
'api_url' => 'https://facebook-connector.example.com/api',
'required_scopes' => [
[
'resource' => 'datasets',
'access' => 'read'
]
],
'app_token_scopes' => [
[
'resource' => 'datasets',
'access' => 'read'
]
],
'ui_url' => 'https://facebook-connector.example.com',
'launch_path' => [
'type' => 'native',
'path' => 'connector-settings'
],
'embedding' => [
'device_permissions' => [
'<string>'
],
'initial_guest_path' => '/'
],
'pages' => [
[
'eligible_path' => 'connector-settings',
'navigation' => [
'title' => 'Connector Settings',
'icon' => 'display-list',
'pill' => '<string>',
'show_as_button' => true,
'button_variant' => '<string>'
],
'visible_path' => '<string>'
]
],
'listing' => [
'short_description' => '<string>',
'long_description' => '<string>',
'meta_description' => '<string>',
'background_color' => '#E7E3CE',
'merchandising_sections' => [
[
'title' => '<string>',
'subtitle' => '<string>',
'order' => 123,
'image' => [
'name' => '<string>',
'image' => '<string>',
'image_type' => 'image/svg+xml',
'alt_text' => '<string>',
'width' => 123,
'height' => 123
]
]
],
'tags' => [
'<string>'
]
]
]),
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-dev.narrative.io/v2/apps/{app_slug}/manifest"
payload := strings.NewReader("{\n \"manifest_version\": \"1.0.0\",\n \"display_name\": \"Facebook Connector\",\n \"capabilities\": [],\n \"api_url\": \"https://facebook-connector.example.com/api\",\n \"required_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"app_token_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"ui_url\": \"https://facebook-connector.example.com\",\n \"launch_path\": {\n \"type\": \"native\",\n \"path\": \"connector-settings\"\n },\n \"embedding\": {\n \"device_permissions\": [\n \"<string>\"\n ],\n \"initial_guest_path\": \"/\"\n },\n \"pages\": [\n {\n \"eligible_path\": \"connector-settings\",\n \"navigation\": {\n \"title\": \"Connector Settings\",\n \"icon\": \"display-list\",\n \"pill\": \"<string>\",\n \"show_as_button\": true,\n \"button_variant\": \"<string>\"\n },\n \"visible_path\": \"<string>\"\n }\n ],\n \"listing\": {\n \"short_description\": \"<string>\",\n \"long_description\": \"<string>\",\n \"meta_description\": \"<string>\",\n \"background_color\": \"#E7E3CE\",\n \"merchandising_sections\": [\n {\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"order\": 123,\n \"image\": {\n \"name\": \"<string>\",\n \"image\": \"<string>\",\n \"image_type\": \"image/svg+xml\",\n \"alt_text\": \"<string>\",\n \"width\": 123,\n \"height\": 123\n }\n }\n ],\n \"tags\": [\n \"<string>\"\n ]\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api-dev.narrative.io/v2/apps/{app_slug}/manifest")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"manifest_version\": \"1.0.0\",\n \"display_name\": \"Facebook Connector\",\n \"capabilities\": [],\n \"api_url\": \"https://facebook-connector.example.com/api\",\n \"required_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"app_token_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"ui_url\": \"https://facebook-connector.example.com\",\n \"launch_path\": {\n \"type\": \"native\",\n \"path\": \"connector-settings\"\n },\n \"embedding\": {\n \"device_permissions\": [\n \"<string>\"\n ],\n \"initial_guest_path\": \"/\"\n },\n \"pages\": [\n {\n \"eligible_path\": \"connector-settings\",\n \"navigation\": {\n \"title\": \"Connector Settings\",\n \"icon\": \"display-list\",\n \"pill\": \"<string>\",\n \"show_as_button\": true,\n \"button_variant\": \"<string>\"\n },\n \"visible_path\": \"<string>\"\n }\n ],\n \"listing\": {\n \"short_description\": \"<string>\",\n \"long_description\": \"<string>\",\n \"meta_description\": \"<string>\",\n \"background_color\": \"#E7E3CE\",\n \"merchandising_sections\": [\n {\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"order\": 123,\n \"image\": {\n \"name\": \"<string>\",\n \"image\": \"<string>\",\n \"image_type\": \"image/svg+xml\",\n \"alt_text\": \"<string>\",\n \"width\": 123,\n \"height\": 123\n }\n }\n ],\n \"tags\": [\n \"<string>\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.narrative.io/v2/apps/{app_slug}/manifest")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"manifest_version\": \"1.0.0\",\n \"display_name\": \"Facebook Connector\",\n \"capabilities\": [],\n \"api_url\": \"https://facebook-connector.example.com/api\",\n \"required_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"app_token_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"ui_url\": \"https://facebook-connector.example.com\",\n \"launch_path\": {\n \"type\": \"native\",\n \"path\": \"connector-settings\"\n },\n \"embedding\": {\n \"device_permissions\": [\n \"<string>\"\n ],\n \"initial_guest_path\": \"/\"\n },\n \"pages\": [\n {\n \"eligible_path\": \"connector-settings\",\n \"navigation\": {\n \"title\": \"Connector Settings\",\n \"icon\": \"display-list\",\n \"pill\": \"<string>\",\n \"show_as_button\": true,\n \"button_variant\": \"<string>\"\n },\n \"visible_path\": \"<string>\"\n }\n ],\n \"listing\": {\n \"short_description\": \"<string>\",\n \"long_description\": \"<string>\",\n \"meta_description\": \"<string>\",\n \"background_color\": \"#E7E3CE\",\n \"merchandising_sections\": [\n {\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"order\": 123,\n \"image\": {\n \"name\": \"<string>\",\n \"image\": \"<string>\",\n \"image_type\": \"image/svg+xml\",\n \"alt_text\": \"<string>\",\n \"width\": 123,\n \"height\": 123\n }\n }\n ],\n \"tags\": [\n \"<string>\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"type": "owned",
"id": 42,
"slug": "facebook_connector",
"status": "pending",
"manifest": {
"manifest_version": "1.0.0",
"display_name": "Facebook Connector",
"capabilities": [
"destination_connector"
],
"api_url": "https://facebook-connector.example.com/api",
"required_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"app_token_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"ui_url": "https://facebook-connector.example.com",
"launch_path": {
"type": "native",
"path": "connector-settings"
},
"embedding": {
"device_permissions": [
"<string>"
],
"initial_guest_path": "/"
},
"pages": [
{
"eligible_path": "connector-settings",
"navigation": {
"title": "Connector Settings",
"icon": "display-list",
"pill": "<string>",
"show_as_button": true,
"button_variant": "<string>"
},
"visible_path": "<string>"
}
],
"listing": {
"headlines": {
"tagline": "<string>",
"body": "<string>"
},
"short_description": "<string>",
"long_description": "<string>",
"meta_description": "<string>",
"icon": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
},
"headline_image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
},
"background_color": "#E7E3CE",
"merchandising_sections": [
{
"title": "<string>",
"subtitle": "<string>",
"order": 123,
"image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
}
}
],
"developer_information": {
"name": "<string>",
"website": "<string>",
"support_email": "<string>",
"privacy_policy": "<string>",
"support_website": "<string>"
},
"tags": [
"<string>"
]
}
},
"client_id": "85b558340b635861575c462a10df3bd5",
"created_at": "2026-09-24T17:21:03.120581",
"updated_at": "2026-09-24T17:21:03.120581"
}{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}Replace an app's manifest
Replaces the whole manifest: any field left out is cleared. The manifest is validated at the app’s current status, so an active app must keep its listing card complete.
curl --request PUT \
--url https://api-dev.narrative.io/v2/apps/{app_slug}/manifest \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"manifest_version": "1.0.0",
"display_name": "Facebook Connector",
"capabilities": [],
"api_url": "https://facebook-connector.example.com/api",
"required_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"app_token_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"ui_url": "https://facebook-connector.example.com",
"launch_path": {
"type": "native",
"path": "connector-settings"
},
"embedding": {
"device_permissions": [
"<string>"
],
"initial_guest_path": "/"
},
"pages": [
{
"eligible_path": "connector-settings",
"navigation": {
"title": "Connector Settings",
"icon": "display-list",
"pill": "<string>",
"show_as_button": true,
"button_variant": "<string>"
},
"visible_path": "<string>"
}
],
"listing": {
"short_description": "<string>",
"long_description": "<string>",
"meta_description": "<string>",
"background_color": "#E7E3CE",
"merchandising_sections": [
{
"title": "<string>",
"subtitle": "<string>",
"order": 123,
"image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
}
}
],
"tags": [
"<string>"
]
}
}
'import requests
url = "https://api-dev.narrative.io/v2/apps/{app_slug}/manifest"
payload = {
"manifest_version": "1.0.0",
"display_name": "Facebook Connector",
"capabilities": [],
"api_url": "https://facebook-connector.example.com/api",
"required_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"app_token_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"ui_url": "https://facebook-connector.example.com",
"launch_path": {
"type": "native",
"path": "connector-settings"
},
"embedding": {
"device_permissions": ["<string>"],
"initial_guest_path": "/"
},
"pages": [
{
"eligible_path": "connector-settings",
"navigation": {
"title": "Connector Settings",
"icon": "display-list",
"pill": "<string>",
"show_as_button": True,
"button_variant": "<string>"
},
"visible_path": "<string>"
}
],
"listing": {
"short_description": "<string>",
"long_description": "<string>",
"meta_description": "<string>",
"background_color": "#E7E3CE",
"merchandising_sections": [
{
"title": "<string>",
"subtitle": "<string>",
"order": 123,
"image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
}
}
],
"tags": ["<string>"]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
manifest_version: '1.0.0',
display_name: 'Facebook Connector',
capabilities: [],
api_url: 'https://facebook-connector.example.com/api',
required_scopes: [{resource: 'datasets', access: 'read'}],
app_token_scopes: [{resource: 'datasets', access: 'read'}],
ui_url: 'https://facebook-connector.example.com',
launch_path: {type: 'native', path: 'connector-settings'},
embedding: {device_permissions: ['<string>'], initial_guest_path: '/'},
pages: [
{
eligible_path: 'connector-settings',
navigation: {
title: 'Connector Settings',
icon: 'display-list',
pill: '<string>',
show_as_button: true,
button_variant: '<string>'
},
visible_path: '<string>'
}
],
listing: {
short_description: '<string>',
long_description: '<string>',
meta_description: '<string>',
background_color: '#E7E3CE',
merchandising_sections: [
{
title: '<string>',
subtitle: '<string>',
order: 123,
image: {
name: '<string>',
image: '<string>',
image_type: 'image/svg+xml',
alt_text: '<string>',
width: 123,
height: 123
}
}
],
tags: ['<string>']
}
})
};
fetch('https://api-dev.narrative.io/v2/apps/{app_slug}/manifest', 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-dev.narrative.io/v2/apps/{app_slug}/manifest",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'manifest_version' => '1.0.0',
'display_name' => 'Facebook Connector',
'capabilities' => [
],
'api_url' => 'https://facebook-connector.example.com/api',
'required_scopes' => [
[
'resource' => 'datasets',
'access' => 'read'
]
],
'app_token_scopes' => [
[
'resource' => 'datasets',
'access' => 'read'
]
],
'ui_url' => 'https://facebook-connector.example.com',
'launch_path' => [
'type' => 'native',
'path' => 'connector-settings'
],
'embedding' => [
'device_permissions' => [
'<string>'
],
'initial_guest_path' => '/'
],
'pages' => [
[
'eligible_path' => 'connector-settings',
'navigation' => [
'title' => 'Connector Settings',
'icon' => 'display-list',
'pill' => '<string>',
'show_as_button' => true,
'button_variant' => '<string>'
],
'visible_path' => '<string>'
]
],
'listing' => [
'short_description' => '<string>',
'long_description' => '<string>',
'meta_description' => '<string>',
'background_color' => '#E7E3CE',
'merchandising_sections' => [
[
'title' => '<string>',
'subtitle' => '<string>',
'order' => 123,
'image' => [
'name' => '<string>',
'image' => '<string>',
'image_type' => 'image/svg+xml',
'alt_text' => '<string>',
'width' => 123,
'height' => 123
]
]
],
'tags' => [
'<string>'
]
]
]),
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-dev.narrative.io/v2/apps/{app_slug}/manifest"
payload := strings.NewReader("{\n \"manifest_version\": \"1.0.0\",\n \"display_name\": \"Facebook Connector\",\n \"capabilities\": [],\n \"api_url\": \"https://facebook-connector.example.com/api\",\n \"required_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"app_token_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"ui_url\": \"https://facebook-connector.example.com\",\n \"launch_path\": {\n \"type\": \"native\",\n \"path\": \"connector-settings\"\n },\n \"embedding\": {\n \"device_permissions\": [\n \"<string>\"\n ],\n \"initial_guest_path\": \"/\"\n },\n \"pages\": [\n {\n \"eligible_path\": \"connector-settings\",\n \"navigation\": {\n \"title\": \"Connector Settings\",\n \"icon\": \"display-list\",\n \"pill\": \"<string>\",\n \"show_as_button\": true,\n \"button_variant\": \"<string>\"\n },\n \"visible_path\": \"<string>\"\n }\n ],\n \"listing\": {\n \"short_description\": \"<string>\",\n \"long_description\": \"<string>\",\n \"meta_description\": \"<string>\",\n \"background_color\": \"#E7E3CE\",\n \"merchandising_sections\": [\n {\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"order\": 123,\n \"image\": {\n \"name\": \"<string>\",\n \"image\": \"<string>\",\n \"image_type\": \"image/svg+xml\",\n \"alt_text\": \"<string>\",\n \"width\": 123,\n \"height\": 123\n }\n }\n ],\n \"tags\": [\n \"<string>\"\n ]\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api-dev.narrative.io/v2/apps/{app_slug}/manifest")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"manifest_version\": \"1.0.0\",\n \"display_name\": \"Facebook Connector\",\n \"capabilities\": [],\n \"api_url\": \"https://facebook-connector.example.com/api\",\n \"required_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"app_token_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"ui_url\": \"https://facebook-connector.example.com\",\n \"launch_path\": {\n \"type\": \"native\",\n \"path\": \"connector-settings\"\n },\n \"embedding\": {\n \"device_permissions\": [\n \"<string>\"\n ],\n \"initial_guest_path\": \"/\"\n },\n \"pages\": [\n {\n \"eligible_path\": \"connector-settings\",\n \"navigation\": {\n \"title\": \"Connector Settings\",\n \"icon\": \"display-list\",\n \"pill\": \"<string>\",\n \"show_as_button\": true,\n \"button_variant\": \"<string>\"\n },\n \"visible_path\": \"<string>\"\n }\n ],\n \"listing\": {\n \"short_description\": \"<string>\",\n \"long_description\": \"<string>\",\n \"meta_description\": \"<string>\",\n \"background_color\": \"#E7E3CE\",\n \"merchandising_sections\": [\n {\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"order\": 123,\n \"image\": {\n \"name\": \"<string>\",\n \"image\": \"<string>\",\n \"image_type\": \"image/svg+xml\",\n \"alt_text\": \"<string>\",\n \"width\": 123,\n \"height\": 123\n }\n }\n ],\n \"tags\": [\n \"<string>\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.narrative.io/v2/apps/{app_slug}/manifest")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"manifest_version\": \"1.0.0\",\n \"display_name\": \"Facebook Connector\",\n \"capabilities\": [],\n \"api_url\": \"https://facebook-connector.example.com/api\",\n \"required_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"app_token_scopes\": [\n {\n \"resource\": \"datasets\",\n \"access\": \"read\"\n }\n ],\n \"ui_url\": \"https://facebook-connector.example.com\",\n \"launch_path\": {\n \"type\": \"native\",\n \"path\": \"connector-settings\"\n },\n \"embedding\": {\n \"device_permissions\": [\n \"<string>\"\n ],\n \"initial_guest_path\": \"/\"\n },\n \"pages\": [\n {\n \"eligible_path\": \"connector-settings\",\n \"navigation\": {\n \"title\": \"Connector Settings\",\n \"icon\": \"display-list\",\n \"pill\": \"<string>\",\n \"show_as_button\": true,\n \"button_variant\": \"<string>\"\n },\n \"visible_path\": \"<string>\"\n }\n ],\n \"listing\": {\n \"short_description\": \"<string>\",\n \"long_description\": \"<string>\",\n \"meta_description\": \"<string>\",\n \"background_color\": \"#E7E3CE\",\n \"merchandising_sections\": [\n {\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"order\": 123,\n \"image\": {\n \"name\": \"<string>\",\n \"image\": \"<string>\",\n \"image_type\": \"image/svg+xml\",\n \"alt_text\": \"<string>\",\n \"width\": 123,\n \"height\": 123\n }\n }\n ],\n \"tags\": [\n \"<string>\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"type": "owned",
"id": 42,
"slug": "facebook_connector",
"status": "pending",
"manifest": {
"manifest_version": "1.0.0",
"display_name": "Facebook Connector",
"capabilities": [
"destination_connector"
],
"api_url": "https://facebook-connector.example.com/api",
"required_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"app_token_scopes": [
{
"resource": "datasets",
"access": "read"
}
],
"ui_url": "https://facebook-connector.example.com",
"launch_path": {
"type": "native",
"path": "connector-settings"
},
"embedding": {
"device_permissions": [
"<string>"
],
"initial_guest_path": "/"
},
"pages": [
{
"eligible_path": "connector-settings",
"navigation": {
"title": "Connector Settings",
"icon": "display-list",
"pill": "<string>",
"show_as_button": true,
"button_variant": "<string>"
},
"visible_path": "<string>"
}
],
"listing": {
"headlines": {
"tagline": "<string>",
"body": "<string>"
},
"short_description": "<string>",
"long_description": "<string>",
"meta_description": "<string>",
"icon": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
},
"headline_image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
},
"background_color": "#E7E3CE",
"merchandising_sections": [
{
"title": "<string>",
"subtitle": "<string>",
"order": 123,
"image": {
"name": "<string>",
"image": "<string>",
"image_type": "image/svg+xml",
"alt_text": "<string>",
"width": 123,
"height": 123
}
}
],
"developer_information": {
"name": "<string>",
"website": "<string>",
"support_email": "<string>",
"privacy_policy": "<string>",
"support_website": "<string>"
},
"tags": [
"<string>"
]
}
},
"client_id": "85b558340b635861575c462a10df3bd5",
"created_at": "2026-09-24T17:21:03.120581",
"updated_at": "2026-09-24T17:21:03.120581"
}{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The app's slug. The app's unique, permanent name: 1-256 lowercase letters, digits or underscores. Chosen at creation and never changes. Slugs are unique regardless of case, so a slug that differs from an existing one only by case is taken.
^[a-z0-9_]{1,256}$"facebook_connector"
Body
What the app is, what it can do, and how it is listed. Only manifest_version and display_name are required;
everything else may be left out while the app is pending. An active app must also fill the listing card:
short_description, long_description, icon, headline_image, background_color and
developer_information.
The manifest format. 1.0.0 is the only supported version.
1.0.0 The app's name as shown to users. Non-empty, at most 256 characters.
"Facebook Connector"
destination_connector: delivers data to an external destination.model_connector: connects a model.connector_api: implements the connector API atapi_url, which Narrative calls.
destination_connector, model_connector, connector_api The app's own API. Required when capabilities includes connector_api. Must be an absolute https URL.
"https://facebook-connector.example.com/api"
The permissions an installing company grants the app. admin access is not allowed.
Show child attributes
Show child attributes
The permissions of tokens issued to the app itself through POST /oauth/token. admin access is not allowed.
Show child attributes
Show child attributes
Where the app's UI is served. Must be an absolute https URL.
"https://facebook-connector.example.com"
Where opening the app takes the user.
- Option 1
- Option 2
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
How the app appears in the marketplace.
Show child attributes
Show child attributes
Response
OK
owned The app's id. Installations refer to the app by it.
42
The app's unique, permanent name: 1-256 lowercase letters, digits or underscores. Chosen at creation and never changes. Slugs are unique regardless of case, so a slug that differs from an existing one only by case is taken.
^[a-z0-9_]{1,256}$"facebook_connector"
pending: visible to and installable by the owning company only.active: visible to and installable by every company.archived: visible to nobody.
pending, active, archived What the app is, what it can do, and how it is listed. Only manifest_version and display_name are required;
everything else may be left out while the app is pending. An active app must also fill the listing card:
short_description, long_description, icon, headline_image, background_color and
developer_information.
Show child attributes
Show child attributes
The app's OAuth client id, hex-encoded — the form POST /oauth/token accepts.
"85b558340b635861575c462a10df3bd5"
An ISO-8601 local date-time in UTC, without an offset.
"2026-09-24T17:21:03.120581"
An ISO-8601 local date-time in UTC, without an offset.
"2026-09-24T17:21:03.120581"
Was this page helpful?

