millionways API

Behavioral intelligence for high-stakes decisions

millionways delivers behavioral insight to support critical decisions across finance and leadership. Built on Thorsten 4, our proprietary Large Psychology Model, grounded in over a decade of behavioral research.

Behavioral intelligence is the missing AI layer. Generative models predict what comes next. Thorsten 4 analyzes behavioral patterns that shape how decisions are formed, even when outputs appear similar.

Thorsten 4 can operate independently or alongside generative models to surface decision-relevant behavioral signals where traditional AI falls short. Designed for environments where uncertainty, pressure, and consequence matter, emphasizing interpretability and behavioral insight to support human judgment, not opaque automation.

Investment Portfolio Construction Leadership Evaluation Executive Candidate Assessment Hiring & Succession Planning Strategy Decisions High-Stakes Contexts

Core Endpoints

Endpoint Description
POST /v1/analyze Analyze text to extract personality profile
POST /v1/chat Chat with personality context and prompt injection
POST /v1/match Calculate compatibility between profiles

Quickstart

1. Get your API key

Contact mail@millionways.ai to get your API key.

2. Analyze text

Extract a personality profile from any text:

curl https://api.millionways.org/v1/analyze \
  -H "Authorization: Bearer $MILLIONWAYS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "I thrive in competitive environments and always push myself to exceed targets. Building strong relationships with my team is important, but I believe results speak louder than words."
  }'

3. Use the profile in chat

Inject the profile into a chat context with your custom prompt:

curl https://api.millionways.org/v1/chat \
  -H "Authorization: Bearer $MILLIONWAYS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user", "content": "How should I approach this customer about pricing?"}
    ],
    "profile": {
      "motives": {"power": 65, "achievement": 80, "contact": 40}
    },
    "system_prompt": "This profile is from a customer discovery call. Help the sales rep close this deal."
  }'

Authentication

The API uses Bearer token authentication. Include your API key in the Authorization header:

Authorization: Bearer YOUR_API_KEY
Best practice

Store your API key in an environment variable and never commit it to source control.

Analyze

Analyze real-world material — text or audio from earnings calls, interviews, meetings, or integrated systems via our API. Thorsten 4 identifies decision-relevant behavioral patterns across language, interaction, and context, surfacing interpretable behavioral insight that adds behavioral context alongside existing data and qualitative inputs.

POST /v1/analyze

Request body

ParameterTypeDescription
contentrequired string Text to analyze (max 50,000 characters)
languageoptional string Language code. Defaults to "en". Non-English is auto-translated.

Response

{
  "id": "analysis_a1b2c3d4e5f6",
  "object": "analysis",
  "created": 1706140800,
  "profile": {
    "motives": {
      "power": 65,
      "achievement": 80,
      "contact": 40
    },
    "emotions": {
      "approach": 72,
      "avoidance": 28
    },
    "preferences": {
      "external": 60,
      "internal": 40,
      "detail": 45,
      "realization": 55,
      "analytical": 50,
      "holistic": 50,
      "path": 35,
      "goal": 65
    }
  },
  "levels": {
    "level1": 5,
    "level2": 15,
    "level3": 30,
    "level4": 40,
    "level5": 10
  },
  "insights": {
    "summary": "High achievement drive with strong focus on results...",
    "strengths": ["Goal-oriented", "Competitive drive"],
    "development_areas": ["Relationship building"]
  },
  "usage": {
    "characters": 847
  }
}

Chat

Chat with personality context. Inject a millionways profile and a custom system prompt to build human-intelligence LLM products.

POST /v1/chat

Request body

ParameterTypeDescription
messagesrequired array Array of message objects with role and content
profilerequired object Personality profile from /v1/analyze
system_promptoptional string Custom prompt for context injection (see Prompt Injection)
contextoptional string Preset context: empathy, hr, sales, support, health
levelsoptional object Developmental levels from /v1/analyze
streamoptional boolean Enable streaming. Defaults to false.
max_tokensoptional integer Max response tokens. Defaults to 500.

Example: Custom prompt injection

curl https://api.millionways.org/v1/chat \
  -H "Authorization: Bearer $MILLIONWAYS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user", "content": "What questions should I ask in the second interview?"}
    ],
    "profile": {
      "motives": {"power": 30, "achievement": 85, "contact": 60}
    },
    "system_prompt": "This profile is from a job candidate resume. Help the hiring manager prepare for a second interview. Focus on validating the high achievement drive and assessing team collaboration skills."
  }'

Response

{
  "id": "chat_x1y2z3",
  "object": "chat.completion",
  "created": 1706140900,
  "content": "Based on this candidate's profile, I recommend focusing on...",
  "usage": {
    "prompt_tokens": 245,
    "completion_tokens": 312,
    "total_tokens": 557
  }
}

Match

Calculate compatibility between two personality profiles. Useful for team composition, candidate-role fit, and relationship insights.

POST /v1/match

Request body

ParameterTypeDescription
profile_arequired object First personality profile
profile_brequired object Second personality profile
contextoptional string Context for matching (e.g., "team", "hiring")

Response

{
  "id": "match_m1n2o3",
  "object": "match",
  "created": 1706141000,
  "score": 72,
  "compatibility": {
    "overall": 72,
    "motives": 68,
    "emotions": 75,
    "preferences": 74
  },
  "insights": {
    "strengths": [
      "Aligned achievement orientation",
      "Compatible social and connection needs"
    ],
    "challenges": [
      "Different levels of desire for control"
    ],
    "recommendations": [
      "Establish clear decision-making boundaries early"
    ]
  }
}

Profiles

A profile is the structured output from the /v1/analyze endpoint. It contains three main components:

Motives

Core psychological drivers (0-100 scale):

Emotions

Emotional regulation patterns:

Preferences

Cognitive and behavioral styles:

Prompt Injection

The system_prompt parameter lets you inject custom context into the chat. This is how you tell the AI how to interpret the profile and what to do with it.

Example prompts

Sales Intelligence

"This profile is from a customer discovery call transcript. Help the sales rep understand how to position our product and anticipate objections based on the customer's communication style."

Hiring

"This profile is from a job candidate's cover letter and writing sample. Help the hiring manager assess fit for a senior engineering role that requires both technical leadership and cross-functional collaboration."

Customer Support

"This profile is from a customer's support ticket history. Help the support agent de-escalate this frustrated customer by adapting their communication approach."

Healthcare

"This profile is from a patient intake form. Help the clinician understand how to communicate treatment options in a way that resonates with this patient's decision-making style."

Preset Contexts

Instead of writing a custom system_prompt, you can use preset contexts:

ContextDescription
empathy Empathetic support — validating, understanding, non-judgmental
hr HR intelligence — candidate evaluation, team fit, hiring insights
sales Sales intelligence — customer insights, objection handling, closing strategies
support Support optimization — de-escalation, personalized resolution
health Healthcare communication — patient communication, adherence support
Note

If you provide both system_prompt and context, the custom system_prompt takes precedence.

Errors

The API uses standard HTTP status codes and returns errors in a consistent format:

{
  "error": {
    "type": "invalid_request_error",
    "message": "content is required",
    "param": "content"
  }
}
StatusTypeDescription
400 invalid_request_error Invalid parameters or request body
401 authentication_error Invalid or missing API key
403 permission_error Access denied
429 rate_limit_error Too many requests
500 api_error Internal server error

Rate Limits

PlanRequests/dayMax content length
Standard 500 50,000 characters
Unlimited Unlimited 50,000 characters

Rate limits reset at midnight UTC.