Skip to main content

API reference

Finn setup and results

Draft with AI, call flow, variables, handbook, speech, share links, stats and analytics.

Beta. The setup endpoints on this page need Finn editing by API switched on for your organization. While it is off, each of them answers 404. Ask Finn support to turn it on. The results endpoints at the end work for every organization.

Overview

Finns covers creating, reading and updating a Finn. This page covers the rest of a Finn's setup: drafting one with AI, its call flow, variables, handbook and speech settings, copies and share links. It also covers the results you read back after calls.

Base URL: https://api.hirefinn.ai/api/v1. Auth: Authorization: Bearer finn_live_.... See authentication.

Scopes: reads need finn:read and writes need finn:write. An org API key may use voice:read and voice:write instead. See scopes.

Responses use the { "success": true, "data": ... } envelope, like the other voice endpoints.

Rules for edits

  • Edits change a draft Finn only. A live Finn gets 403 finn_not_draft.
  • A member's token (OAuth or a personal MCP key) may edit only drafts that member created. Others get 403 finn_not_yours.
  • Nothing here makes a Finn live. A person does that in Finn, or you deploy it (see deployments).
  • Writes share a limit of 120 per minute per key. Reads share 300 per minute per key.

Draft and copy

MethodPathWhat it does
POST/finns/generateTurn a short brief into a full draft Finn: name, persona, opening line, prompt and post-call fields. Optional voice and language. 10 per minute per key.
POST/finns/{finn_id}/duplicateA new draft copy of any Finn in your organization. Without name it is called "<name> (copy)".
PATCH/finns/{finn_id}/draftThe same body and answer as PATCH /finns/{finn_id}, but refused unless the Finn is a draft.

Settings

MethodPathWhat it does
GET/finns/{finn_id}/settingsWhat GET /finns/{finn_id} leaves out: handbook, speech settings, call flow summary, task settings and knowledge documents.
PATCH/finns/{finn_id}/handbookChange handbook switches. Send only the ones to change, for example {"handbook": {"accuracy": {"natoPhonetic": true}}}.
PATCH/finns/{finn_id}/speech_settingsChange speech settings, for example {"speech_settings": {"ttsSpeed": 1.1}}. null or "" removes a setting. An unknown setting or a value out of range gets 400.
GET/finns/{finn_id}/variablesPlaceholders in the prompt fields, the placeholder to CSV column mapping, and the post-call fields.
PATCH/finns/{finn_id}/variablesChange the mapping (set_mapping, remove_mapping), turn it on or off (mapping_enabled), or replace post_call_fields.

See variables and post-call analysis for what these settings do on a call.

Call flow

MethodPathWhat it does
GET/finns/{finn_id}/flowThe call flow canvas as nodes and edges, and whether it runs instead of the prompt.
POST/finns/{finn_id}/flow/enableThe Finn follows its call flow instead of its prompt. 409 flow_empty when there is no flow.
POST/finns/{finn_id}/flow/disableThe Finn runs on its prompt. The canvas is kept.

To change the canvas itself, send call_flow to PATCH /finns/{finn_id}. See call flows.

MethodPathWhat it does
GET/finns/{finn_id}/share_linkThe latest share link, or null. A share link is a public page where anyone can talk to the Finn.
POST/finns/{finn_id}/share_linkReturns the latest link, or makes one (201). A link that was turned off stays off.

Calls on a share link use your organization's credit.

Results

MethodPathScopeWhat it does
GET/finns/{finn_id}/statsfinn:readTotals only: calls, answered, successful, voicemail, minutes and cost, by status, direction and sentiment.
GET/finns/{finn_id}/outcomesfinn:readPost-call answers summed up per field: counts per choice and number ranges. A free-text answer shows only when it came up at least 3 times, with digits masked.
GET/finns/{finn_id}/post_call_analysisvoice:readEach post-call question with how its answers are spread across calls. Works without Finn editing.
GET/deployments/{id}/analyticsvoice:readOne deployment's totals: calls placed and answered, rates, durations and how calls ended. Works without Finn editing.

Stats, outcomes and post-call analysis take optional from and to to narrow the window. Deployment analytics covers the whole deployment. It is computed when you ask, so it is right for a deployment that is still running. Per-call answers are on GET /calls/{call_uuid} (see calls).

Example: draft a Finn with AI

curl -X POST https://api.hirefinn.ai/api/v1/finns/generate \
  -H "Authorization: Bearer $FINN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "brief": "Call people who asked for a dental check-up quote. Confirm the clinic they chose and book a slot.",
    "language": "en"
  }'

The answer is 201 with the new draft (some fields left out):

{
  "success": true,
  "data": {
    "id": "8f14e45f-ceea-467a-9f6a-1c0e5b2a77d1",
    "name": "Check-up Booking",
    "status": "draft",
    "language": "en",
    "begin_message": "Hi, this is Finn from the clinic. Is now a good time?",
    "post_call_analysis": []
  }
}

Read it back, change what you need with PATCH /finns/{finn_id}/draft, and try it on a test call before you deploy it. Without a voice, the AI picks one your organization can use.

Then read deployment results:

curl https://api.hirefinn.ai/api/v1/deployments/6b1f0c2e-3d4a-4f5b-9c8d-2e7a1b9f4c03/analytics \
  -H "Authorization: Bearer $FINN_API_KEY"
{
  "success": true,
  "data": {
    "deployment_id": "6b1f0c2e-3d4a-4f5b-9c8d-2e7a1b9f4c03",
    "calls": { "total": 120, "answered": 86, "completed": 80, "unanswered": 28, "voicemail": 6, "successful": 54 },
    "rates": { "answer_rate_percent": 71.67, "success_rate_percent": 45, "voicemail_rate_percent": 5 },
    "duration": { "total_seconds": 7420, "average_seconds": 86 }
  }
}