curl --request POST \
--url https://api.entendre.finance/v1/agents \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "Monthly close assistant",
"description": "Reviews the month-end close checklist."
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Monthly close assistant',
description: 'Reviews the month-end close checklist.'
})
};
fetch('https://api.entendre.finance/v1/agents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.entendre.finance/v1/agents"
payload = {
"name": "Monthly close assistant",
"description": "Reviews the month-end close checklist."
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"id": "agt_abc123",
"name": "Monthly close assistant",
"agent_type": "custom",
"status": "paused",
"is_active": false,
"description": null,
"cron_expressions": [],
"schedule": [],
"triggers": [],
"organization_id": "org_507f1f77bcf86cd799439011",
"last_run_at": null,
"last_error_message": null,
"last_agent_run_status": null,
"owner_user_id": null,
"reviewer_user_id": null,
"created_at": "2026-08-31T12:00:00Z",
"updated_at": "2026-08-31T12:00:00Z",
"created_by": null
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid path, query or request body.",
"request_id": "req_example"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or expired API Key",
"request_id": "req_example",
"suggested_action": "Send an API key in X-API-Key, or an OAuth access token as Authorization: Bearer. Refresh an expired access token.",
"documentation_url": "https://entendre.ai/docs/get-started/authentication"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Insufficient access to organization",
"request_id": "req_example"
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"request_id": "req_example"
}
}{
"error": {
"code": "CONFLICT",
"message": "The resource state does not allow this operation.",
"request_id": "req_example"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 30s.",
"request_id": "req_example"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"request_id": "req_example"
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Service unavailable.",
"request_id": "req_example"
}
}Create agent
Creates an agent with task instructions and an optional schedule.
curl --request POST \
--url https://api.entendre.finance/v1/agents \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "Monthly close assistant",
"description": "Reviews the month-end close checklist."
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Monthly close assistant',
description: 'Reviews the month-end close checklist.'
})
};
fetch('https://api.entendre.finance/v1/agents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.entendre.finance/v1/agents"
payload = {
"name": "Monthly close assistant",
"description": "Reviews the month-end close checklist."
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"id": "agt_abc123",
"name": "Monthly close assistant",
"agent_type": "custom",
"status": "paused",
"is_active": false,
"description": null,
"cron_expressions": [],
"schedule": [],
"triggers": [],
"organization_id": "org_507f1f77bcf86cd799439011",
"last_run_at": null,
"last_error_message": null,
"last_agent_run_status": null,
"owner_user_id": null,
"reviewer_user_id": null,
"created_at": "2026-08-31T12:00:00Z",
"updated_at": "2026-08-31T12:00:00Z",
"created_by": null
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid path, query or request body.",
"request_id": "req_example"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or expired API Key",
"request_id": "req_example",
"suggested_action": "Send an API key in X-API-Key, or an OAuth access token as Authorization: Bearer. Refresh an expired access token.",
"documentation_url": "https://entendre.ai/docs/get-started/authentication"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Insufficient access to organization",
"request_id": "req_example"
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"request_id": "req_example"
}
}{
"error": {
"code": "CONFLICT",
"message": "The resource state does not allow this operation.",
"request_id": "req_example"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 30s.",
"request_id": "req_example"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"request_id": "req_example"
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Service unavailable.",
"request_id": "req_example"
}
}Authorizations
Your organization API key. See Authentication.
Headers
Unique key for this operation. Retry with the same key and request body after a timeout. Keys are retained for at least 24 hours.
1 - 255Body
Scheduling is optional. Omit scheduling fields to create an on-demand agent.
Display name for the agent.
Human-readable description of what this agent should do.
Five-field cron expressions in the organization timezone, such as 0 2 * * *.
Natural language schedule as an alternative to cron_expressions (such as "every weekday at 9am").
Legal entities this agent operates on.
100Show child attributes
Show child attributes
Financial account sources this agent operates on.
100Show child attributes
Show child attributes
Email addresses for run notifications.
Slack channel ID for notifications.
Owner (usr_…). Omit it or send null to make the creating user the owner. To clear the owner later, send null to Update agent.
The reviewer user id. Native tool approval requests go to this reviewer. If no reviewer is assigned, requests go to the owner.
MCP connections that the agent can use. Omit for none.
50Response
Created.
Show child attributes
Show child attributes