Skip to main content
POST
/
agent-eval
/
personas
Create persona
curl --request POST \
  --url https://api.goyappr.com/agent-eval/personas \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "Frustrated tenant",
  "identity_prompt": "<string>",
  "description": "<string>",
  "behavior_traits": {},
  "language": "en",
  "voice_config": {}
}
'
{
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "company_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "name": "Frustrated tenant",
  "identity_prompt": "You are a 38-year-old tenant calling about a leaking pipe in your kitchen. You're frustrated because this is the third time you've reported it.",
  "language": "en",
  "created_at": "2023-11-07T05:31:56Z",
  "description": "<string>",
  "behavior_traits": {
    "patience": "low",
    "verbosity": "chatty",
    "cooperation": "cooperative",
    "interruption_tendency": "occasional",
    "goal": "Get a maintenance technician scheduled today"
  },
  "voice_config": {},
  "updated_at": "2023-11-07T05:31:56Z",
  "deleted_at": "2023-11-07T05:31:56Z"
}

Documentation Index

Fetch the complete documentation index at: https://docs.goyappr.com/llms.txt

Use this file to discover all available pages before exploring further.

A persona is a reusable caller archetype. The same persona can sit behind dozens of cases, each one pairing the persona with a different agent or scenario.

Designing the prompt

Lead with the persona’s role and what brought them to the call:
You are a 38-year-old tenant calling about a leaking pipe in your kitchen.
You're frustrated because this is the third time you've reported it. You
have time to talk for 5 minutes; you want a technician scheduled today,
not tomorrow.
Keep the prompt under ~120 words. Long prompts make the persona LLM rigid and the conversation less natural. Put adjustable axes (patience, verbosity, cooperation) in behavior_traits, not the prompt — that way one identity becomes many variants.

Common behavior_traits keys

KeyValues
patiencelow, medium, high
verbosityterse, chatty
cooperationcooperative, adversarial, confused
interruption_tendencynone, occasional, frequent
goalFree-form one-line description of what the persona is trying to achieve
accent / dialectOptional flavour hints (e.g. “Tel Aviv slang”, “formal Hebrew”)
The persona LLM reads whatever keys you pass — you can invent new ones.

Authorizations

Authorization
string
header
required

Your Yappr API key (e.g. ypr_live_...). Generate one in the dashboard under Settings → API Keys.

Body

application/json
name
string
required
Example:

"Frustrated tenant"

identity_prompt
string
required
description
string
behavior_traits
object
language
enum<string>
default:en
Available options:
he,
en
voice_config
object

Response

Persona created

Reusable caller archetype consumed by eval cases. The identity_prompt plus behavior_traits shape how the persona LLM responds; the same persona can be reused across many cases.

id
string<uuid>
required
company_id
string<uuid>
required
name
string
required
Example:

"Frustrated tenant"

identity_prompt
string
required

System prompt fragment defining who the persona is. Written second-person ("You are…").

Example:

"You are a 38-year-old tenant calling about a leaking pipe in your kitchen. You're frustrated because this is the third time you've reported it."

language
enum<string>
default:en
required
Available options:
he,
en
created_at
string<date-time>
required
description
string | null
behavior_traits
object

Free-form JSON. Common keys: patience (low|medium|high), verbosity (terse|chatty), cooperation (cooperative|adversarial), interruption_tendency (none|occasional|frequent), accent / dialect hints, goal (what the persona is trying to achieve in the call).

Example:
{
"patience": "low",
"verbosity": "chatty",
"cooperation": "cooperative",
"interruption_tendency": "occasional",
"goal": "Get a maintenance technician scheduled today"
}
voice_config
object

Forward-compat for v2 voice-mode (TTS/STT loopback). Ignored in text mode.

updated_at
string<date-time>
deleted_at
string<date-time> | null