Core / Elements
Elements
Create, read, update, and delete the objects on a zone canvas: shapes, connectors, group shapes, frames, and their text.
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes
Get the shapes in a zone
Get the shapes in a zone
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"total_count": 3,
"elements": [
{
"shape": {
"shape": {
"flowchart": {
"type": "PROCESS"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "a2893ee3-3085-5215-9254-e610c8589892",
"portions": [
{
"style": {
"fontweight": "NORMAL",
"size": 18,
"color": {
"rgb": {}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "Process"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 10,
"bottom": 5,
"right": 10
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 440,
"left": 40,
"width": 200,
"height": 120
},
"fills": [
{
"solid": {
"color": {
"rgb": {
"red": 76,
"green": 175,
"blue": 80
}
}
}
}
]
}
}
},
"id": "8740168d-dea1-58bc-b551-ed8847fa9ef2"
},
{
"shape": {
"shape": {
"block_arrow": {
"single_arrow": {}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "64f7c556-37f0-5f0a-9881-8a582d18949e",
"portions": [
{
"style": {
"fontweight": "NORMAL",
"size": 18,
"color": {
"rgb": {}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "Next"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 10,
"bottom": 5,
"right": 10
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 440,
"left": 280,
"width": 200,
"height": 120
},
"fills": [
{
"solid": {
"color": {
"rgb": {
"red": 255,
"green": 87,
"blue": 34
}
}
}
}
]
}
}
},
"id": "d2f8315c-1743-5320-9287-b4574fdd8b8d"
},
{
"shape": {
"shape": {
"flowchart": {
"type": "DECISION"
},
"text": {
"paragraphs": [
{
"id": "2f2eeccd-410c-419c-acd6-09d74343fa6e",
"portions": [
{
"style": {
"fontweight": "NORMAL"
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 10,
"bottom": 5,
"right": 10
}
}
},
"properties": {
"layout": {
"top": 40,
"left": 520,
"width": 200,
"height": 120
}
}
}
},
"id": "44444444-4444-5444-9444-444444444444"
}
]
},
"message": "Shapes fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/0FFDBC10-542D-4DB4-BA29-76A11200136E/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes
Insert one or more shapes into a zone
Insert one or more shapes into a zone
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Shape elements to insert (min 1, max 1) | |
| shape REQUIRED | object | Shape (mandatory for shape insert) | |
| shape | object | Standard shape | |
| callout | object | Callout shape one of one of these — choosing this clears the others | |
| type | string |
CalloutType enum (max length 40)
LINERECTANGLE_CALLOUTROUNDED_RECTANGLE_CALLOUTOVAL_CALLOUTCLOUD_CALLOUT
|
|
| mathematical_symbol | object | Mathematical symbol one of one of these — choosing this clears the others | |
| type | string |
MathematicalSymbolType enum (max length 10)
PLUSMINUSMULTIPLYDIVIDEEQUALNOT_EQUAL
|
|
| star | object | Star shape one of one of these — choosing this clears the others | |
| ribbon | object | Ribbon variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| scroll | object | Scroll variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
StarType enum (max length 15)
EXPLOSIONPOINTRIBBONSCROLLWAVE
|
|
| point | object | Star point variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| wave | object | Wave variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| custom | object | Custom path shape one of one of these — choosing this clears the others | |
| paths REQUIRED | array of object | Shape paths (at least 1 required) (min 1, max 1) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| width | number | Custom shape width | |
| height | number | Custom shape height | |
| text | object | Shape text content one of one of these — choosing this clears the others | |
| placeholder | object | Placeholder binding nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| paragraphs | array of object | Paragraphs (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| properties | object | Text properties (valign, inset, etc.) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| flowchart | object | Flowchart shape one of one of these — choosing this clears the others | |
| type | string |
FlowchartType enum (max length 40)
PREDEFINED_PROCESSINTERNAL_STORAGEDOCUMENTPROCESSALTERNATE_PROCESSDECISIONDATAMULTI_DOCUMENTTERMINATORPREPARATIONMANUAL_INPUTMANUAL_OPERATIONCONNECTOROFFPAGE_CONNECTORPUNCHED_CARDPUNCHED_TAPESUMMING_JUNCTIONORCOLLATESORTEXTRACTMERGESTORED_DATADELAYSEQUENTIAL_ACCESS_STORAGEMAGNETIC_DISKDIRECT_ACCESS_STORAGEDISPLAY
|
|
| block_arrow | object | Block arrow shape one of one of these — choosing this clears the others | |
| double_arrow | object | Double arrow direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| curved_arrow | object | Curved arrow direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| arrow_callout | object | Arrow callout direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
BlockArrowType enum (max length 30)
SINGLECURVEDCALLOUTDOUBLEQUADLEFT_RIGHT_UPBENTU_TURNBENT_UPSTRIPED_RIGHTNOTCHED_RIGHTPENTAGON_ARROWCHEVRONLEFT_RIGHT_CALLOUTQUAD_CALLOUT
|
|
| single_arrow | object | Single arrow direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| placeholder | object | Placeholder type one of one of these — choosing this clears the others | |
| type REQUIRED | string |
PlaceholderType enum (mandatory when placeholder binding is present) (max length 50)
TITLESUBTITLECONTENTIMAGECHARTTABLE
|
|
| basic | object | Basic shape type one of one of these — choosing this clears the others | |
| snip_rectangle | object | Snip rectangle params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| rounded_rectangle | object | Rounded rectangle params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| bracket | object | Bracket params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| brace | object | Brace params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
BasicShapeType enum (max length 30)
RECTANGLEROUNDED_RECTANGLESNIP_RECTANGLEROUND_SNIP_RECTANGLETRIANGLEOVALTRAPEZOIDPENTAGONHEXAGONDIAMONDPARALLELOGRAMHEPTAGONOCTAGONDECAGONPIECHORDTEARDROPFRAMEHALF_FRAMEL_SHAPEDIAGONAL_STRIPECROSSPLAQUECANCUBEBEVELDONUTNO_SYMBOLBLOCK_ARCFOLDED_CORNERSMILEYHEARTLIGHTNING_BOLTSUNMOONCLOUDARCBRACKETBRACECLOCK
|
|
| triangle | object | Triangle params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| properties | object | Shape properties (insert) one of one of these — choosing this clears the others | |
| layout | object | Position and size nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| strokes | array of object | Stroke layers (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| fills | array of object | Fill layers (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| name | string | Object name (max length 500) | |
| id REQUIRED | string | Object ID (mandatory, UUID) (max length 200) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"shape\":{\"shape\":{\"callout\":{\"type\":\"LINE\"}}},\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"name\":\"Sample name\"}]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"shape": {"shape": {"callout": {"type": "LINE"}}}, "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "name": "Sample name"}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
Response
Successful response
{
"data": {
"inserted_ids": [
"e4163cc2-1d24-546b-a8a5-6b0817da7887",
"d406b989-45f5-5018-a6b9-4f6671e32527",
"0c568942-223e-5fec-9a5c-1989fe8c5f49",
"5eeac863-9d71-5c23-8b30-6a0bc390b87f",
"facef9f3-94dd-5fb6-bee7-c58cbd9f28b8"
]
},
"message": "Shapes inserted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/0FFDBC10-542D-4DB4-BA29-76A11200136E/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/0FFDBC10-542D-4DB4-BA29-76A11200136E/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes
Update one or more shapes in a zone
Update one or more shapes in a zone
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Per-element shape patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| text | object | Text facet patch (mutations and/or styles) | |
| mutations | array of object | Ordered text mutations (min 2, max 2) | |
| cursor | object | Cursor-scoped insert/delete mutation one of one of these — choosing this clears the others | |
| cursor_index REQUIRED | integer | Cursor index on flattened text | |
| text | string | Text to insert (required when operation=CURSOR_TEXT_OPERATION_INSERT_TEXT) (max length 500000) | |
| operation REQUIRED | string |
Cursor mutation operation (max length 50)
CURSOR_TEXT_OPERATION_UNSPECIFIEDCURSOR_TEXT_OPERATION_INSERT_TEXTCURSOR_TEXT_OPERATION_INSERT_NEWLINECURSOR_TEXT_OPERATION_DELETE_NEWLINE
|
|
| all_text | object | Full-text replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=ALL_TEXT_OPERATION_REPLACE) (max length 500000) | |
| operation REQUIRED | string |
Full-text mutation operation (max length 50)
ALL_TEXT_OPERATION_UNSPECIFIEDALL_TEXT_OPERATION_REPLACEALL_TEXT_OPERATION_DELETE
|
|
| range | object | Range-scoped replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=RANGE_TEXT_OPERATION_REPLACE) (max length 500000) | |
| range REQUIRED | object | Target range in flattened text nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| operation REQUIRED | string |
Range mutation operation (max length 50)
RANGE_TEXT_OPERATION_UNSPECIFIEDRANGE_TEXT_OPERATION_REPLACERANGE_TEXT_OPERATION_DELETE
|
|
| styles | array of object | Text style entries (one applyTextStyle call per entry) (min 2, max 2) | |
| all_text | boolean | Apply style to entire flattened text when true | |
| portion_style | object | Optional portion style patch | |
| fontweight | string |
FontWeight enum (max length 20)
THINEXTRA_LIGHTLIGHTNORMALMEDIUMDEMI_BOLDBOLDHEAVYBLACK
|
|
| size | number | Optional portion font size | |
| color | object | Optional text color patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| underline | boolean | Optional underline toggle | |
| strike | boolean | Optional strike toggle | |
| italic | boolean | Optional italic toggle | |
| font_name | object | Optional font family/style patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| range | object | Apply style within selected range | |
| start_index REQUIRED | integer | Inclusive start index on flattened text (>= 0) | |
| end_index REQUIRED | integer | Exclusive end index on flattened text (> start_index) | |
| paragraph_style | object | Optional paragraph style patch | |
| spacing | object | Optional paragraph spacing patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| level | integer | Optional paragraph level | |
| halign | string |
HorizontalAlignType enum (max length 20)
LEFTCENTERRIGHTJUSTIFY
|
|
| properties | object | Shape properties patch | |
| layout | object | Position and size (PATCH) | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels | |
| strokes | array of object | Stroke layers (PATCH; full replace when present) (min 2, max 2) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (UI subset: Solid/Dashed/Dotted; use fill.no_fill for 'no border') (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Stroke fill (solid or no_fill; no_fill expresses 'no border') | |
| solid | object | Solid stroke fill (oneof variant) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No stroke fill — stroke-off toggle (oneof variant) | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| fills | array of object | Fill layers (PATCH; full replace when present) (min 2, max 2) | |
| solid | object | Solid fill | |
| color REQUIRED | object | Fill color (mandatory) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No fill | |
| gradient | object | Gradient fill | |
| linear | object | Geometry for LINEAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| radial_angular | object | Geometry for RADIAL/ANGULAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| stops REQUIRED | array of object | Gradient stops (minimum 2 required — a gradient needs from/to) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
GradientFillType enum (client renders LINEAR/RADIAL/ANGULAR only) (max length 50)
LINEARRADIALANGULAR
|
|
| alpha | number | Fill alpha / opacity (0.0 - 1.0) |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"text\":{\"mutations\":[{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}},{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}}],\"styles\":[{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}},{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}}]},\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5},\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}},{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}}],\"fills\":[{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5},{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5}]}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "text": {"mutations": {{"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}, {"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}}, "styles": {{"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}, {"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}}}, "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}, "strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}, {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}}, "fills": {{"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}, {"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"id": "CF7D1480-628C-476D-9923-AEE7C5D3C742",
"status": "success"
},
{
"id": "49BA9283-408C-47B4-828D-4E9880A9161F",
"status": "success"
},
{
"id": "339D2634-16D3-4445-A675-4696B8FD4EBB",
"status": "success"
},
{
"id": "269FAC98-B4F5-41D1-9643-6368706BF69E",
"status": "success"
},
{
"id": "A16989F9-5C29-4141-A303-BA07C9A62AE9",
"status": "success"
},
{
"id": "10C43DC2-F3BD-470C-8929-85B593CBE9B1",
"status": "success"
},
{
"id": "04164FA1-35C8-4BE1-840C-78ACDA7CCCB6",
"status": "success"
},
{
"id": "D33D70D0-AEE6-4A8F-B882-546E2E66A6E0",
"status": "success"
}
]
},
"message": "Shapes updated successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1A0B4F55-BF08-4A1F-83B4-BCFC97EE3158/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/0FFDBC10-542D-4DB4-BA29-76A11200136E/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes
Delete one or more shapes from a zone
destructive
Delete one or more shapes from a zone
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"shape_id": "FE0C9EDB-D1BA-446A-A402-5C4CB87F9458",
"status": "success"
},
{
"shape_id": "1F9A7500-7CF3-4E9A-A946-524CD817744B",
"status": "success"
},
{
"shape_id": "937E51FD-6C25-4870-A936-D97522394925",
"status": "success"
}
]
},
"message": "Shapes deleted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/0FFDBC10-542D-4DB4-BA29-76A11200136E/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors
Get the connectors in a zone
Get the connectors in a zone
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"total_count": 3,
"elements": [
{
"connector": {
"connected": {
"first": {
"marker": "DIAMOND",
"shape_id": "6FE655E1-6039-46E1-BECA-30067ED96517"
},
"second": {
"side": "WEST",
"marker": "OVAL",
"shape_id": "8BB93A22-6976-4976-AA4C-417D16BA8876"
}
},
"text": {
"paragraphs": [
{
"style": {
"halign": "CENTER"
},
"id": "a3333333-3333-5333-8333-333333333333",
"portions": [
{
"style": {
"fontweight": "NORMAL"
},
"text": "Curve (diamond → oval)"
}
]
}
],
"properties": {}
},
"type": "CURVE",
"stroke": {
"captype": "CAPROUND",
"width": 3,
"type": "SQUARE_DOT",
"fill": {
"solid": {
"color": {
"rgb": {
"red": 156,
"green": 39,
"blue": 176
}
}
}
}
}
},
"id": "2394a2a8-7984-565a-9e10-bdc399a950de"
},
{
"connector": {
"connected": {
"first": {
"side": "NORTH",
"marker": "OPEN",
"shape_id": "01EEDC0C-45EC-44A3-96F6-740155ACE02C"
},
"second": {
"side": "SOUTH",
"marker": "BLOCK",
"shape_id": "B579FA1E-B4D2-41BC-B543-25B3C1790314"
}
},
"text": {
"paragraphs": [
{
"style": {
"halign": "CENTER"
},
"id": "3ab1987e-7e55-516b-a3c7-5248626bab9c",
"portions": [
{
"style": {
"fontweight": "NORMAL"
},
"text": "Elbow with label"
}
]
}
],
"properties": {}
},
"type": "ELBOW",
"stroke": {
"width": 2,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 76,
"green": 175,
"blue": 80
}
}
}
}
}
},
"id": "0f6bf425-0e92-50f6-bc3d-bfda4773fad8"
},
{
"connector": {
"connected": {
"first": {
"side": "EAST",
"marker": "NONE",
"shape_id": "62E4A270-79F6-44F8-A381-9BDB9718DFC4"
},
"second": {
"side": "WEST",
"marker": "CLASSIC",
"shape_id": "F4F4F69D-2B6E-4241-9A87-79393F0D0F50"
}
},
"text": {
"paragraphs": [
{
"style": {
"halign": "CENTER"
},
"id": "a5555555-5555-5555-8555-555555555555",
"portions": [
{
"style": {
"fontweight": "NORMAL"
},
"text": "Line (point attach)"
}
]
}
],
"properties": {}
},
"stroke": {
"width": 1,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 244,
"green": 67,
"blue": 54
}
}
}
}
}
},
"id": "660e559f-e2fd-5d6e-a69a-e55a9d0e0ed8"
}
]
},
"message": "Connectors fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors
Insert one or more connectors into a zone
Insert one or more connectors into a zone
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Connector elements to insert (min 1, max 1) | |
| connector REQUIRED | object | Connector (mandatory for connector insert) | |
| connected REQUIRED | object | Connected shapes (mandatory) | |
| first REQUIRED | object | Start endpoint (mandatory) | |
| side | string |
ConnectionSide enum (max length 20)
NORTHEASTSOUTHWEST
|
|
| marker | string |
MarkerType enum (max length 50)
NONEOPENBLOCKCLASSICDIAMONDOVAL
|
|
| shape_id REQUIRED | string | Connected shape ID (mandatory, UUID) (max length 200) | |
| point | object | Custom attach point (x, y) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| second REQUIRED | object | End endpoint (mandatory) | |
| side | string |
ConnectionSide enum (max length 20)
NORTHEASTSOUTHWEST
|
|
| marker | string |
MarkerType enum (max length 50)
NONEOPENBLOCKCLASSICDIAMONDOVAL
|
|
| shape_id REQUIRED | string | Connected shape ID (mandatory, UUID) (max length 200) | |
| point | object | Custom attach point (x, y) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| text | object | Connector text | |
| placeholder | object | Placeholder binding | |
| type REQUIRED | string |
PlaceholderType enum (mandatory when placeholder binding is present) (max length 50)
TITLESUBTITLECONTENTIMAGECHARTTABLE
|
|
| paragraphs | array of object | Paragraphs (min 2, max 2) | |
| style | object | Paragraph style nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| id REQUIRED | string | Paragraph identifier (mandatory, UUID) (max length 200) | |
| portions | array of object | Text runs (portions) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| properties | object | Text properties (valign, inset, etc.) | |
| inset | object | Text padding nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| auto_fit | string |
TextBoxAutoFit enum (max length 20)
NONETEXTSHAPE
|
|
| valign | string |
VerticalAlignType enum (max length 20)
MIDDLETOPBOTTOM
|
|
| para_style | object | Default paragraph style nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
ConnectorType enum (max length 20)
LINEELBOWCURVE
|
|
| stroke | object | Connector stroke (solid-fill only) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (connector-UI subset) (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Connector stroke fill (solid-only; no_fill unsupported by UI) | |
| solid REQUIRED | object | Solid stroke fill (only variant supported on connectors) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| name | string | Object name (max length 500) | |
| id REQUIRED | string | Object ID (mandatory, UUID) (max length 200) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"connector\":{\"connected\":{\"first\":{\"shape_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"side\":\"NORTH\",\"marker\":\"NONE\",\"point\":{\"x\":1.5,\"y\":1.5}},\"second\":{\"shape_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"side\":\"NORTH\",\"marker\":\"NONE\",\"point\":{\"x\":1.5,\"y\":1.5}}},\"text\":{\"placeholder\":{\"type\":\"TITLE\"},\"paragraphs\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"style\":{\"spacing\":{},\"level\":1,\"portion_style\":{},\"halign\":\"string\"},\"portions\":[{},{}]},{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"style\":{\"spacing\":{},\"level\":1,\"portion_style\":{},\"halign\":\"string\"},\"portions\":[{},{}]}],\"properties\":{\"inset\":{\"top\":1.5,\"left\":1.5,\"bottom\":1.5,\"right\":1.5},\"auto_fit\":\"NONE\",\"valign\":\"MIDDLE\",\"para_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"portion_style\":{\"fontweight\":\"string\",\"size\":1,\"color\":{},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{}},\"halign\":\"LEFT\"}}},\"type\":\"LINE\",\"stroke\":{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{\"hsb\":{}}},\"alpha\":1.5}}},\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"name\":\"Sample name\"}]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"connector": {"connected": {"first": {"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "side": "NORTH", "marker": "NONE", "point": {"x": 1.5, "y": 1.5}}, "second": {"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "side": "NORTH", "marker": "NONE", "point": {"x": 1.5, "y": 1.5}}}, "text": {"placeholder": {"type": "TITLE"}, "paragraphs": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "style": {"spacing": {}, "level": 1, "portion_style": {}, "halign": "string"}, "portions": {{}, {}}}, {"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "style": {"spacing": {}, "level": 1, "portion_style": {}, "halign": "string"}, "portions": {{}, {}}}}, "properties": {"inset": {"top": 1.5, "left": 1.5, "bottom": 1.5, "right": 1.5}, "auto_fit": "NONE", "valign": "MIDDLE", "para_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "portion_style": {"fontweight": "string", "size": 1, "color": {}, "underline": true, "strike": true, "italic": true, "font_name": {}}, "halign": "LEFT"}}}, "type": "LINE", "stroke": {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {"hsb": {}}}, "alpha": 1.5}}}, "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "name": "Sample name"}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
Response
Successful response
{
"data": {
"inserted_ids": [
"0c1c8b83-2264-544f-a5a6-f0b09ff8df38",
"fe557711-f11e-5cda-add7-62cbb92b93ea",
"2394a2a8-7984-565a-9e10-bdc399a950de",
"0f6bf425-0e92-50f6-bc3d-bfda4773fad8",
"660e559f-e2fd-5d6e-a69a-e55a9d0e0ed8"
]
},
"message": "Connectors inserted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors
Update one or more connectors in a zone
Update one or more connectors in a zone
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Per-element connector patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| text | object | Text label facet patch | |
| mutations | array of object | Ordered text mutations (min 2, max 2) | |
| cursor | object | Cursor-scoped insert/delete mutation one of one of these — choosing this clears the others | |
| cursor_index REQUIRED | integer | Cursor index on flattened text | |
| text | string | Text to insert (required when operation=CURSOR_TEXT_OPERATION_INSERT_TEXT) (max length 500000) | |
| operation REQUIRED | string |
Cursor mutation operation (max length 50)
CURSOR_TEXT_OPERATION_UNSPECIFIEDCURSOR_TEXT_OPERATION_INSERT_TEXTCURSOR_TEXT_OPERATION_INSERT_NEWLINECURSOR_TEXT_OPERATION_DELETE_NEWLINE
|
|
| all_text | object | Full-text replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=ALL_TEXT_OPERATION_REPLACE) (max length 500000) | |
| operation REQUIRED | string |
Full-text mutation operation (max length 50)
ALL_TEXT_OPERATION_UNSPECIFIEDALL_TEXT_OPERATION_REPLACEALL_TEXT_OPERATION_DELETE
|
|
| range | object | Range-scoped replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=RANGE_TEXT_OPERATION_REPLACE) (max length 500000) | |
| range REQUIRED | object | Target range in flattened text nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| operation REQUIRED | string |
Range mutation operation (max length 50)
RANGE_TEXT_OPERATION_UNSPECIFIEDRANGE_TEXT_OPERATION_REPLACERANGE_TEXT_OPERATION_DELETE
|
|
| styles | array of object | Text style entries (one applyTextStyle call per entry) (min 2, max 2) | |
| all_text | boolean | Apply style to entire flattened text when true | |
| portion_style | object | Optional portion style patch | |
| fontweight | string |
FontWeight enum (max length 20)
THINEXTRA_LIGHTLIGHTNORMALMEDIUMDEMI_BOLDBOLDHEAVYBLACK
|
|
| size | number | Optional portion font size | |
| color | object | Optional text color patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| underline | boolean | Optional underline toggle | |
| strike | boolean | Optional strike toggle | |
| italic | boolean | Optional italic toggle | |
| font_name | object | Optional font family/style patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| range | object | Apply style within selected range | |
| start_index REQUIRED | integer | Inclusive start index on flattened text (>= 0) | |
| end_index REQUIRED | integer | Exclusive end index on flattened text (> start_index) | |
| paragraph_style | object | Optional paragraph style patch | |
| spacing | object | Optional paragraph spacing patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| level | integer | Optional paragraph level | |
| halign | string |
HorizontalAlignType enum (max length 20)
LEFTCENTERRIGHTJUSTIFY
|
|
| properties | object | Connector properties patch (strokes only) | |
| strokes | array of object | Connector stroke (PATCH; at most one entry; solid-fill only) (max 1) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (connector-UI subset) (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Connector stroke fill (solid-only; no_fill unsupported by UI) | |
| solid REQUIRED | object | Solid stroke fill (only variant supported on connectors) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"text\":{\"mutations\":[{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}},{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}}],\"styles\":[{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}},{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}}]},\"properties\":{\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"alpha\":1.5}}]}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "text": {"mutations": {{"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}, {"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}}, "styles": {{"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}, {"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}}}, "properties": {"strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "alpha": 1.5}}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"id": "0c1c8b83-2264-544f-a5a6-f0b09ff8df38",
"status": "success"
},
{
"id": "fe557711-f11e-5cda-add7-62cbb92b93ea",
"status": "success"
},
{
"id": "2394a2a8-7984-565a-9e10-bdc399a950de",
"status": "success"
},
{
"id": "0f6bf425-0e92-50f6-bc3d-bfda4773fad8",
"status": "success"
},
{
"id": "660e559f-e2fd-5d6e-a69a-e55a9d0e0ed8",
"status": "success"
}
]
},
"message": "Connectors updated successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors
Delete one or more connectors from a zone
destructive
Delete one or more connectors from a zone
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"shape_id": "2394a2a8-7984-565a-9e10-bdc399a950de",
"status": "success"
},
{
"shape_id": "27613A45-CC58-4EAA-9A13-60C865CE038A",
"status": "success"
},
{
"shape_id": "909813A9-CB90-4F51-BD7A-2D96E3F02B35",
"status": "success"
},
{
"shape_id": "EA5CEF19-D92C-4053-8410-EC29594F3DE6",
"status": "success"
}
]
},
"message": "Connectors deleted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes
Get the group shapes in a zone
Get the group shapes in a zone
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"total_count": 3,
"elements": [
{
"group_shape": {
"layout": {
"top": -1703,
"left": 619,
"width": 1054.31,
"height": 1168.577
},
"objects": [
{
"group_shape": {
"layout": {
"top": -389.62683,
"left": 646.5,
"width": 822.5403,
"height": 544.8257
},
"objects": [
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "FCE56BCB-D8FB-4FBC-B189-72BF17DA39EC",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": -181,
"left": 646.5,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "9B379582-B285-47D2-BF41-DD76EF9FE958"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "5134DB4A-26F3-4CDE-BDF6-D8137DF237F6",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": -389.62683,
"left": 938.52606,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"hsb": {
"saturation": 0.65432,
"brightness": 0.95294,
"hue": 0.0283
}
},
"position": 0.0581
},
{
"color": {
"hsb": {
"saturation": 0.51479,
"brightness": 0.66275,
"hue": 0.48659
}
},
"position": 0.9538
}
],
"type": "RADIAL"
}
}
]
}
}
},
"id": "CC9425EB-D2F8-4439-8303-1CA336058EFB"
},
{
"shape": {
"shape": {
"star": {
"type": "POINT",
"point": {
"type": "SEVEN_POINT"
}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "9E2F0822-8E97-47E9-BB92-58A0F0BD421C",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "start"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 30.198849,
"left": 1344.0403,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "FF0024A2-785E-464D-84CA-36BB1FBB9786"
}
]
},
"id": "35C6DB02-F32C-443A-81EB-5D43E8021B8B"
},
{
"shape": {
"shape": {
"callout": {
"type": "CLOUD_CALLOUT"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "BE56BD69-C330-489A-B98E-7CB175FFBD23",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 396.26172,
"left": 1048.8867,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "77E4DF34-EB21-4F65-B75B-C1E447A12A7A"
},
{
"shape": {
"shape": {
"star": {
"ribbon": {
"type": "DOWN"
},
"type": "RIBBON"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "14C9561F-A2E9-473B-96CC-6382D957AC66",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 653.9501,
"left": 1575.8098,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "05F382AB-F890-4823-81D3-510B0DE675AE"
}
]
},
"id": "18afea79-4ec1-447e-b740-d561a99ec2b0"
},
{
"group_shape": {
"layout": {
"top": 945,
"left": 1234,
"width": 1193.688,
"height": 996.707
},
"objects": [
{
"group_shape": {
"layout": {
"top": 953.56714,
"left": 828.33813,
"width": 383.9535,
"height": 133.41003
},
"objects": [
{
"shape": {
"shape": {
"mathematical_symbol": {
"type": "MULTIPLY"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "43965B02-6A77-49A8-8FE3-B99BE06178C8",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 953.56714,
"left": 1087.2916,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"saturation": 0.44715,
"brightness": 0.96471,
"hue": 0.87273
}
}
}
}
]
}
}
},
"id": "5D923685-27EE-4905-8815-C16F1D8A8DCC"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "99D88FE8-CE11-4894-BFA6-D08D70ABE4E4",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": 961.9772,
"left": 828.33813,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "EEBB15FC-D5CD-47B5-8B0C-9B765616B4B9"
}
]
},
"id": "CBFE9913-4D10-486A-80F9-03D160C2C6A5"
},
{
"shape": {
"shape": {
"flowchart": {
"type": "INTERNAL_STORAGE"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "6403E8B7-B380-42DF-8588-F480DA2BED8F",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 1244.6555,
"left": 505.62988,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "6176DD11-BC4E-47A5-81AC-3EE7CCD5EDE6"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "FBFEBFF7-F671-45C8-A5CC-8A7DC4A51780",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "CLOUD"
},
"properties": {
"layout": {
"top": 1006.0866,
"left": 1450.2146,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"saturation": 0.07653,
"brightness": 0.76863,
"hue": 0.61111
}
}
}
}
]
}
}
},
"id": "62B4990B-D8FB-43D8-A135-726E3A37959C"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "A60696AF-9992-40D2-A24C-6353402C9C2C",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "HEART"
},
"properties": {
"layout": {
"top": 372.94846,
"left": 1574.3179,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"saturation": 0.93088,
"brightness": 0.85098
}
}
}
}
]
}
}
},
"id": "6F518490-1979-4AB6-8700-DFE27480826D"
}
]
},
"id": "225b1dfc-c5ea-4e61-8928-c973d75811a5"
},
{
"group_shape": {
"layout": {
"top": -389.62683,
"left": 646.5,
"width": 822.5403,
"height": 544.8257
},
"objects": [
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "FCE56BCB-D8FB-4FBC-B189-72BF17DA39EC",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": -181,
"left": 646.5,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "9B379582-B285-47D2-BF41-DD76EF9FE958"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "5134DB4A-26F3-4CDE-BDF6-D8137DF237F6",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": -389.62683,
"left": 938.52606,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"hsb": {
"saturation": 0.65432,
"brightness": 0.95294,
"hue": 0.0283
}
},
"position": 0.0581
},
{
"color": {
"hsb": {
"saturation": 0.51479,
"brightness": 0.66275,
"hue": 0.48659
}
},
"position": 0.9538
}
],
"type": "RADIAL"
}
}
]
}
}
},
"id": "CC9425EB-D2F8-4439-8303-1CA336058EFB"
},
{
"shape": {
"shape": {
"star": {
"type": "POINT",
"point": {
"type": "SEVEN_POINT"
}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1
},
"level": 1,
"halign": "CENTER"
},
"id": "9E2F0822-8E97-47E9-BB92-58A0F0BD421C",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "start"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 30.198849,
"left": 1344.0403,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "FF0024A2-785E-464D-84CA-36BB1FBB9786"
}
]
},
"id": "35C6DB02-F32C-443A-81EB-5D43E8021B8B"
}
]
},
"message": "GroupShapes fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes
Group or ungroup shapes in a zone (op-aware)
Group or ungroup shapes in a zone (op-aware)
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| op REQUIRED | string |
Group operation (max length 50)
groupungroup
|
|
| nested_groups | array of string | Array-of-arrays of uuids (required for op=group) (min 1, max 1) | |
| groups | array of string | Flat uuid list (required for op=ungroup) (min 1, max 1) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"op\":\"group\",\"nested_groups\":[\"f47ac10b-58cc-4372-a567-0e02b2c3d479\"],\"groups\":[\"f47ac10b-58cc-4372-a567-0e02b2c3d479\"]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"op": "group", "nested_groups": {"f47ac10b-58cc-4372-a567-0e02b2c3d479"}, "groups": {"f47ac10b-58cc-4372-a567-0e02b2c3d479"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}
Response
Successful response
{
"data": {
"groups": [
{
"group_id": "0f95159c-24f7-4b3d-b7b0-9a080dc9e011",
"group_index": 0,
"status": "success"
},
{
"group_id": "18afea79-4ec1-447e-b740-d561a99ec2b0",
"group_index": 1,
"status": "success"
},
{
"group_id": "225b1dfc-c5ea-4e61-8928-c973d75811a5",
"group_index": 2,
"status": "success"
},
{
"group_id": "390f3d93-0c2a-4f10-869a-590522a4fd44",
"group_index": 3,
"status": "success"
}
]
},
"message": "Shapes grouped successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/C1886757-1B63-4281-A6B7-B478147210EB/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes
Update one or more group shapes in a zone
Update one or more group shapes in a zone
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Per-element groupshape patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| properties | object | Group properties patch (layout only) | |
| layout | object | Group position and size (PATCH) | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5}}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"id": "E0DD0833-18B6-4D09-A623-EF518293E06C",
"errors": [
{
"error_code": "EL1006",
"message": "Not a groupshape",
"facet": "element"
}
],
"status": "failed"
},
{
"id": "F5C83D11-D584-4BF0-865E-DC3A1C6D0EC2",
"errors": [
{
"error_code": "EL1006",
"message": "specialised STICKYNOTE container is not a groupshape",
"facet": "element"
}
],
"status": "failed"
},
{
"id": "8F28ED4F-69BB-49B2-81CE-D33E323892C8",
"status": "success"
}
]
},
"message": "Partial success: some operations failed",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes
Delete one or more group shapes in a zone
destructive
Delete one or more group shapes in a zone
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"shape_id": "F0C973CE-B8A1-4117-B04A-7711FE6A020C",
"status": "success"
},
{
"shape_id": "BBCDD65F-C6BF-4D73-ACF9-FBB4608A444C",
"status": "success"
},
{
"shape_id": "89EC067F-EAEF-419A-B800-88045B81663F",
"status": "success"
}
]
},
"message": "Group shapes deleted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames
Get the zone-root frames in a zone
Get the zone-root frames in a zone
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"frames": [
{
"meta": {
"name": "Slide Landscape",
"id": "f1f362c6-9a9f-58e5-8f47-149f741c91b8"
},
"graphic_objects": [
{
"shape": {
"shape": {
"callout": {
"type": "ROUNDED_RECTANGLE_CALLOUT"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "D767F5FA-82BF-4694-8690-220CBDC46E46",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 558.59375,
"left": 1124.7266,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "11209A82-3D89-4384-AD8F-CDCF1B93C67C"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "FD77B19F-41DE-433B-A652-FF90D4306E56",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "OVAL"
},
"properties": {
"layout": {
"top": 159.45312,
"left": 1533.0078,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "EF25C6E5-BDBE-423B-8244-818DB95FD79A"
}
],
"type": "CUSTOM",
"properties": {
"layout": {
"width": 1920,
"height": 1080
},
"strokes": [
{
"width": 5,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 17,
"green": 24,
"blue": 39
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"rgb": {
"red": 255,
"green": 255,
"blue": 255
}
}
}
}
]
}
},
{
"meta": {
"name": "Slide Portrait",
"id": "68747720-4a7f-5499-95b8-9ebf4b16fc7e"
},
"type": "CUSTOM",
"properties": {
"layout": {
"left": 2000,
"width": 1080,
"height": 1920
},
"strokes": [
{
"captype": "CAPROUND",
"width": 5,
"type": "DASH",
"fill": {
"solid": {
"color": {
"rgb": {
"red": 29,
"green": 78,
"blue": 216
}
}
}
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"rgb": {
"red": 255,
"green": 248,
"blue": 225
}
}
},
{
"color": {
"rgb": {
"red": 255,
"green": 204,
"blue": 128
}
},
"position": 1
}
]
}
}
]
}
},
{
"meta": {
"name": "A4",
"id": "6d198740-ac2c-5ac1-b7ab-90471f922f2b"
},
"type": "CUSTOM",
"properties": {
"layout": {
"top": 2000,
"width": 794,
"height": 1123
},
"strokes": [
{
"jointype": "MITER",
"width": 4.5,
"position": "INSIDE",
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.85,
"brightness": 0.25,
"hue": 0.0016975309
}
}
}
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"rgb": {
"red": 255,
"green": 255,
"blue": 255
}
}
},
{
"color": {
"rgb": {
"red": 229,
"green": 231,
"blue": 235
}
},
"position": 1
}
],
"type": "RADIAL"
}
}
]
}
}
],
"total_count": 3
},
"message": "Frames fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/DEDA88D7-7A93-4D83-B69A-F5218927091C/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames
Insert one or more zone-root frames into a zone
Insert one or more zone-root frames into a zone
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| frames REQUIRED | array of object | Frames to insert (min 1, max 1) | |
| meta REQUIRED | object | Frame metadata (id mandatory) | |
| name | string | Frame display name (max length 500) | |
| id REQUIRED | string | Frame ID (mandatory, UUID) (max length 200) | |
| type | string |
Frame type discriminator (max length 50)
A4A3A5A6A7SLIDE_LANDSCAPESLIDE_PORTRAITDEVICE_PHONEDEVICE_TABLETDEVICE_DESKTOPDEVICE_TVDEVICE_WATCHSM_TWITTER_POSTSM_TWITTER_HEADERSM_FB_POSTSM_FB_COVERSM_INSTAGRAM_POSTSM_INSTAGRAM_STORYSM_LINKEDIN_POSTSM_LINKEDIN_COVERCUSTOM
|
|
| properties | object | Frame properties | |
| layout | object | Position and size | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels | |
| strokes | array of object | Stroke layers (min 2, max 2) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (UI subset: Solid/Dashed/Dotted; use fill.no_fill for 'no border') (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Stroke fill (solid or no_fill; no_fill expresses 'no border') | |
| solid | object | Solid stroke fill (oneof variant) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No stroke fill — stroke-off toggle (oneof variant) | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| fills | array of object | Fill layers (min 2, max 2) | |
| solid | object | Solid fill | |
| color REQUIRED | object | Fill color (mandatory) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No fill | |
| gradient | object | Gradient fill | |
| linear | object | Geometry for LINEAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| radial_angular | object | Geometry for RADIAL/ANGULAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| stops REQUIRED | array of object | Gradient stops (minimum 2 required — a gradient needs from/to) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
GradientFillType enum (client renders LINEAR/RADIAL/ANGULAR only) (max length 50)
LINEARRADIALANGULAR
|
|
| alpha | number | Fill alpha / opacity (0.0 - 1.0) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"frames\":[{\"meta\":{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"name\":\"Sample name\"},\"type\":\"A4\",\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5},\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}},{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}}],\"fills\":[{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5},{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5}]}}]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"frames": {{"meta": {"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "name": "Sample name"}, "type": "A4", "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}, "strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}, {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}}, "fills": {{"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}, {"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
Response
Successful response
{
"data": {
"inserted_ids": [
"f1f362c6-9a9f-58e5-8f47-149f741c91b8",
"68747720-4a7f-5499-95b8-9ebf4b16fc7e",
"6d198740-ac2c-5ac1-b7ab-90471f922f2b",
"d2e81218-0c52-5fca-8e9b-bf68bccf38f0",
"74b0dfa1-9186-5290-a16c-89b51db3bd31"
]
},
"message": "Frames inserted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/DEDA88D7-7A93-4D83-B69A-F5218927091C/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/DEDA88D7-7A93-4D83-B69A-F5218927091C/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames
Update one or more zone-root frames in a zone
Update one or more zone-root frames in a zone
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| frames REQUIRED | array of object | Per-frame patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| properties | object | Frame properties patch | |
| layout | object | Position and size (PATCH) | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels | |
| strokes | array of object | Stroke layers (PATCH) (min 2, max 2) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (UI subset: Solid/Dashed/Dotted; use fill.no_fill for 'no border') (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Stroke fill (solid or no_fill; no_fill expresses 'no border') | |
| solid | object | Solid stroke fill (oneof variant) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No stroke fill — stroke-off toggle (oneof variant) | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| fills | array of object | Fill layers (PATCH) (min 2, max 2) | |
| solid | object | Solid fill | |
| color REQUIRED | object | Fill color (mandatory) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No fill | |
| gradient | object | Gradient fill | |
| linear | object | Geometry for LINEAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| radial_angular | object | Geometry for RADIAL/ANGULAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| stops REQUIRED | array of object | Gradient stops (minimum 2 required — a gradient needs from/to) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
GradientFillType enum (client renders LINEAR/RADIAL/ANGULAR only) (max length 50)
LINEARRADIALANGULAR
|
|
| alpha | number | Fill alpha / opacity (0.0 - 1.0) |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"frames\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5},\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}},{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}}],\"fills\":[{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5},{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5}]}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"frames": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}, "strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}, {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}}, "fills": {{"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}, {"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"id": "6d198740-ac2c-5ac1-b7ab-90471f922f2b",
"status": "success"
},
{
"id": "d2e81218-0c52-5fca-8e9b-bf68bccf38f0",
"status": "success"
},
{
"id": "00000000-0000-0000-0000-000000000000",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found",
"facet": "frame"
}
],
"status": "failed"
},
{
"id": "ffffffff-ffff-ffff-ffff-ffffffffffff",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found",
"facet": "frame"
}
],
"status": "failed"
}
]
},
"message": "Partial success: some operations failed",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames
Delete one or more zone-root frames from a zone
destructive
Delete one or more zone-root frames from a zone
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"frame_id": "f1f362c6-9a9f-58e5-8f47-149f741c91b8",
"status": "success"
},
{
"id": "00000000-0000-0000-0000-000000000000",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found"
}
],
"status": "failed"
}
]
},
"message": "Partial success: some operations failed",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes
Get the shapes in a frame
Get the shapes in a frame
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"total_count": 3,
"elements": [
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "f1a2b3c4-d5e6-4a89-b012-c3d4e5f6a7b8",
"portions": [
{
"style": {
"fontweight": "BOLD",
"size": 28,
"color": {
"rgb": {
"red": 255,
"green": 255,
"blue": 255
}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "Rectangle"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 10,
"bottom": 5,
"right": 10
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": 100,
"left": 100,
"width": 900,
"fliph": true,
"height": 500
},
"strokes": [
{
"jointype": "MITER",
"width": 4,
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 0.2
}
}
],
"fills": [
{
"solid": {
"color": {
"rgb": {
"red": 40,
"green": 10,
"blue": 10
}
}
},
"alpha": 0.2
}
]
}
}
},
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "e2c3d4e5-f6a7-4b90-ac1d-2e3f4a5b6c7e",
"portions": [
{
"style": {
"fontweight": "BOLD",
"size": 28,
"color": {
"rgb": {
"red": 255,
"green": 255,
"blue": 255
}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "Oval"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 10,
"bottom": 5,
"right": 10
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "OVAL"
},
"properties": {
"layout": {
"top": 100,
"left": 1200,
"width": 800,
"flipv": true,
"height": 500
},
"strokes": [
{
"captype": "CAPROUND",
"width": 4,
"position": "INSIDE",
"type": "DASH",
"fill": {
"solid": {
"color": {
"rgb": {
"red": 2,
"green": 30,
"blue": 22
}
}
},
"alpha": 0.2
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"saturation": 0.96,
"brightness": 0.18,
"hue": 0.43888888
}
}
},
"alpha": 0.2
}
]
}
}
},
"id": "b2c3d4e5-f6a7-4b90-9c1d-2e3f4a5b6c7d"
},
{
"shape": {
"shape": {
"star": {
"type": "POINT",
"point": {
"type": "FIVE_POINT"
}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "f6a7b8c9-d0e1-4f23-bd34-6b7c8d9e0f1a",
"portions": [
{
"style": {
"fontweight": "BOLD",
"size": 28,
"color": {
"hsb": {
"saturation": 0.27,
"brightness": 0.95,
"hue": 0.6111111
}
},
"font_name": {
"name": "Open Sans"
}
},
"text": "Star"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 10,
"bottom": 5,
"right": 10
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 900,
"left": 100,
"width": 800,
"flipv": true,
"fliph": true,
"height": 800
},
"strokes": [
{
"captype": "CAPROUND",
"width": 4,
"type": "DASH",
"fill": {
"solid": {
"color": {
"rgb": {
"red": 15,
"green": 23,
"blue": 42
}
}
},
"alpha": 0.2
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"hsb": {
"saturation": 0.95,
"brightness": 0.4,
"hue": 0.125
}
}
},
{
"color": {
"rgb": {
"red": 63,
"green": 10,
"blue": 10
}
},
"position": 1
}
],
"type": "RADIAL"
},
"alpha": 0.2
}
]
}
}
},
"id": "e5f6a7b8-c9d0-4e12-bd23-5a6b7c8d9e0f"
}
]
},
"message": "Shapes in frame fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes
Insert one or more shapes into a frame
Insert one or more shapes into a frame
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Shape elements to insert (min 1, max 1) | |
| shape REQUIRED | object | Shape (mandatory for shape insert) | |
| shape | object | Standard shape | |
| callout | object | Callout shape one of one of these — choosing this clears the others | |
| type | string |
CalloutType enum (max length 40)
LINERECTANGLE_CALLOUTROUNDED_RECTANGLE_CALLOUTOVAL_CALLOUTCLOUD_CALLOUT
|
|
| mathematical_symbol | object | Mathematical symbol one of one of these — choosing this clears the others | |
| type | string |
MathematicalSymbolType enum (max length 10)
PLUSMINUSMULTIPLYDIVIDEEQUALNOT_EQUAL
|
|
| star | object | Star shape one of one of these — choosing this clears the others | |
| ribbon | object | Ribbon variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| scroll | object | Scroll variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
StarType enum (max length 15)
EXPLOSIONPOINTRIBBONSCROLLWAVE
|
|
| point | object | Star point variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| wave | object | Wave variant nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| custom | object | Custom path shape one of one of these — choosing this clears the others | |
| paths REQUIRED | array of object | Shape paths (at least 1 required) (min 1, max 1) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| width | number | Custom shape width | |
| height | number | Custom shape height | |
| text | object | Shape text content one of one of these — choosing this clears the others | |
| placeholder | object | Placeholder binding nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| paragraphs | array of object | Paragraphs (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| properties | object | Text properties (valign, inset, etc.) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| flowchart | object | Flowchart shape one of one of these — choosing this clears the others | |
| type | string |
FlowchartType enum (max length 40)
PREDEFINED_PROCESSINTERNAL_STORAGEDOCUMENTPROCESSALTERNATE_PROCESSDECISIONDATAMULTI_DOCUMENTTERMINATORPREPARATIONMANUAL_INPUTMANUAL_OPERATIONCONNECTOROFFPAGE_CONNECTORPUNCHED_CARDPUNCHED_TAPESUMMING_JUNCTIONORCOLLATESORTEXTRACTMERGESTORED_DATADELAYSEQUENTIAL_ACCESS_STORAGEMAGNETIC_DISKDIRECT_ACCESS_STORAGEDISPLAY
|
|
| block_arrow | object | Block arrow shape one of one of these — choosing this clears the others | |
| double_arrow | object | Double arrow direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| curved_arrow | object | Curved arrow direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| arrow_callout | object | Arrow callout direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
BlockArrowType enum (max length 30)
SINGLECURVEDCALLOUTDOUBLEQUADLEFT_RIGHT_UPBENTU_TURNBENT_UPSTRIPED_RIGHTNOTCHED_RIGHTPENTAGON_ARROWCHEVRONLEFT_RIGHT_CALLOUTQUAD_CALLOUT
|
|
| single_arrow | object | Single arrow direction nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| placeholder | object | Placeholder type one of one of these — choosing this clears the others | |
| type REQUIRED | string |
PlaceholderType enum (mandatory when placeholder binding is present) (max length 50)
TITLESUBTITLECONTENTIMAGECHARTTABLE
|
|
| basic | object | Basic shape type one of one of these — choosing this clears the others | |
| snip_rectangle | object | Snip rectangle params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| rounded_rectangle | object | Rounded rectangle params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| bracket | object | Bracket params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| brace | object | Brace params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
BasicShapeType enum (max length 30)
RECTANGLEROUNDED_RECTANGLESNIP_RECTANGLEROUND_SNIP_RECTANGLETRIANGLEOVALTRAPEZOIDPENTAGONHEXAGONDIAMONDPARALLELOGRAMHEPTAGONOCTAGONDECAGONPIECHORDTEARDROPFRAMEHALF_FRAMEL_SHAPEDIAGONAL_STRIPECROSSPLAQUECANCUBEBEVELDONUTNO_SYMBOLBLOCK_ARCFOLDED_CORNERSMILEYHEARTLIGHTNING_BOLTSUNMOONCLOUDARCBRACKETBRACECLOCK
|
|
| triangle | object | Triangle params nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| properties | object | Shape properties (insert) one of one of these — choosing this clears the others | |
| layout | object | Position and size nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| strokes | array of object | Stroke layers (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| fills | array of object | Fill layers (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| name | string | Object name (max length 500) | |
| id REQUIRED | string | Object ID (mandatory, UUID) (max length 200) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"shape\":{\"shape\":{\"callout\":{\"type\":\"LINE\"}}},\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"name\":\"Sample name\"}]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"shape": {"shape": {"callout": {"type": "LINE"}}}, "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "name": "Sample name"}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"shape": {
"shape": {
"callout": {
"type": "LINE"
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"shape_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"shape_id": "b2c3d4e5-f6a7-4b90-9c1d-2e3f4a5b6c7d",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"shape_id": "c3d4e5f6-a7b8-4c9d-be1f-3a4b5c6d7e8f",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"shape_id": "d4e5f6a7-b8c9-4d8e-bf12-4a5b6c7d8e9f",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"shape_id": "e5f6a7b8-c9d0-4e12-bd23-5a6b7c8d9e0f",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
}
]
},
"message": "Shapes inserted in frame successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes
Update one or more shapes in a frame
Update one or more shapes in a frame
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Per-element shape patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| text | object | Text facet patch (mutations and/or styles) | |
| mutations | array of object | Ordered text mutations (min 2, max 2) | |
| cursor | object | Cursor-scoped insert/delete mutation one of one of these — choosing this clears the others | |
| cursor_index REQUIRED | integer | Cursor index on flattened text | |
| text | string | Text to insert (required when operation=CURSOR_TEXT_OPERATION_INSERT_TEXT) (max length 500000) | |
| operation REQUIRED | string |
Cursor mutation operation (max length 50)
CURSOR_TEXT_OPERATION_UNSPECIFIEDCURSOR_TEXT_OPERATION_INSERT_TEXTCURSOR_TEXT_OPERATION_INSERT_NEWLINECURSOR_TEXT_OPERATION_DELETE_NEWLINE
|
|
| all_text | object | Full-text replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=ALL_TEXT_OPERATION_REPLACE) (max length 500000) | |
| operation REQUIRED | string |
Full-text mutation operation (max length 50)
ALL_TEXT_OPERATION_UNSPECIFIEDALL_TEXT_OPERATION_REPLACEALL_TEXT_OPERATION_DELETE
|
|
| range | object | Range-scoped replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=RANGE_TEXT_OPERATION_REPLACE) (max length 500000) | |
| range REQUIRED | object | Target range in flattened text nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| operation REQUIRED | string |
Range mutation operation (max length 50)
RANGE_TEXT_OPERATION_UNSPECIFIEDRANGE_TEXT_OPERATION_REPLACERANGE_TEXT_OPERATION_DELETE
|
|
| styles | array of object | Text style entries (one applyTextStyle call per entry) (min 2, max 2) | |
| all_text | boolean | Apply style to entire flattened text when true | |
| portion_style | object | Optional portion style patch | |
| fontweight | string |
FontWeight enum (max length 20)
THINEXTRA_LIGHTLIGHTNORMALMEDIUMDEMI_BOLDBOLDHEAVYBLACK
|
|
| size | number | Optional portion font size | |
| color | object | Optional text color patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| underline | boolean | Optional underline toggle | |
| strike | boolean | Optional strike toggle | |
| italic | boolean | Optional italic toggle | |
| font_name | object | Optional font family/style patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| range | object | Apply style within selected range | |
| start_index REQUIRED | integer | Inclusive start index on flattened text (>= 0) | |
| end_index REQUIRED | integer | Exclusive end index on flattened text (> start_index) | |
| paragraph_style | object | Optional paragraph style patch | |
| spacing | object | Optional paragraph spacing patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| level | integer | Optional paragraph level | |
| halign | string |
HorizontalAlignType enum (max length 20)
LEFTCENTERRIGHTJUSTIFY
|
|
| properties | object | Shape properties patch | |
| layout | object | Position and size (PATCH) | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels | |
| strokes | array of object | Stroke layers (PATCH; full replace when present) (min 2, max 2) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (UI subset: Solid/Dashed/Dotted; use fill.no_fill for 'no border') (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Stroke fill (solid or no_fill; no_fill expresses 'no border') | |
| solid | object | Solid stroke fill (oneof variant) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No stroke fill — stroke-off toggle (oneof variant) | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| fills | array of object | Fill layers (PATCH; full replace when present) (min 2, max 2) | |
| solid | object | Solid fill | |
| color REQUIRED | object | Fill color (mandatory) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No fill | |
| gradient | object | Gradient fill | |
| linear | object | Geometry for LINEAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| radial_angular | object | Geometry for RADIAL/ANGULAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| stops REQUIRED | array of object | Gradient stops (minimum 2 required — a gradient needs from/to) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
GradientFillType enum (client renders LINEAR/RADIAL/ANGULAR only) (max length 50)
LINEARRADIALANGULAR
|
|
| alpha | number | Fill alpha / opacity (0.0 - 1.0) |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"text\":{\"mutations\":[{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}},{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}}],\"styles\":[{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}},{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}}]},\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5},\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}},{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}}],\"fills\":[{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5},{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5}]}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "text": {"mutations": {{"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}, {"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}}, "styles": {{"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}, {"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}}}, "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}, "strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}, {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}}, "fills": {{"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}, {"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "b2c3d4e5-f6a7-4b90-9c1d-2e3f4a5b6c7d",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "c3d4e5f6-a7b8-4c9d-be1f-3a4b5c6d7e8f",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "d4e5f6a7-b8c9-4d8e-bf12-4a5b6c7d8e9f",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "e5f6a7b8-c9d0-4e12-bd23-5a6b7c8d9e0f",
"status": "success"
}
]
},
"message": "Shape in frame updated successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes
Delete one or more shapes from a frame
destructive
Delete one or more shapes from a frame
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"shape_id": "d4e5f6a7-b8c9-4d8e-bf12-4a5b6c7d8e9f",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"shape_id": "e5f6a7b8-c9d0-4e12-bd23-5a6b7c8d9e0f",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"shape_id": "64CC53D2-C341-4132-870B-30E516A54BEA",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
}
]
},
"message": "Shapes in frame deleted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/shapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/shapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors
Get the connectors in a frame
Get the connectors in a frame
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"total_count": 4,
"elements": [
{
"connector": {
"stroke": {
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
},
"id": "B37069B4-6676-4B1D-9DE8-13BF28854044"
},
{
"connector": {
"connected": {
"first": {
"side": "EAST",
"marker": "NONE",
"shape_id": "BAD2B78A-C17A-4A75-BFD7-89CD2ABDF7E8"
},
"second": {
"side": "WEST",
"marker": "OPEN",
"shape_id": "848D9B76-A1D7-4A7A-B5CD-CEB4FF6452D5"
}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "bbbbbbbb-2222-4222-8222-bbbbbbbbbbbb",
"portions": [
{
"style": {
"fontweight": "NORMAL",
"size": 12,
"color": {
"rgb": {
"red": 30,
"green": 30,
"blue": 30
}
}
},
"text": "Line A→C"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
}
}
},
"stroke": {
"width": 2,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 66,
"green": 133,
"blue": 244
}
}
},
"alpha": 1
}
}
},
"id": "22222222-1111-4111-8111-aaaaaaaaaaaa"
},
{
"connector": {
"connected": {
"first": {
"side": "SOUTH",
"marker": "BLOCK",
"shape_id": "757F7D65-EDBB-4447-B743-5520B1BA3667"
},
"second": {
"side": "NORTH",
"marker": "CLASSIC",
"shape_id": "C4A58170-EB6A-4C1F-8705-9DD091E900D4"
}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"before": 2,
"line": 1.3
},
"level": 1
},
"id": "cccccccc-3333-4333-8333-cccccccccccc",
"portions": [
{
"style": {
"fontweight": "BOLD",
"size": 13,
"color": {
"rgb": {
"red": 33,
"green": 33,
"blue": 33
}
}
},
"text": "Elbow "
},
{
"style": {
"fontweight": "NORMAL",
"size": 13,
"color": {
"rgb": {
"red": 255,
"green": 109
}
}
},
"text": "D→F"
}
]
}
],
"properties": {
"inset": {
"top": 2,
"left": 4,
"bottom": 2,
"right": 4
},
"auto_fit": "TEXT",
"valign": "TOP"
}
},
"type": "ELBOW",
"stroke": {
"captype": "CAPROUND",
"jointype": "BEVEL",
"width": 2.5,
"position": "INSIDE",
"type": "DASH",
"fill": {
"solid": {
"color": {
"rgb": {
"red": 255,
"green": 152
}
}
}
}
}
},
"id": "22222222-2222-4222-8222-bbbbbbbbbbbb"
},
{
"connector": {
"connected": {
"first": {
"side": "SOUTH",
"marker": "NONE",
"shape_id": "a4f1c2d8-3b6e-4f02-9c1b-7d2a5e89f014"
},
"second": {
"side": "NORTH",
"marker": "BLOCK",
"shape_id": "a4f1c2d8-3b6e-4f02-9c1b-7d2a5e89f018"
}
},
"type": "ELBOW",
"stroke": {
"width": 1.5,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 13,
"green": 71,
"blue": 161
}
}
}
}
}
},
"id": "33333333-1111-4111-8111-aaaaaaaaaaaa"
}
]
},
"message": "Connectors in frame fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "112255940",
"current_user_id": "82512958",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "5777000000915007"
}
},
"request_uri": "/vani/api/v1/editions/112255940/spaces/5777000000915007/zones/492724BD-4FD7-4851-ACF9-50EB08B730D7/frames/00000000-0000-0000-0000-000000000000/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors
Insert one or more connectors into a frame
Insert one or more connectors into a frame
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Connector elements to insert (min 1, max 1) | |
| connector REQUIRED | object | Connector (mandatory for connector insert) | |
| connected REQUIRED | object | Connected shapes (mandatory) | |
| first REQUIRED | object | Start endpoint (mandatory) | |
| side | string |
ConnectionSide enum (max length 20)
NORTHEASTSOUTHWEST
|
|
| marker | string |
MarkerType enum (max length 50)
NONEOPENBLOCKCLASSICDIAMONDOVAL
|
|
| shape_id REQUIRED | string | Connected shape ID (mandatory, UUID) (max length 200) | |
| point | object | Custom attach point (x, y) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| second REQUIRED | object | End endpoint (mandatory) | |
| side | string |
ConnectionSide enum (max length 20)
NORTHEASTSOUTHWEST
|
|
| marker | string |
MarkerType enum (max length 50)
NONEOPENBLOCKCLASSICDIAMONDOVAL
|
|
| shape_id REQUIRED | string | Connected shape ID (mandatory, UUID) (max length 200) | |
| point | object | Custom attach point (x, y) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| text | object | Connector text | |
| placeholder | object | Placeholder binding | |
| type REQUIRED | string |
PlaceholderType enum (mandatory when placeholder binding is present) (max length 50)
TITLESUBTITLECONTENTIMAGECHARTTABLE
|
|
| paragraphs | array of object | Paragraphs (min 2, max 2) | |
| style | object | Paragraph style nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| id REQUIRED | string | Paragraph identifier (mandatory, UUID) (max length 200) | |
| portions | array of object | Text runs (portions) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| properties | object | Text properties (valign, inset, etc.) | |
| inset | object | Text padding nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| auto_fit | string |
TextBoxAutoFit enum (max length 20)
NONETEXTSHAPE
|
|
| valign | string |
VerticalAlignType enum (max length 20)
MIDDLETOPBOTTOM
|
|
| para_style | object | Default paragraph style nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
ConnectorType enum (max length 20)
LINEELBOWCURVE
|
|
| stroke | object | Connector stroke (solid-fill only) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (connector-UI subset) (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Connector stroke fill (solid-only; no_fill unsupported by UI) | |
| solid REQUIRED | object | Solid stroke fill (only variant supported on connectors) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| name | string | Object name (max length 500) | |
| id REQUIRED | string | Object ID (mandatory, UUID) (max length 200) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"connector\":{\"connected\":{\"first\":{\"shape_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"side\":\"NORTH\",\"marker\":\"NONE\",\"point\":{\"x\":1.5,\"y\":1.5}},\"second\":{\"shape_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"side\":\"NORTH\",\"marker\":\"NONE\",\"point\":{\"x\":1.5,\"y\":1.5}}},\"text\":{\"placeholder\":{\"type\":\"TITLE\"},\"paragraphs\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"style\":{\"spacing\":{},\"level\":1,\"portion_style\":{},\"halign\":\"string\"},\"portions\":[{},{}]},{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"style\":{\"spacing\":{},\"level\":1,\"portion_style\":{},\"halign\":\"string\"},\"portions\":[{},{}]}],\"properties\":{\"inset\":{\"top\":1.5,\"left\":1.5,\"bottom\":1.5,\"right\":1.5},\"auto_fit\":\"NONE\",\"valign\":\"MIDDLE\",\"para_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"portion_style\":{\"fontweight\":\"string\",\"size\":1,\"color\":{},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{}},\"halign\":\"LEFT\"}}},\"type\":\"LINE\",\"stroke\":{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{\"hsb\":{}}},\"alpha\":1.5}}},\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"name\":\"Sample name\"}]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"connector": {"connected": {"first": {"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "side": "NORTH", "marker": "NONE", "point": {"x": 1.5, "y": 1.5}}, "second": {"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "side": "NORTH", "marker": "NONE", "point": {"x": 1.5, "y": 1.5}}}, "text": {"placeholder": {"type": "TITLE"}, "paragraphs": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "style": {"spacing": {}, "level": 1, "portion_style": {}, "halign": "string"}, "portions": {{}, {}}}, {"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "style": {"spacing": {}, "level": 1, "portion_style": {}, "halign": "string"}, "portions": {{}, {}}}}, "properties": {"inset": {"top": 1.5, "left": 1.5, "bottom": 1.5, "right": 1.5}, "auto_fit": "NONE", "valign": "MIDDLE", "para_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "portion_style": {"fontweight": "string", "size": 1, "color": {}, "underline": true, "strike": true, "italic": true, "font_name": {}}, "halign": "LEFT"}}}, "type": "LINE", "stroke": {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {"hsb": {}}}, "alpha": 1.5}}}, "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "name": "Sample name"}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"connector": {
"connected": {
"first": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
},
"second": {
"shape_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"side": "NORTH",
"marker": "NONE",
"point": {
"x": 1.5,
"y": 1.5
}
}
},
"text": {
"placeholder": {
"type": "TITLE"
},
"paragraphs": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
},
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"style": {
"spacing": {},
"level": 1,
"portion_style": {},
"halign": "string"
},
"portions": [
{},
{}
]
}
],
"properties": {
"inset": {
"top": 1.5,
"left": 1.5,
"bottom": 1.5,
"right": 1.5
},
"auto_fit": "NONE",
"valign": "MIDDLE",
"para_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"portion_style": {
"fontweight": "string",
"size": 1,
"color": {},
"underline": true,
"strike": true,
"italic": true,
"font_name": {}
},
"halign": "LEFT"
}
}
},
"type": "LINE",
"stroke": {
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {
"hsb": {}
}
},
"alpha": 1.5
}
}
},
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"connector_id": "22222222-1111-4111-8111-aaaaaaaaaaaa",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"connector_id": "22222222-2222-4222-8222-bbbbbbbbbbbb",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"connector_id": "22222222-3333-4333-8333-cccccccccccc",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"connector_id": "22222222-4444-4444-8444-dddddddddddd",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"connector_id": "22222222-5555-4555-8555-eeeeeeeeeeee",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
}
]
},
"message": "Connectors inserted in frame successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors
Update one or more connectors in a frame
Update one or more connectors in a frame
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Per-element connector patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| text | object | Text label facet patch | |
| mutations | array of object | Ordered text mutations (min 2, max 2) | |
| cursor | object | Cursor-scoped insert/delete mutation one of one of these — choosing this clears the others | |
| cursor_index REQUIRED | integer | Cursor index on flattened text | |
| text | string | Text to insert (required when operation=CURSOR_TEXT_OPERATION_INSERT_TEXT) (max length 500000) | |
| operation REQUIRED | string |
Cursor mutation operation (max length 50)
CURSOR_TEXT_OPERATION_UNSPECIFIEDCURSOR_TEXT_OPERATION_INSERT_TEXTCURSOR_TEXT_OPERATION_INSERT_NEWLINECURSOR_TEXT_OPERATION_DELETE_NEWLINE
|
|
| all_text | object | Full-text replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=ALL_TEXT_OPERATION_REPLACE) (max length 500000) | |
| operation REQUIRED | string |
Full-text mutation operation (max length 50)
ALL_TEXT_OPERATION_UNSPECIFIEDALL_TEXT_OPERATION_REPLACEALL_TEXT_OPERATION_DELETE
|
|
| range | object | Range-scoped replace/delete mutation one of one of these — choosing this clears the others | |
| replacement_text | string | Replacement text (required when operation=RANGE_TEXT_OPERATION_REPLACE) (max length 500000) | |
| range REQUIRED | object | Target range in flattened text nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| operation REQUIRED | string |
Range mutation operation (max length 50)
RANGE_TEXT_OPERATION_UNSPECIFIEDRANGE_TEXT_OPERATION_REPLACERANGE_TEXT_OPERATION_DELETE
|
|
| styles | array of object | Text style entries (one applyTextStyle call per entry) (min 2, max 2) | |
| all_text | boolean | Apply style to entire flattened text when true | |
| portion_style | object | Optional portion style patch | |
| fontweight | string |
FontWeight enum (max length 20)
THINEXTRA_LIGHTLIGHTNORMALMEDIUMDEMI_BOLDBOLDHEAVYBLACK
|
|
| size | number | Optional portion font size | |
| color | object | Optional text color patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| underline | boolean | Optional underline toggle | |
| strike | boolean | Optional strike toggle | |
| italic | boolean | Optional italic toggle | |
| font_name | object | Optional font family/style patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| range | object | Apply style within selected range | |
| start_index REQUIRED | integer | Inclusive start index on flattened text (>= 0) | |
| end_index REQUIRED | integer | Exclusive end index on flattened text (> start_index) | |
| paragraph_style | object | Optional paragraph style patch | |
| spacing | object | Optional paragraph spacing patch nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| level | integer | Optional paragraph level | |
| halign | string |
HorizontalAlignType enum (max length 20)
LEFTCENTERRIGHTJUSTIFY
|
|
| properties | object | Connector properties patch (strokes only) | |
| strokes | array of object | Connector stroke (PATCH; at most one entry; solid-fill only) (max 1) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (connector-UI subset) (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Connector stroke fill (solid-only; no_fill unsupported by UI) | |
| solid REQUIRED | object | Solid stroke fill (only variant supported on connectors) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"text\":{\"mutations\":[{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}},{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}}],\"styles\":[{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}},{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}}]},\"properties\":{\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"alpha\":1.5}}]}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "text": {"mutations": {{"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}, {"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}}, "styles": {{"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}, {"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1, "after": 1}, "level": 1, "halign": "LEFT"}}}}, "properties": {"strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "alpha": 1.5}}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"text": {
"mutations": [
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
},
{
"cursor": {
"cursor_index": 1,
"operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
"text": "Hello Vani"
}
}
],
"styles": [
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
},
{
"all_text": true,
"portion_style": {
"fontweight": "THIN",
"size": 1.5,
"color": {
"hsb": {}
},
"underline": true,
"strike": true,
"italic": true,
"font_name": {
"name": "string"
}
},
"range": {
"start_index": 1,
"end_index": 1
},
"paragraph_style": {
"spacing": {
"before": 1,
"line": 1,
"after": 1
},
"level": 1,
"halign": "LEFT"
}
}
]
},
"properties": {
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"alpha": 1.5
}
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "22222222-3333-4333-8333-cccccccccccc",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "11111111-aaaa-4bbb-8ccc-111111111112",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "22222222-4444-4444-8444-dddddddddddd",
"status": "success"
}
]
},
"message": "Connectors in frame updated successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors
Delete one or more connectors from a frame
destructive
Delete one or more connectors from a frame
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"connector_id": "22222222-2222-4222-8222-bbbbbbbbbbbb",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"connector_id": "11111111-aaaa-4bbb-8ccc-111111111118",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
}
]
},
"message": "Connectors in frame deleted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/connectors",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/connectors",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes
Get the group shapes in a frame
Get the group shapes in a frame
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"total_count": 3,
"elements": [
{
"group_shape": {
"layout": {
"top": 80,
"left": 80,
"width": 480,
"height": 320
},
"objects": [
{
"connector": {
"connected": {
"first": {
"side": "EAST",
"marker": "NONE",
"shape_id": "BAD2B78A-C17A-4A75-BFD7-89CD2ABDF7E8"
},
"second": {
"side": "WEST",
"marker": "OPEN",
"shape_id": "848D9B76-A1D7-4A7A-B5CD-CEB4FF6452D5"
}
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "bbbbbbbb-2222-4222-8222-bbbbbbbbbbbb",
"portions": [
{
"style": {
"fontweight": "NORMAL",
"size": 12,
"color": {
"rgb": {
"red": 30,
"green": 30,
"blue": 30
}
}
},
"text": "Line A→C"
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
}
}
},
"stroke": {
"jointype": "MITER",
"width": 3,
"type": "DASH",
"fill": {
"solid": {
"color": {
"rgb": {}
}
}
}
}
},
"id": "22222222-1111-4111-8111-aaaaaaaaaaaa"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "d8e9f0a1-b2c3-4d45-9e67-12345678abcd",
"portions": [
{
"style": {
"fontweight": "BOLD",
"size": 36,
"color": {
"rgb": {
"red": 255,
"green": 255,
"blue": 255
}
},
"font_name": {
"name": "Inter"
}
},
"text": "Single element"
}
]
}
],
"properties": {
"inset": {
"top": 12,
"left": 16,
"bottom": 12,
"right": 16
},
"auto_fit": "TEXT"
}
},
"basic": {
"rounded_rectangle": {},
"type": "ROUNDED_RECTANGLE"
},
"properties": {
"layout": {
"top": 2588.8672,
"left": 1478.9033,
"width": 1000.001,
"height": 500
},
"strokes": [
{
"captype": "CAPROUND",
"width": 4,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 6,
"green": 182,
"blue": 212
}
}
}
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"rgb": {
"red": 15,
"green": 23,
"blue": 42
}
}
},
{
"color": {
"rgb": {
"red": 30,
"green": 41,
"blue": 59
}
},
"position": 1
}
]
},
"alpha": 0.2
}
]
}
}
},
"id": "a4f1c2d8-3b6e-4f02-9c1b-7d2a5e89f013"
},
{
"group_shape": {
"layout": {
"top": 3453.8926,
"left": 1292.2783,
"width": 742.147,
"height": 1625.703
},
"objects": [
{
"group_shape": {
"layout": {
"top": -2749.4653,
"left": 3687.6516,
"width": 559.37476,
"height": 151.99219
},
"objects": [
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "7F5AF8E4-7B4E-447C-BB93-843977B33C99",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {},
"properties": {
"layout": {
"top": -2722.4731,
"left": 4122.0264,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "BAD2B78A-C17A-4A75-BFD7-89CD2ABDF7E8"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "70D504DE-58DE-4422-89CE-744F3AFDF1D0",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "OVAL"
},
"properties": {
"layout": {
"top": -2749.4653,
"left": 3687.6516,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "EFC7A9A1-4294-4560-BD83-C9A8F0EFD3F3"
}
]
},
"id": "c1944aee-6bc4-4514-b7ce-cdfa8a1cacbc"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "8253817E-D4BE-434D-BBB0-28A33D35FC12",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "TRIANGLE",
"triangle": {}
},
"properties": {
"layout": {
"top": -1248.7622,
"left": 4304.8,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "848D9B76-A1D7-4A7A-B5CD-CEB4FF6452D5"
}
]
},
"id": "bf55c824-2496-4268-abaf-3ba054bd19ba"
}
]
},
"id": "151E7B25-6454-426A-9B3E-2DF8266EA459"
},
{
"group_shape": {
"layout": {
"rotate": 12,
"top": 337.53296,
"left": 1236.9053,
"width": 360,
"fliph": true,
"height": 260
},
"objects": [
{
"shape": {
"shape": {
"callout": {
"type": "ROUNDED_RECTANGLE_CALLOUT"
},
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "BF40EAE8-36EC-4940-9215-0DBDC1F136DC",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"properties": {
"layout": {
"top": 4062.5254,
"left": 4109.9414,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "9F02A23F-2616-4865-8939-1424C969B59A"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "89EC4CF3-461C-4C67-B041-A6F8B6D89B39",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "OVAL"
},
"properties": {
"layout": {
"top": 4345.963,
"left": 4590.6836,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "B3FB1A32-09EC-4CDF-8BB4-215E1B8E77CC"
}
]
},
"id": "483122b7-86d4-411a-b7a7-112c54d2d8a8"
},
{
"group_shape": {
"layout": {
"rotate": 352,
"top": 1010,
"left": 580.38965,
"width": 420,
"flipv": true,
"height": 220
},
"objects": [
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "6E0315B8-AB67-4037-8197-169181A92CEB",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"basic": {
"type": "DIAMOND"
},
"properties": {
"layout": {
"top": 3792.4863,
"left": 4734.8237,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "B364B947-10F0-42EE-9095-8918EE264986"
},
{
"shape": {
"shape": {
"text": {
"paragraphs": [
{
"style": {
"spacing": {
"line": 1.2
},
"level": 1,
"halign": "CENTER"
},
"id": "ECA2FD88-8EDE-43CA-AF25-1AB79B30322D",
"portions": [
{
"style": {
"size": 18,
"color": {
"hsb": {}
},
"font_name": {
"name": "Open Sans"
}
}
}
]
}
],
"properties": {
"inset": {
"top": 5,
"left": 5,
"bottom": 5,
"right": 5
},
"auto_fit": "TEXT"
}
},
"block_arrow": {
"single_arrow": {}
},
"properties": {
"layout": {
"top": 3855.1426,
"left": 5130.722,
"width": 125,
"height": 125
},
"strokes": [
{
"jointype": "MITER",
"width": 1.5,
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.3,
"brightness": 0.286,
"hue": 0.764
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {
"brightness": 1
}
}
}
}
]
}
}
},
"id": "D72350DD-CBD3-4164-AC99-08437A3D9679"
}
]
},
"id": "816df1e3-f3d7-4682-b3ef-45f0dddb392a"
}
]
},
"message": "GroupShapes in frame fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes
Group or ungroup shapes in a frame (op-aware)
Group or ungroup shapes in a frame (op-aware)
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| op REQUIRED | string |
Group operation (max length 50)
groupungroup
|
|
| nested_groups | array of string | Array-of-arrays of uuids (required for op=group) (min 1, max 1) | |
| groups | array of string | Flat uuid list (required for op=ungroup) (min 1, max 1) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"op\":\"group\",\"nested_groups\":[\"f47ac10b-58cc-4372-a567-0e02b2c3d479\"],\"groups\":[\"f47ac10b-58cc-4372-a567-0e02b2c3d479\"]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"op": "group", "nested_groups": {"f47ac10b-58cc-4372-a567-0e02b2c3d479"}, "groups": {"f47ac10b-58cc-4372-a567-0e02b2c3d479"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"op": "group",
"nested_groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
],
"groups": [
"f47ac10b-58cc-4372-a567-0e02b2c3d479"
]
}
Response
Successful response
{
"data": {
"ungrouped_shape_ids": [
"a4f1c2d8-3b6e-3f02-9c1b-7d2a5e89f019",
"a4f1c2d8-3b6e-4f02-9c1b-7d2a5e89f014",
"bf55c824-2496-4268-abaf-3ba054bd19ba",
"a4f1c2d8-3b6e-4f02-9c1b-7d2a5e89f019",
"B37069B4-6676-4B1D-9DE8-13BF28854044",
"a4f1c2d8-3b6e-4f02-9c1b-7d2a5e89f018",
"f9dfbc1f-edae-40fb-b96b-9c6352571a30",
"590A322C-1E47-425D-97C2-4DE977E3AE90"
],
"results": [
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "21e04378-de72-4a85-8469-30de3ad8538b",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "b6f88c46-52c4-4a89-8c48-694457681236",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "6c44ecf4-6b5b-4361-b0c7-ebeb03a7b04b",
"status": "success"
}
]
},
"message": "Shapes ungrouped in frame successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes
Update one or more group shapes in a frame
Update one or more group shapes in a frame
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| elements REQUIRED | array of object | Per-element groupshape patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| properties | object | Group properties patch (layout only) | |
| layout | object | Group position and size (PATCH) | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"elements\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5}}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"elements": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"elements": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
}
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "151E7B25-6454-426A-9B3E-2DF8266EA459",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "483122b7-86d4-411a-b7a7-112c54d2d8a8",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"id": "816df1e3-f3d7-4682-b3ef-45f0dddb392a",
"status": "success"
}
]
},
"message": "GroupShape in frame updated successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes
Delete one or more group shapes from a frame
destructive
Delete one or more group shapes from a frame
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"groupshape_id": "151E7B25-6454-426A-9B3E-2DF8266EA459",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
},
{
"groupshape_id": "483122b7-86d4-411a-b7a7-112c54d2d8a8",
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"status": "success"
}
]
},
"message": "GroupShapes in frame deleted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/groupshapes",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/groupshapes",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames
Get the child frames of a parent frame
Get the child frames of a parent frame
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Query parameters ids
| Name | Type | Description |
|---|---|---|
| idsOPTIONAL | string | Optional comma-separated UUID list to fetch selected items |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"frames": [
{
"meta": {
"name": "Single Child Frame",
"id": "b5fc46d8-ab45-5e51-bff3-5a59345b3a03"
},
"type": "CUSTOM",
"properties": {
"layout": {
"top": 320,
"left": 200,
"width": 640,
"height": 360
},
"strokes": [
{
"width": 1,
"fill": {
"solid": {
"color": {
"rgb": {
"red": 204,
"green": 204,
"blue": 204
}
}
}
}
}
],
"fills": [
{
"solid": {
"color": {
"rgb": {
"red": 245,
"green": 245,
"blue": 250
}
}
}
}
]
}
},
{
"meta": {
"name": "Child A4",
"id": "6d198740-ac2c-5ac1-b7ab-90471f922f2b"
},
"type": "CUSTOM",
"properties": {
"layout": {
"top": 2000,
"width": 794,
"height": 1123
},
"strokes": [
{
"jointype": "MITER",
"width": 1,
"position": "INSIDE",
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.85,
"brightness": 0.25,
"hue": 0.0016975309
}
}
}
}
}
],
"fills": [
{
"gradient": {
"stops": [
{
"color": {
"rgb": {
"red": 255,
"green": 255,
"blue": 255
}
}
},
{
"color": {
"rgb": {
"red": 229,
"green": 231,
"blue": 235
}
},
"position": 1
}
],
"type": "RADIAL"
}
}
]
}
},
{
"meta": {
"name": "Child Custom",
"id": "74b0dfa1-9186-5290-a16c-89b51db3bd31"
},
"type": "CUSTOM",
"properties": {
"layout": {
"top": 2000,
"left": 1400,
"width": 600,
"height": 800
},
"strokes": [
{
"captype": "SQUARE",
"width": 2,
"position": "OUTSIDE",
"type": "SQUARE_DOT",
"fill": {
"solid": {
"color": {
"hsb": {
"saturation": 0.7,
"brightness": 0.65,
"hue": 0.0023148148
}
}
}
}
}
],
"fills": [
{
"no_fill": {}
}
]
}
}
],
"total_count": 3
},
"message": "Nested frames fetched successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/frames/B25E9FE2-0605-4370-85E5-B142D133C3BC/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
POST
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames
Insert one or more child frames into a parent frame
Insert one or more child frames into a parent frame
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.CREATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| frames REQUIRED | array of object | Frames to insert (min 1, max 1) | |
| meta REQUIRED | object | Frame metadata (id mandatory) | |
| name | string | Frame display name (max length 500) | |
| id REQUIRED | string | Frame ID (mandatory, UUID) (max length 200) | |
| type | string |
Frame type discriminator (max length 50)
A4A3A5A6A7SLIDE_LANDSCAPESLIDE_PORTRAITDEVICE_PHONEDEVICE_TABLETDEVICE_DESKTOPDEVICE_TVDEVICE_WATCHSM_TWITTER_POSTSM_TWITTER_HEADERSM_FB_POSTSM_FB_COVERSM_INSTAGRAM_POSTSM_INSTAGRAM_STORYSM_LINKEDIN_POSTSM_LINKEDIN_COVERCUSTOM
|
|
| properties | object | Frame properties | |
| layout | object | Position and size | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels | |
| strokes | array of object | Stroke layers (min 2, max 2) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (UI subset: Solid/Dashed/Dotted; use fill.no_fill for 'no border') (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Stroke fill (solid or no_fill; no_fill expresses 'no border') | |
| solid | object | Solid stroke fill (oneof variant) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No stroke fill — stroke-off toggle (oneof variant) | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| fills | array of object | Fill layers (min 2, max 2) | |
| solid | object | Solid fill | |
| color REQUIRED | object | Fill color (mandatory) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No fill | |
| gradient | object | Gradient fill | |
| linear | object | Geometry for LINEAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| radial_angular | object | Geometry for RADIAL/ANGULAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| stops REQUIRED | array of object | Gradient stops (minimum 2 required — a gradient needs from/to) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
GradientFillType enum (client renders LINEAR/RADIAL/ANGULAR only) (max length 50)
LINEARRADIALANGULAR
|
|
| alpha | number | Fill alpha / opacity (0.0 - 1.0) |
Request
POST
curl -X POST "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames'),
method: 'POST',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"frames\":[{\"meta\":{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"name\":\"Sample name\"},\"type\":\"A4\",\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5},\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}},{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}}],\"fills\":[{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5},{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5}]}}]}";
HttpRequest request = requestBuilder
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"frames": {{"meta": {"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "name": "Sample name"}, "type": "A4", "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}, "strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}, {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}}, "fills": {{"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}, {"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
type: POST
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"frames": [
{
"meta": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Sample name"
},
"type": "A4",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"frame_id": "f1f362c6-9a9f-58e5-8f47-149f741c91b8",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"frame_id": "68747720-4a7f-5499-95b8-9ebf4b16fc7e",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"frame_id": "6d198740-ac2c-5ac1-b7ab-90471f922f2b",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"frame_id": "d2e81218-0c52-5fca-8e9b-bf68bccf38f0",
"status": "success"
},
{
"parent_frame_id": "0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061",
"frame_id": "74b0dfa1-9186-5290-a16c-89b51db3bd31",
"status": "success"
}
]
},
"message": "Nested frames inserted successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/E51ABCEF-C5A5-42D1-8686-9A6307E4B73A/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
PUT
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames
Update one or more child frames of a parent frame
Update one or more child frames of a parent frame
OperationUPDATE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.UPDATEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| frames REQUIRED | array of object | Per-frame patches (min 1, max 1) | |
| id REQUIRED | string | Element ID (UUID) (max length 500) | |
| properties | object | Frame properties patch | |
| layout | object | Position and size (PATCH) | |
| rotate | integer | Rotation angle in degrees | |
| top | number | Top position (Y) | |
| left | number | Left position (X) | |
| width | number | Width in pixels | |
| flipv | boolean | Flip vertical | |
| fliph | boolean | Flip horizontal | |
| height | number | Height in pixels | |
| strokes | array of object | Stroke layers (PATCH) (min 2, max 2) | |
| captype | string |
CapType enum (max length 20)
FLATCAPROUNDSQUARE
|
|
| jointype | string |
JoinType enum (max length 20)
ROUNDBEVELMITER
|
|
| width | number | Stroke width in pixels | |
| position | string |
StrokePosition enum (max length 20)
CENTERINSIDEOUTSIDE
|
|
| type | string |
StrokeType enum (UI subset: Solid/Dashed/Dotted; use fill.no_fill for 'no border') (max length 50)
SOLIDDASHSQUARE_DOT
|
|
| fill | object | Stroke fill (solid or no_fill; no_fill expresses 'no border') | |
| solid | object | Solid stroke fill (oneof variant) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No stroke fill — stroke-off toggle (oneof variant) | |
| alpha | number | Stroke fill alpha / opacity (0.0 - 1.0) | |
| fills | array of object | Fill layers (PATCH) (min 2, max 2) | |
| solid | object | Solid fill | |
| color REQUIRED | object | Fill color (mandatory) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| no_fill | object | No fill | |
| gradient | object | Gradient fill | |
| linear | object | Geometry for LINEAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| radial_angular | object | Geometry for RADIAL/ANGULAR gradients nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| stops REQUIRED | array of object | Gradient stops (minimum 2 required — a gradient needs from/to) (min 2, max 2) nests further — this shape is recursive; see the Schema Catalog or the OpenAPI document | |
| type | string |
GradientFillType enum (client renders LINEAR/RADIAL/ANGULAR only) (max length 50)
LINEARRADIALANGULAR
|
|
| alpha | number | Fill alpha / opacity (0.0 - 1.0) |
Request
PUT
curl -X PUT "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
response = requests.put(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames'),
method: 'PUT',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"frames\":[{\"id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"properties\":{\"layout\":{\"rotate\":1,\"top\":1.5,\"left\":1.5,\"width\":1.5,\"flipv\":true,\"fliph\":true,\"height\":1.5},\"strokes\":[{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}},{\"captype\":\"FLAT\",\"jointype\":\"ROUND\",\"width\":1.5,\"position\":\"CENTER\",\"type\":\"SOLID\",\"fill\":{\"solid\":{\"color\":{}},\"no_fill\":{},\"alpha\":1.5}}],\"fills\":[{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5},{\"solid\":{\"color\":{\"hsb\":{}}},\"no_fill\":{},\"gradient\":{\"stops\":[{},{}],\"linear\":{\"start\":{},\"end\":{}},\"radial_angular\":{\"center\":{},\"flip_horizontal\":true,\"spread_x\":1,\"spread_y\":1,\"rotation_angle\":1,\"flip_vertical\":true},\"type\":\"LINEAR\"},\"alpha\":1.5}]}}]}";
HttpRequest request = requestBuilder
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"frames": {{"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "properties": {"layout": {"rotate": 1, "top": 1.5, "left": 1.5, "width": 1.5, "flipv": true, "fliph": true, "height": 1.5}, "strokes": {{"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}, {"captype": "FLAT", "jointype": "ROUND", "width": 1.5, "position": "CENTER", "type": "SOLID", "fill": {"solid": {"color": {}}, "no_fill": {}, "alpha": 1.5}}}, "fills": {{"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}, {"solid": {"color": {"hsb": {}}}, "no_fill": {}, "gradient": {"stops": {{}, {}}, "linear": {"start": {}, "end": {}}, "radial_angular": {"center": {}, "flip_horizontal": true, "spread_x": 1, "spread_y": 1, "rotation_angle": 1, "flip_vertical": true}, "type": "LINEAR"}, "alpha": 1.5}}}}}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
type: PUT
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"frames": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"properties": {
"layout": {
"rotate": 1,
"top": 1.5,
"left": 1.5,
"width": 1.5,
"flipv": true,
"fliph": true,
"height": 1.5
},
"strokes": [
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
},
{
"captype": "FLAT",
"jointype": "ROUND",
"width": 1.5,
"position": "CENTER",
"type": "SOLID",
"fill": {
"solid": {
"color": {}
},
"no_fill": {},
"alpha": 1.5
}
}
],
"fills": [
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
},
{
"solid": {
"color": {
"hsb": {}
}
},
"no_fill": {},
"gradient": {
"stops": [
{},
{}
],
"linear": {
"start": {},
"end": {}
},
"radial_angular": {
"center": {},
"flip_horizontal": true,
"spread_x": 1,
"spread_y": 1,
"rotation_angle": 1,
"flip_vertical": true
},
"type": "LINEAR"
},
"alpha": 1.5
}
]
}
}
]
}
Response
Successful response
{
"data": {
"results": [
{
"parent_frame_id": "B25E9FE2-0605-4370-85E5-B142D133C3BC",
"id": "d2e81218-0c52-5fca-8e9b-bf68bccf38f0",
"status": "success"
},
{
"parent_frame_id": "B25E9FE2-0605-4370-85E5-B142D133C3BC",
"id": "68747720-4a7f-5499-95b8-9ebf4b16fc7e",
"status": "success"
},
{
"id": "00000000-0000-0000-0000-000000000000",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found",
"facet": "frame"
}
],
"status": "failed"
},
{
"id": "ffffffff-ffff-ffff-ffff-ffffffffffff",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found",
"facet": "frame"
}
],
"status": "failed"
}
]
},
"message": "Partial success: some operations failed",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/frames/B25E9FE2-0605-4370-85E5-B142D133C3BC/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
DELETE
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames
Delete one or more child frames from a parent frame
destructive
Delete one or more child frames from a parent frame
OperationDELETE
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.DELETEPath parameters edition_id · space_id · zone_id · frame_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
Request body application/json
Tick a field to put it in the sample payload, and set what it carries in the Value column. Every field is optional unless it is marked REQUIRED, and those are always sent.
| Field | Type | Description | Value |
|---|---|---|---|
| ids REQUIRED | array of string | Element IDs to delete (zone-scoped) (min 1, max 1) |
Request
DELETE
curl -X DELETE "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
data = {
"ids": [
"string"
]
}
response = requests.delete(url, headers=headers, json=data)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames'),
method: 'DELETE',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.write(JSON.stringify({
"ids": [
"string"
]
}));
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
String requestBody = "{\"ids\":[\"string\"]}";
HttpRequest request = requestBuilder
.DELETE(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
requestData = {"ids": {"string"}};
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames"
type: DELETE
headers: headers
parameters: requestData
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}{
"ids": [
"string"
]
}
Response
Successful response
{
"data": {
"results": [
{
"parent_frame_id": "B25E9FE2-0605-4370-85E5-B142D133C3BC",
"frame_id": "d2e81218-0c52-5fca-8e9b-bf68bccf38f0",
"status": "success"
},
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567899",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found"
}
],
"status": "failed"
},
{
"id": "00000000-0000-0000-0000-000000000000",
"errors": [
{
"error_code": "EL1002",
"message": "Frame not found"
}
],
"status": "failed"
}
]
},
"message": "Partial success: some operations failed",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/38CBB766-8052-48D2-9323-067C16BAAD90/frames/B25E9FE2-0605-4370-85E5-B142D133C3BC/frames",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"error_code": "IAM1050",
"message": "The JSON content could not be parsed."
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/frames",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/frames",
"status": "error"
}
Errors
5 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}
Get text of a text-bearing object in a frame
Get text of a text-bearing object in a frame
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id · frame_id · text_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| frame_idREQUIRED | string | The unique identifier of the frame |
| text_idREQUIRED | string | The unique identifier of the text |
Query parameters fetch_type · text_query
| Name | Type | Description |
|---|---|---|
| fetch_typeOPTIONAL | enum |
Optional text fetch mode. Use one of: text, length, paragraph_count, paragraph_text. Defaults to text
textReturn the flattened plain text of the object.
lengthReturn the character count only.
paragraph_countReturn the number of paragraphs only.
paragraph_textReturn the text of a paragraph range.
|
| text_queryOPTIONAL | string (JSON) |
`text_query` — JSON-encoded read options, URL-encoded. Whether it is required depends on fetch_type. REQUIRED with fetch_type=text: pass {"payload":{"all_text":true}} for the whole text, or {"payload":{"range":{"start_index":0,"end_index":5}}} for a character range. REQUIRED with fetch_type=paragraph_text: pass {"payload":{"range":{"start_paragraph_index":0,"end_paragraph_index":1}}}. Not needed with fetch_type=length or fetch_type=paragraph_count, which ignore it. Omitting it where it is required fails validation, so it is declared optional on the parameter only because two of the four modes do not use it. Send this value as a JSON string, not as a JSON object — URL-encode the encoded JSON.
STRING CARRYING JSON URL-encode before sending
Decoded
{
"object": {
"zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"object_id": "60712000000123456",
"frame_id": "60712000000123456"
},
"payload": {
"range": {
"start_index": "42",
"end_index": "42"
}
}
}
URL-encoded, as sent
%7B%22object%22%3A%7B%22zone_id%22%3A%22f47ac10b-58cc-4372-a567-0e02b2c3d479%22%2C%22object_id%22%3A%2260712000000123456%22%2C%22frame_id%22%3A%2260712000000123456%22%7D%2C%22payload%22%3A%7B%22range%22%3A%7B%22start_index%22%3A%2242%22%2C%22end_index%22%3A%2242%22%7D%7D%7D |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"text": "Gem\n\nSilver\n"
},
"message": "Text in frame resolved successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/text/d4e5f6a7-b8c9-4d8e-bf12-4a5b6c7d8e9f",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/text/d4e5f6a7-b8c9-4d8e-bf12-4a5b6c7d8e9f",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "2830000002600178"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600178/zones/1d5151b3-a39d-4eda-954e-3da6a6329408/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/text/d4e5f6a7-b8c9-4d8e-bf12-4a5b6c7d8e9f",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "EL1001",
"message": "Element not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/text/00000000-0000-0000-0000-000000000000",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/frames/{frame_id}/text/{text_id}",
"status": "error"
}
Not implemented - this operation is not available for the requested resource
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "EL1016",
"message": "Not implemented for element type GROUPSHAPE",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/frames/0e7c1ab2-9d34-4f51-b6a0-1c2d3e4f5061/text/BE427379-279A-456E-9AA1-28E125A5B51C",
"status": "error"
}
Errors
6 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed 501 Not implemented - this operation is not available for the requested resource
GET
/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}
Get text of a text-bearing object in a zone
Get text of a text-bearing object in a zone
OperationREAD
Rate limit60 requests / minute · per user
OAuth scopes
Vani.spaces.READPath parameters edition_id · space_id · zone_id · text_id
| Name | Type | Description |
|---|---|---|
| edition_idREQUIRED | string | The unique identifier of the edition |
| space_idREQUIRED | string | The unique identifier of the space |
| zone_idREQUIRED | string | The unique identifier of the zone |
| text_idREQUIRED | string | The unique identifier of the text |
Query parameters fetch_type · text_query
| Name | Type | Description |
|---|---|---|
| fetch_typeOPTIONAL | enum |
Optional text fetch mode. Use one of: text, length, paragraph_count, paragraph_text. Defaults to text
textReturn the flattened plain text of the object.
lengthReturn the character count only.
paragraph_countReturn the number of paragraphs only.
paragraph_textReturn the text of a paragraph range.
|
| text_queryOPTIONAL | string (JSON) |
`text_query` — JSON-encoded read options, URL-encoded. Whether it is required depends on fetch_type. REQUIRED with fetch_type=text: pass {"payload":{"all_text":true}} for the whole text, or {"payload":{"range":{"start_index":0,"end_index":5}}} for a character range. REQUIRED with fetch_type=paragraph_text: pass {"payload":{"range":{"start_paragraph_index":0,"end_paragraph_index":1}}}. Not needed with fetch_type=length or fetch_type=paragraph_count, which ignore it. Omitting it where it is required fails validation, so it is declared optional on the parameter only because two of the four modes do not use it. Send this value as a JSON string, not as a JSON object — URL-encode the encoded JSON.
STRING CARRYING JSON URL-encode before sending
Decoded
{
"object": {
"zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"object_id": "60712000000123456",
"frame_id": "60712000000123456"
},
"payload": {
"range": {
"start_index": "42",
"end_index": "42"
}
}
}
URL-encoded, as sent
%7B%22object%22%3A%7B%22zone_id%22%3A%22f47ac10b-58cc-4372-a567-0e02b2c3d479%22%2C%22object_id%22%3A%2260712000000123456%22%2C%22frame_id%22%3A%2260712000000123456%22%7D%2C%22payload%22%3A%7B%22range%22%3A%7B%22start_index%22%3A%2242%22%2C%22end_index%22%3A%2242%22%7D%7D%7D |
Request
GET
curl -X GET "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}" \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"import requests
url = "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}"
headers = {
"Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
data = response.json()
print(data)const https = require('https');
const url = require('url');
const options = {
...url.parse('https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}'),
method: 'GET',
headers: {
'Authorization': 'Zoho-oauthtoken YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const result = JSON.parse(data);
// Process the response data
});
});
req.end();import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
public class ApiClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}"))
.header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
.timeout(Duration.ofSeconds(30));
.header("Content-Type", "application/json")
HttpRequest request = requestBuilder
.GET(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}info "Making API request to: https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}";
headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");
response = invokeurl
[
url: "https://api.app.vanihq.com/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}"
type: GET
headers: headers
];
if (response.get("status_code") == 200) {
info "Request successful";
responseData = response.get("response");
info responseData;
} else {
info "Request failed with status: " + response.get("status_code");
info response.get("response");
}
Response
Successful response
{
"data": {
"text": "Hello World\nSecond paragraph line"
},
"message": "Text resolved successfully",
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/1752719F-BBB3-412F-BE40-5334D5C2AAC5/text/a46f6013-6822-57cf-a71d-4dce016d3129",
"status": "success"
}
Invalid request - validation failed
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1011",
"message": "Zone is not in an active state",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/85879463-3722-4956-A8B6-C744D4AB4108/text/18EC6574-83FD-4F7C-AD9E-F0022423F386",
"status": "error"
}
Unauthorized - missing or invalid access token
{
"error": {
"details": {
"edition_id": "112255940",
"current_user_id": "82512958",
"error_code": "A1003",
"message": "The user doesn't have permission to perform this action",
"space_id": "5777000000915007"
}
},
"request_uri": "/vani/api/v1/editions/112255940/spaces/5777000000915007/zones/492724BD-4FD7-4851-ACF9-50EB08B730D7/text/00000000-0000-0000-0000-000000000000",
"status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "Z1008",
"message": "Zone not found",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/5725A066-F499-439A-AABA-7461032413DE/text/18EC6574-83FD-4F7C-AD9E-F0022423F386",
"status": "error"
}
Rate limit exceeded - this operation allows 60 requests per minute per user
{
"error": {
"details": {
"error_code": "IAM1055",
"message": "Rate limit exceeded - this operation allows 60 requests per minute per user"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}",
"status": "error"
}
Internal server error - the request was well-formed but could not be completed
{
"error": {
"details": {
"error_code": "U1001",
"message": "Internal server error - the request was well-formed but could not be completed"
}
},
"request_uri": "/vani/api/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/{text_id}",
"status": "error"
}
Not implemented - this operation is not available for the requested resource
{
"error": {
"details": {
"edition_id": "88136506",
"current_user_id": "85115776",
"error_code": "EL1016",
"message": "Not implemented for element type GROUPSHAPE",
"space_id": "2830000002600126"
}
},
"request_uri": "/vani/api/v1/editions/88136506/spaces/2830000002600126/zones/051E5823-1E79-4841-BB26-31329FB388CD/text/64B04181-0A88-4DB4-85E6-984B95A69B5F",
"status": "error"
}
Errors
6 status codes
400 Invalid request - validation failed 401 Unauthorized - missing or invalid access token 404 Not found - a resource named in the path does not exist, or is not visible to the caller 429 Rate limit exceeded - this operation allows 60 requests per minute per user 500 Internal server error - the request was well-formed but could not be completed 501 Not implemented - this operation is not available for the requested resource