Eposyne Director

Getting started

From a new account to your first decision in a few minutes. You need a terminal with curl.

1. Create an account

Sign up at https://architect.eposyne.com/register. The hosted Director needs a Pro plan or higher; Free and Starter accounts are refused with 403 feature_not_in_plan. New accounts can earn a EUR 3 welcome credit by completing the survey shown after sign-up.

2. Add usage credits

Hosted decisions are paid from your account's usage credits. Open https://architect.eposyne.com/profile?section=credits, turn usage credits on, and buy credits. The minimum purchase is EUR 5 of credits, plus 21% Dutch VAT and the payment processing fee. Details are on Billing and limits.

3. Create a Director API key

Open https://architect.eposyne.com/profile?section=director-keys, give the key a name, and create it. The key starts with epd_ and is shown once. Copy it now. You can have up to 10 active keys.

Keep it private

Keep the key on a server or on your own machine. Never put it in a game build that players download, and never in a web page. See API keys and security.

4. Put the key in an environment variable

bash, zsh
export EPOSYNE_API_KEY="epd_your_key_here"
PowerShell (use curl.exe in the commands below)
$env:EPOSYNE_API_KEY = "epd_your_key_here"

5. Check that the service is up

This call needs no key.

Request
curl https://director.eposyne.com/health
Response
{"status": "ok"}

6. Make your first decision

Save this request as request.json. It asks whether the guards should pursue a thief or hold position, and lets the model change three variables.

request.json
{
  "schema": "eposyne.director.decision-request/v2",
  "ask": "Should the guards pursue the fleeing thief or hold position to protect the dignitary?",
  "variables": {
    "guard_stance": "patrol",
    "guard_morale": 50,
    "thief_distance": "50m",
    "dignitary_threat": "low",
    "reinforcements_available": true
  },
  "mutable": [
    {"name": "guard_stance", "allowed_values": ["patrol", "pursue", "hold", "alert"]},
    {"name": "guard_morale", "range": {"min": 0, "max": 100}},
    {"name": "dignitary_threat", "allowed_values": ["low", "medium", "high"]}
  ]
}

Send it:

Request
curl -X POST "https://director.eposyne.com/v2/decide?rationale=true" \
  -H "Authorization: Bearer $EPOSYNE_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

The reply is JSON too. rationale=true asks for a short reason per change, which helps while you try things out; leave it out in a shipped game, where nobody reads it. The text of a rationale differs from call to call, and the model may change fewer variables than in this example, or none.

Response (example)
{
  "schema": "eposyne.director.decision-response/v2",
  "changes": [
    {
      "name": "guard_stance",
      "value": "hold",
      "rationale": "Dignitary protection takes priority over one thief."
    },
    {
      "name": "dignitary_threat",
      "value": "high",
      "rationale": "A visible theft nearby raises the threat level."
    }
  ]
}

Each entry of changes names one of your mutable variables, gives a new value that satisfies the rule you declared for it (with the same JSON type as the current value), and, because you asked, adds a short rationale. An empty changes array is a normal answer that means "no suggestions". Treat it as the cue to run your scripted behavior.

Add -i to the curl command to see the response headers, including X-LLM-Provider, X-LLM-Model, and the token counts.

The decide request page describes every member, the optional operations, validation, and metadata, and the limits.

7. Check what it cost

Request
curl https://director.eposyne.com/v2/usage/me \
  -H "Authorization: Bearer $EPOSYNE_API_KEY"
Response (example)
{
  "month": "2026-09",
  "spent_eur": 1.25,
  "cap_eur": 10,
  "remaining_eur": 8.75,
  "resets_at": "2026-10-01T00:00:00Z"
}

spent_eur is what the account has spent on decisions this month, in euro. Read it after a decision. Models and usage explains every field.

8. See which models you can use

Request
curl https://director.eposyne.com/v2/models \
  -H "Authorization: Bearer $EPOSYNE_API_KEY"

The list includes the price of each model. You do not have to choose: without a selection Director uses its default.

9. Going further: events, Plots, and Memory

A decision knows only what is in its request. To let Director follow your story, send it what happens in your game, and switch on two modules: Plots tracks story arcs, and Memory gives characters a past. Both are off by default. Switch them on under Modules at https://architect.eposyne.com/profile?section=director-keys. Their model calls are paid from your usage credits like decisions, so read Policy first.

If something fails

The full list is on Errors and retries.