IndusAI Developer APIs let external systems authenticate and manage the authenticated developer's own agent resources, including agent creation, configuration, prompt tooling, call outcomes, call input fields, and runtime service settings. Use the developer login endpoint to obtain a bearer token for the recommended integration flow. Some older endpoints continue to support API-key-based access and are marked as legacy.
/api/agents/.../api/...POST /api/login.Authorization: Bearer <token>.These docs do not include internal, admin, observability, or team-management endpoints. All documented Developer Agent Management APIs are scoped to the authenticated user only.
{
"status_code": 200,
"message": "human readable message",
"error": null,
"data": {}
}
{
"status_code": 200,
"message": "Login successful",
"error": null,
"data": {
"access_token": "<jwt>",
"refresh_token": "<jwt>",
"token_type": "bearer"
}
}
Developer users should authenticate once with email and password, then send the returned access token as a bearer token on developer-facing APIs scoped to their own data.
/api/loginAuthenticates a developer user using email and password and returns access and refresh tokens for bearer-token-based developer APIs.
| Name | Type | Default | Description |
|---|---|---|---|
email | string | required | Developer account email. |
password | string | required | Developer account password. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns access_token, refresh_token, and token_type. |
400 Bad Request | application/json | Incorrect email/password, inactive user, or unverified user. |
{
"email": "developer@example.com",
"password": "your-password"
}
curl -X POST \
"https://developer.induslabs.io/api/login" \
-H "Content-Type: application/json" \
-d '{
"email": "developer@example.com",
"password": "your-password"
}'
{
"status_code": 200,
"message": "Login successful",
"error": null,
"data": {
"access_token": "<jwt>",
"refresh_token": "<jwt>",
"token_type": "bearer"
}
}
This older API-key-based endpoint remains available for backward compatibility, but new integrations should move to bearer-token developer endpoints.
/api/agentsReturns all agents belonging to the user associated with the provided API key.
Legacy API-key endpoint. New integrations should use bearer-token-based developer APIs.
| Name | Type | Default | Description |
|---|---|---|---|
api_key | string | required | Developer API key provided in the JSON body. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns agents inside the standard response envelope. |
400 Bad Request | application/json | Missing api_key or invalid API key. |
500 Internal Server Error | application/json | Unexpected server error. |
{
"api_key": "your-api-key"
}
{
"status_code": 200,
"message": "Agents fetched",
"error": null,
"data": {
"agents": [
{
"id": "...",
"agent_id": "AGT_XXXX",
"agent_name": "Sales Agent",
"agent_description": "Handles sales calls",
"user_id": "...",
"organization_id": "...",
"team": [],
"is_active": true,
"agent_type": "OUTBOUND",
"whatsapp_enabled": false,
"is_auto": true,
"team_size": 0,
"created_at": "...",
"updated_at": "...",
"agent_cost": 5.0,
"livekit_api_key": "...",
"livekit_host_url": "..."
}
]
}
}
These endpoints expose self-service agent CRUD under the developer namespace. They are documented only for the authenticated developer to manage their own agent resources.
/api/agents/createCreates a new agent and its initial config, with optional first call outcome and call infield definitions.
Creation uses `/create` because POST `/api/agents` is already reserved by a legacy endpoint.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token> from /api/login. |
agent_in | object | required | Agent definition including name, description, team, agent_type, and is_auto. |
agent_config | object | required | Initial prompt and service configuration payload. |
call_outcome | object | optional | Optional first outcome definition created alongside the agent. |
call_infield | object | optional | Optional first input field definition created alongside the agent. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the created agent object as a raw model response. |
400 Bad Request | application/json | Duplicate agent name. |
403 Forbidden | application/json | Unauthorized developer user. |
500 Internal Server Error | application/json | Failure while creating config, outcome, or infield. |
{
"agent_in": {
"agent_name": "Outbound Sales Agent",
"agent_description": "Handles outbound calls for product demos",
"team": [],
"agent_type": "OUTBOUND",
"is_auto": true
},
"agent_config": {
"system_prompt": "You are a helpful sales voice agent.",
"starting_instructions": "Greet the user and ask qualifying questions.",
"agent_type": "generic_alpha",
"guardrail_ids": [
"personality_v1",
"environment_v1",
"tone_v1",
"goal_v1",
"Guardrails_v1",
"ethical_v1",
"data_formatting_v1",
"disconnect_guardrail_v1"
],
"metadata_schema": [],
"examples": [],
"guidelines": [],
"llm_config": {
"provider": "groq",
"model": "openai/gpt-oss-120b",
"temperature": 0,
"max_tokens": 0,
"context_turns": 0
},
"notes": "Initial production config",
"tts_config": {
"voice_id": "Indus-hi-maya"
},
"stt_config": {
"provider": "deepgram",
"language": "hi"
},
"vad_config": {
"min_silence_duration": 0.3,
"min_speech_duration": 0.4,
"activation_threshold": 0.45
}
},
"call_outcome": {
"outcome_name": "lead_status",
"outcome_description": "Lead qualification result",
"outcome_type": "FIXED",
"outcome_enum": ["qualified", "not_qualified", "follow_up"],
"is_visible": true
},
"call_infield": {
"field_name": "customer_budget",
"field_type": "NUMBER",
"field_enum": null,
"is_visible": true
}
}
curl -X POST \
"https://developer.induslabs.io/api/agents/create" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access_token>" \
-d @create-agent.json
{
"id": "mongo-id",
"agent_id": "AGT_12345678",
"agent_name": "Support Agent",
"agent_description": "Handles support conversations",
"user_id": "user-id",
"organization_id": "org-id",
"team": [
{
"user_id": "user-id",
"role": "member",
"added_at": "2026-03-11T10:00:00Z"
}
],
"is_active": true,
"agent_type": "INBOUND",
"whatsapp_enabled": false,
"is_auto": true,
"team_size": 1,
"created_at": "2026-03-11T10:00:00Z",
"updated_at": "2026-03-11T10:00:00Z",
"agent_cost": 5.0,
"livekit_api_key": "optional",
"livekit_api_secret": "optional",
"livekit_host_url": "optional"
}
/api/agents/{agent_id}Fetches a single agent by its public `agent_id` such as `AGT_12345678`.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Public agent identifier. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns a single agent object. |
403 Forbidden | application/json | Not authorized for this agent. |
404 Not Found | application/json | Agent not found. |
/api/agents/{agent_id}Partially updates an existing agent owned by the authenticated developer.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Public agent identifier. |
body | object | required | Any editable subset of the agent payload. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the updated agent object. |
400 Bad Request | application/json | Failed to update. |
403 Forbidden | application/json | Not authorized. |
404 Not Found | application/json | Agent not found. |
/api/agents/{agent_id}Deletes an agent owned by the authenticated developer.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Public agent identifier. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns `{ "message": "Agent deleted successfully" }`. |
403 Forbidden | application/json | Not authorized. |
404 Not Found | application/json | Agent not found. |
Config endpoints handle versioned prompts and service settings for the authenticated developer’s own agents. Draft and published versions are distinct, and publish operations can clone current outcomes and infields into the new current version.
/api/agents/{agent_id}/configsCreates a new config version for an agent as a draft, or publishes it immediately when `publish=true`.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
publish | query boolean | false | Publish immediately when true. |
body | AgentConfigCreate | required | Same shape as the config create payload used during agent creation. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the created config version object. |
/api/agents/{agent_id}/configsLists config versions for an agent, optionally filtered by status.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
status_filter | query string | optional | `draft`, `published`, or `archived`. |
skip | query integer | 0 | Pagination offset. |
limit | query integer | 100 | Page size. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns an array of config version objects. |
/api/agents/{agent_id}/configs/currentReturns the currently active published config for the agent.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the current published config object. |
404 Not Found | application/json | No current config found. |
/api/agents/{agent_id}/configs/{version}Returns a specific config version for an agent.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
version | path integer | required | Config version number. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the requested config version. |
404 Not Found | application/json | Version not found. |
/api/agents/{agent_id}/configs/{version}Updates an existing draft config version. Published configs must be copied into a new draft instead of being edited in place.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
version | path integer | required | Draft version number. |
body | object | required | Partial config fields such as system_prompt, starting_instructions, metadata_schema, examples, guidelines, and notes. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the updated draft config. |
400 Bad Request | application/json | Version is not draft or update failed. |
/api/agents/{agent_id}/configs/{version}Deletes a draft config version.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
version | path integer | required | Draft version number. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Draft config deleted. |
400 Bad Request | application/json | Version is not draft. |
/api/agents/{agent_id}/configs/{version}/publishPublishes a chosen config version and makes it current.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
version | path integer | required | Version to publish. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the published config or publish result. |
/api/agents/{agent_id}/configs/{version}/rollbackRolls back the current agent config to a previous version.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
version | path integer | required | Previously published version to restore. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Rollback completed. |
/api/agents/{agent_id}/configs/enhanceUses prompt enhancement logic to improve the provided prompts and metadata instructions.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
body | AgentConfigCreate | required | Prompt payload to enhance. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns enhanced prompt text and suggestions. |
/api/agents/{agent_id}/configs/renderRenders prompt templates using metadata values against either a selected version or the current config.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
body | object | required | Raw metadata key/value object used for interpolation. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns rendered prompt text and validation errors. |
{
"customer_name": "Rahul",
"city": "Mumbai"
}
curl -X POST \
"https://developer.induslabs.io/api/agents/AGT_12345678/configs/render" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access_token>" \
-d '{
"customer_name": "Rahul",
"city": "Mumbai"
}'
{
"rendered_system_prompt": "...",
"rendered_starting_instructions": "...",
"errors": []
}
/api/agents/{agent_id}/configs/validateValidates metadata values against the agent config metadata schema.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
body | object | required | Metadata values to validate. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns `{ valid, errors }`. |
{
"customer_name": "Rahul",
"city": "Mumbai"
}
{
"valid": true,
"errors": []
}
Call outcomes define structured data collected after conversations for the authenticated developer’s own agents.
/api/agents/{agent_id}/call_outcomesCreates a call outcome definition for the agent.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
outcome_name | string | required | Unique outcome name. |
outcome_description | string | required | Human-readable description. |
outcome_type | string | required | TEXT, DATE, BOOLEAN, FIXED, or NUMBER. |
outcome_enum | array | optional | Enum choices when outcome_type is FIXED. |
is_visible | boolean | required | Controls UI visibility. |
| Status | Type | Description |
|---|---|---|
201 Created | application/json | Returns the created outcome wrapped in the standard response envelope. |
/api/agents/{agent_id}/call_outcomesLists all call outcome definitions for the agent.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns outcomes in the standard response envelope. |
/api/agents/{agent_id}/call_outcomes/{outcome_name}Updates a call outcome definition by outcome name.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
outcome_name | path string | required | Outcome to update. |
body | object | required | Partial outcome definition updates. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Updated outcome in response envelope. |
/api/agents/{agent_id}/call_outcomes/{outcome_name}Deletes a call outcome definition by name.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
outcome_name | path string | required | Outcome to delete. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Delete result in response envelope. |
Call infields define structured input fields attached to the authenticated developer’s own agents.
/api/agents/{agent_id}/call_infieldsCreates an input field definition for the agent.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
field_name | string | required | Unique field name. |
field_type | string | required | TEXT, DATE, BOOLEAN, FIXED, or NUMBER. |
field_enum | array | optional | Enum choices when field_type is FIXED. |
is_visible | boolean | required | Controls UI visibility. |
| Status | Type | Description |
|---|---|---|
201 Created | application/json | Created field wrapped in the standard response envelope. |
/api/agents/{agent_id}/call_infieldsLists configured call input fields for the agent.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns call input fields in the response envelope. |
/api/agents/{agent_id}/call_infields/{field_name}Updates a call input field definition by field name.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
field_name | path string | required | Field to update. |
body | object | required | Partial field definition updates. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Updated field in response envelope. |
/api/agents/{agent_id}/call_infields/{field_name}Deletes a call input field definition by name.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Bearer <access_token>. |
agent_id | path string | required | Agent identifier. |
field_name | path string | required | Field to delete. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Delete result in response envelope. |
This endpoint updates one service-specific section of the current config for the authenticated developer’s own agent without replacing the entire config document.
/api/agents/{agent_id}/config/{service_type}Updates exactly one of `tts_config`, `stt_config`, `vad_config`, or `llm_config` on the current config.
| Name | Type | Default | Description |
|---|---|---|---|
Authorization | header | required | Owner bearer token. |
agent_id | path string | required | Agent identifier. |
service_type | path string | required | One of tts_config, stt_config, vad_config, llm_config. |
body | object | required | Payload shape depends on the chosen service_type. |
| Status | Type | Description |
|---|---|---|
200 OK | application/json | Returns the updated config or current config representation. |
400 Bad Request | application/json | Invalid payload or failed update. |
403 Forbidden | application/json | Not authorized. |
404 Not Found | application/json | No current config found. |
POST /api/login.access_token securely and send it as a bearer token.POST /api/agents/create.BASE_URL="https://developer.induslabs.io"
LOGIN_RESP=$(curl -s -X POST "$BASE_URL/api/login" \
-H "Content-Type: application/json" \
-d '{"email":"developer@example.com","password":"your-password"}')
ACCESS_TOKEN=$(echo "$LOGIN_RESP" | jq -r '.data.access_token')
curl -s -X POST "$BASE_URL/api/agents/create" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d @create-agent.json
curl -s "$BASE_URL/api/agents/AGT_12345678" \
-H "Authorization: Bearer $ACCESS_TOKEN"
curl -s -X POST "$BASE_URL/api/agents/AGT_12345678/configs/render" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '{"customer_name":"Rahul","city":"Mumbai"}'
These models appear repeatedly across the developer agent management surface.
{
"id": "mongo-id",
"agent_id": "AGT_12345678",
"agent_name": "Support Agent",
"agent_description": "Handles support conversations",
"user_id": "user-id",
"organization_id": "org-id",
"team": [
{
"user_id": "user-id",
"role": "member",
"added_at": "2026-03-11T10:00:00Z"
}
],
"is_active": true,
"agent_type": "INBOUND",
"whatsapp_enabled": false,
"is_auto": true,
"team_size": 1,
"created_at": "2026-03-11T10:00:00Z",
"updated_at": "2026-03-11T10:00:00Z",
"agent_cost": 5.0,
"livekit_api_key": "optional",
"livekit_api_secret": "optional",
"livekit_host_url": "optional"
}
{
"_id": "mongo-id",
"agent_id": "AGT_12345678",
"system_prompt": "You are a helpful agent.",
"starting_instructions": "Greet the user.",
"agent_type": "generic_alpha",
"guardrail_ids": ["personality_v1", "environment_v1"],
"metadata_schema": [
{
"name": "customer_name",
"type": "string",
"required": true,
"description": "Customer name",
"default": null,
"enum_values": null
}
],
"examples": [
{
"role": "user",
"content": "Hello"
}
],
"guidelines": ["Be concise"],
"call_outcomes": [],
"call_infields": [],
"notes": "Initial config",
"tts_config": {
"voice_id": "Indus-hi-maya"
},
"llm_config": {
"provider": "groq",
"model": "openai/gpt-oss-120b",
"temperature": 0,
"max_tokens": 0,
"context_turns": 0
},
"stt_config": {
"provider": "deepgram",
"language": "hi"
},
"vad_config": {
"min_silence_duration": 0.3,
"min_speech_duration": 0.4,
"activation_threshold": 0.45
},
"version": 1,
"status": "published",
"is_current": true,
"created_at": "...",
"updated_at": "...",
"created_by": "user-id",
"updated_by": "user-id"
}