Vani Logo Vani / API Docs v1
Access Vani
Zone Operations / Text

Text

Read and mutate text on any text-bearing object, including styling.

Canonical text mutation API for replace/insert/delete/split/merge operations
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopesVani.spaces.CREATE
Path parameters edition_id · space_id · zone_id
NameTypeDescription
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.
FieldTypeDescriptionValue
payload REQUIRED object EditText payload
object REQUIRED object Target text-bearing object
curl -X POST "https://api.app.vanihq.com/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit" \
  -H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "payload": {
    "cursor": {
      "cursor_index": 1,
      "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
      "text": "Hello Vani"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }
}'
import requests

url = "https://api.app.vanihq.com/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit"
headers = {
    "Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
    "Content-Type": "application/json"
}

data = {
  "payload": {
    "cursor": {
      "cursor_index": 1,
      "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
      "text": "Hello Vani"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "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/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit'),
  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({
  "payload": {
    "cursor": {
      "cursor_index": 1,
      "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
      "text": "Hello Vani"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "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/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit"))
            .header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
            .timeout(Duration.ofSeconds(30));

            .header("Content-Type", "application/json")
        String requestBody = "{\"payload\":{\"cursor\":{\"cursor_index\":1,\"operation\":\"CURSOR_TEXT_OPERATION_UNSPECIFIED\",\"text\":\"Hello Vani\"}},\"object\":{\"zone_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"object_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"frame_id\":\"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/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit";

headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");

requestData = {"payload": {"cursor": {"cursor_index": 1, "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED", "text": "Hello Vani"}}, "object": {"zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "frame_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"}};

response = invokeurl
[
    url: "https://api.app.vanihq.com/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit"
    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");
}
{
  "payload": {
    "cursor": {
      "cursor_index": 1,
      "operation": "CURSOR_TEXT_OPERATION_UNSPECIFIED",
      "text": "Hello Vani"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }
}
Successful response
{
  "status": "success",
  "data": {},
  "message": "Request completed successfully",
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit"
}
Invalid request - validation failed
{
  "error": {
    "details": {
      "error_code": "IAM1031",
      "message": "Invalid request - validation failed"
    }
  },
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit",
  "status": "error"
}
Unauthorized - missing or invalid access token
{
  "error": {
    "details": {
      "error_code": "IAM1100",
      "message": "Unauthorized - missing or invalid access token"
    }
  },
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit",
  "status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
  "error": {
    "details": {
      "error_code": "IAM1001",
      "message": "Not found - a resource named in the path does not exist, or is not visible to the caller"
    }
  },
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit",
  "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": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit",
  "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": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/edit",
  "status": "error"
}
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
Apply portion and or paragraph style to selected text scope
OperationCREATE
Rate limit60 requests / minute · per user
OAuth scopesVani.spaces.CREATE
Path parameters edition_id · space_id · zone_id
NameTypeDescription
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.
FieldTypeDescriptionValue
payload REQUIRED object ApplyTextStyle payload
object REQUIRED object Target text-bearing object
curl -X POST "https://api.app.vanihq.com/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style" \
  -H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "payload": {
    "all_text": true,
    "portion_style": {
      "fontweight": "THIN",
      "size": 1.5,
      "color": {
        "hsb": {
          "saturation": 1.5,
          "brightness": 1.5,
          "hue": 1.5
        }
      },
      "underline": true,
      "strike": true,
      "italic": true,
      "font_name": {
        "name": "Sample name",
        "style": "string"
      }
    },
    "range": {
      "start_index": 1,
      "end_index": 1
    },
    "paragraph_style": {
      "spacing": {
        "before": 1,
        "line": 1.5,
        "after": 1
      },
      "level": 1,
      "halign": "LEFT"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }
}'
import requests

url = "https://api.app.vanihq.com/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style"
headers = {
    "Authorization": "Zoho-oauthtoken YOUR_ACCESS_TOKEN",
    "Content-Type": "application/json"
}

data = {
  "payload": {
    "all_text": true,
    "portion_style": {
      "fontweight": "THIN",
      "size": 1.5,
      "color": {
        "hsb": {
          "saturation": 1.5,
          "brightness": 1.5,
          "hue": 1.5
        }
      },
      "underline": true,
      "strike": true,
      "italic": true,
      "font_name": {
        "name": "Sample name",
        "style": "string"
      }
    },
    "range": {
      "start_index": 1,
      "end_index": 1
    },
    "paragraph_style": {
      "spacing": {
        "before": 1,
        "line": 1.5,
        "after": 1
      },
      "level": 1,
      "halign": "LEFT"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "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/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style'),
  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({
  "payload": {
    "all_text": true,
    "portion_style": {
      "fontweight": "THIN",
      "size": 1.5,
      "color": {
        "hsb": {
          "saturation": 1.5,
          "brightness": 1.5,
          "hue": 1.5
        }
      },
      "underline": true,
      "strike": true,
      "italic": true,
      "font_name": {
        "name": "Sample name",
        "style": "string"
      }
    },
    "range": {
      "start_index": 1,
      "end_index": 1
    },
    "paragraph_style": {
      "spacing": {
        "before": 1,
        "line": 1.5,
        "after": 1
      },
      "level": 1,
      "halign": "LEFT"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "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/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style"))
            .header("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN")
            .timeout(Duration.ofSeconds(30));

            .header("Content-Type", "application/json")
        String requestBody = "{\"payload\":{\"all_text\":true,\"portion_style\":{\"fontweight\":\"THIN\",\"size\":1.5,\"color\":{\"hsb\":{\"saturation\":1.5,\"brightness\":1.5,\"hue\":1.5}},\"underline\":true,\"strike\":true,\"italic\":true,\"font_name\":{\"name\":\"Sample name\",\"style\":\"string\"}},\"range\":{\"start_index\":1,\"end_index\":1},\"paragraph_style\":{\"spacing\":{\"before\":1,\"line\":1.5,\"after\":1},\"level\":1,\"halign\":\"LEFT\"}},\"object\":{\"zone_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"object_id\":\"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\"frame_id\":\"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/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style";

headers = Map();
headers.put("Authorization", "Zoho-oauthtoken YOUR_ACCESS_TOKEN");
headers.put("Content-Type", "application/json");

requestData = {"payload": {"all_text": true, "portion_style": {"fontweight": "THIN", "size": 1.5, "color": {"hsb": {"saturation": 1.5, "brightness": 1.5, "hue": 1.5}}, "underline": true, "strike": true, "italic": true, "font_name": {"name": "Sample name", "style": "string"}}, "range": {"start_index": 1, "end_index": 1}, "paragraph_style": {"spacing": {"before": 1, "line": 1.5, "after": 1}, "level": 1, "halign": "LEFT"}}, "object": {"zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "frame_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"}};

response = invokeurl
[
    url: "https://api.app.vanihq.com/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style"
    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");
}
{
  "payload": {
    "all_text": true,
    "portion_style": {
      "fontweight": "THIN",
      "size": 1.5,
      "color": {
        "hsb": {
          "saturation": 1.5,
          "brightness": 1.5,
          "hue": 1.5
        }
      },
      "underline": true,
      "strike": true,
      "italic": true,
      "font_name": {
        "name": "Sample name",
        "style": "string"
      }
    },
    "range": {
      "start_index": 1,
      "end_index": 1
    },
    "paragraph_style": {
      "spacing": {
        "before": 1,
        "line": 1.5,
        "after": 1
      },
      "level": 1,
      "halign": "LEFT"
    }
  },
  "object": {
    "zone_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "object_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "frame_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }
}
Successful response
{
  "status": "success",
  "data": {},
  "message": "Request completed successfully",
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style"
}
Invalid request - validation failed
{
  "error": {
    "details": {
      "error_code": "IAM1031",
      "message": "Invalid request - validation failed"
    }
  },
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style",
  "status": "error"
}
Unauthorized - missing or invalid access token
{
  "error": {
    "details": {
      "error_code": "IAM1100",
      "message": "Unauthorized - missing or invalid access token"
    }
  },
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style",
  "status": "error"
}
Not found - a resource named in the path does not exist, or is not visible to the caller
{
  "error": {
    "details": {
      "error_code": "IAM1001",
      "message": "Not found - a resource named in the path does not exist, or is not visible to the caller"
    }
  },
  "request_uri": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style",
  "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": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style",
  "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": "/sdk/v1/editions/{edition_id}/spaces/{space_id}/zones/{zone_id}/text/style",
  "status": "error"
}
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
© 2026 Zoho Corporation Pvt. Ltd. Help