All endpoints require authentication via API key, except /health.
Authentication
Include your API key in every request using the X-API-Key header:
curl https://studio99.app/api/v1/fonts \
-H "X-API-Key: your_api_key"Get your API key from the SSO Dashboard. Keep it secret — don't expose it in client-side code.
/api/v1/generateGenerate calligraphy text. Searches the library first, then generates new results.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The text to generate calligraphy for |
language | string | No | Language hint: "hindi", "marathi", "gujarati". Auto-detected if omitted. |
style | string | No | "calligraphy", "decorative", "publication" |
fontId | string | No | Specific font ID. Auto-selects if omitted. |
count | number | No | Number of results (default: 4, max varies by plan) |
format | string | No | "svg" (default) or "png" |
curl -X POST https://studio99.app/api/v1/generate \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{
"text": "शुभ विवाह",
"language": "hindi",
"count": 4,
"format": "svg"
}'Response
{
"success": true,
"data": {
"libraryResults": [
{
"id": "art_abc123",
"displayName": "शुभ विवाह",
"thumbnailUrl": "https://...",
"source": "library",
"category": { "name": "Wedding", "slug": "wedding" }
}
],
"generatedResults": [
{
"id": "gen_xyz789",
"fontId": "font-uuid",
"fontFamily": "Calligraphy Pro",
"resultText": "...",
"source": "generated",
"svg": {
"path": "M10 20 C30 40...",
"width": 800,
"height": 200,
"svgString": "<svg>...</svg>"
}
}
],
"metadata": {
"fontSelection": { "wasAutoSelected": true, "detectedLanguage": "hindi" },
"processingTimeMs": 245
}
},
"usage": { "monthlyUsed": 42, "monthlyLimit": 5000, "remaining": 4958 }
}/api/v1/library/searchSearch the Inkora calligraphy art library.
Query Parameters
| Param | Type | Description |
|---|---|---|
q | string | Search query (text or name) |
category | string | Category slug: "wedding", "festival", "religious" |
language | string | Language code: "hi", "mr", "gu", "en" |
page | number | Page number (default: 1) |
limit | number | Results per page (default: 20, max varies by plan) |
curl "https://studio99.app/api/v1/library/search?q=diwali&language=hi&limit=10" \
-H "X-API-Key: your_api_key"/api/v1/library/{id}Get full details of a single artwork by ID, shortId, or slug.
curl "https://studio99.app/api/v1/library/art_abc123" \
-H "X-API-Key: your_api_key"/api/v1/fontsList all available fonts with metadata. Font files are never exposed.
curl "https://studio99.app/api/v1/fonts" \
-H "X-API-Key: your_api_key"Response
{
"success": true,
"data": {
"fonts": [
{
"id": "font-uuid",
"name": "Calligraphy Pro",
"slug": "calligraphy-pro",
"family": "CalligraphyPro",
"languages": ["Hindi", "Marathi"],
"style": "CALLIGRAPHY",
"weight": "REGULAR",
"categories": ["wedding", "festival"]
}
]
}
}Error Codes
All errors return a standard format:
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Monthly API call limit of 100 exceeded."
}
}| Code | HTTP | Description |
|---|---|---|
AUTHENTICATION_REQUIRED | 401 | Missing or invalid API key |
RATE_LIMIT_EXCEEDED | 429 | Monthly quota or burst limit exceeded |
INVALID_INPUT | 400 | Bad request body or parameters |
TEXT_TOO_LONG | 400 | Exceeds tier's max text length |
FONT_NOT_FOUND | 404 | Invalid fontId or artwork not found |
GENERATION_FAILED | 500 | Internal generation error |
Rate Limits
Rate limits are applied per API key at two levels:
- Burst limit: Requests per minute (varies by plan: 5-120 req/min)
- Monthly limit: Total API calls per billing month (varies by plan: 100-unlimited)
Rate limit info is included in response headers:
X-RateLimit-Limit: 20 # Max requests per minute
X-RateLimit-Remaining: 18 # Remaining in current window
X-RateLimit-Reset: 1704067200 # Window reset time (Unix)When rate-limited, the API returns HTTP 429 with a RATE_LIMIT_EXCEEDED error. Implement exponential backoff in your client.
Need help? Contact us or check the pricing page.