# Emable API

Developer access to Emable data and asynchronous AI jobs.

The emable platform API: company intelligence, async AI jobs, and workspaces — plus Validator over MCP — the layer that powers Talent and Validator.

## Choose the right path

Start with the outcome you want, not the endpoint list:

| Goal | How | Scope |
|---|---|---|
| Prove a key works and see whose identity it acts as | `GET /v1/me` | `profile:read` |
| Analyze a company website with AI | `POST /v1/company-analyses`, then poll `GET /v1/jobs/{job_id}` | `company:analyze`, `jobs:read` |
| See what a workspace-bounded key can access | `GET /v1/workspaces` | `workspaces:read` |
| Do any of the above from a terminal or CI | The `emable` CLI — see below | same scopes |
| Run Validator from Claude (or any AI assistant) | Connect over MCP — see below | `validator:mcp:access` |

Prefer clicking to reading? The [developer platform](https://emable.ai/developers) shows every capability as a working request, and its [test bench](https://emable.ai/developers/bench) fires them live with your key.

## From the terminal

The `emable` CLI wraps this same API for shell and CI use — one key model, one error vocabulary, no client code:

```bash
emable login                                  # stores a verified key, 0600
emable me                                     # GET /v1/me
emable analyze https://example.com --wait     # submit, then poll to a result
emable jobs get <job_id> --json               # raw payload, for jq
emable mcp install claude-code                # register the MCP server below
```

`--json` prints the untouched API payload. Errors carry the same codes as the REST surface, mapped onto exit codes so scripts can branch: `2` usage, `3` auth (`401`/`403`), `4` quota (`402`).

## Authentication

Every request sends your API key as a bearer token:

```
Authorization: Bearer em_test_your_key_here
```

Keys are created at [emable.ai/developers/keys](https://emable.ai/developers/keys), carry explicit scopes, are bounded to one workspace and can be revoked instantly. Secrets are shown once. Browser sign-in, OAuth, account management and billing webhooks are **not** part of this API — they belong to the emable app and to Stripe.

## Validator over MCP

MCP (Model Context Protocol) lets an AI assistant — Claude, or any MCP client — **run Validator in plain language**: define an audience, pose a hypothesis, run the simulation, and read the GO / NO-GO verdict, all from the chat, no client code. Validator's simulations are grounded in emable's proprietary market data (the advisor and market intelligence behind Talent and Validator), so the personas behave like the real Central-European financial-distribution market, not a generic model guess.

**Connect in three steps:**

1. In the emable app, open **Developers → MCP** (or Validator → Connect to    Claude) and generate a personal connection URL.
2. In claude.ai, go to **Settings → Connectors → Add custom connector** and    paste the URL. For a local client instead, run    `emable mcp install claude-desktop --url "<the URL>"` (also `cursor`,    `claude-code`).
3. Ask Claude, e.g. *"List my validator audiences"* or *"Run a validation:    should we launch a premium advisory tier?"*

**Tools the assistant gets** (each maps to a Validator operation, scoped to your account):

| Tool | What it does |
|---|---|
| `list_audiences` | List your reusable audiences / digital twins |
| `get_audience_details` | Inspect one audience's definition |
| `create_audience` | Build a new audience from a plain-language description |
| `run_validation` | Simulate a hypothesis against an audience |
| `get_result` | Read a run's verdict, sentiment and question breakdown |
| `list_validations` | List past validation runs |

**How the connection authenticates** (you do not call this yourself): the connection URL carries a personal token; the MCP server exchanges it for a short-lived session, scoped `validator:mcp:access`, bound to your account. Revoke a connection any time from the same screen.

## Formats

This reference is also available as clean Markdown at [/llms.txt](/llms.txt) (alias `/docs.md`) — one fetch gives an AI assistant the whole surface — and as machine schema at [/openapi-public.json](/openapi-public.json).


## Quickstart

- **Base URL:** `https://api.emable.ai`
- **First request:**

```bash
curl https://api.emable.ai/v1/me \
  -H "Authorization: Bearer em_test_your_key_here"
```

## AI jobs

### `POST /v1/company-analyses`

**Submit a company analysis**

Queues one tenant-owned `company.analyze_url` job. Requires `company:analyze` and an `Idempotency-Key` header. Repeat submissions with the same canonical input return the original job (and do not consume quota). Each new analysis counts against the key's monthly quota; when it is exhausted the request is rejected with `402` before any work starts. Poll the returned URL for completion.

**Parameters:**
- `Idempotency-Key` (header, string, required)

**Request body:**
- `company_url` (string, required): Absolute HTTP or HTTPS URL for the company website.

**Responses:**
- `202`: Successful Response
- `401`: Missing or invalid API key.
- `402`: The key's monthly company-analysis quota is exhausted.
- `403`: The API key lacks the required scope.
- `404`: The requested resource does not exist.
- `409`: The idempotency key was already used with different input.
- `422`: The request could not be validated.
- `429`: The caller exceeded a future rate limit.
- `500`: An unexpected server error occurred.
- `503`: The database is temporarily unavailable.

### `GET /v1/jobs/{job_id}`

**Get an AI job**

Returns a safe polling view of one job owned by the API-key user. Requires `jobs:read`. Unknown and other-tenant identifiers share the same `404`.

**Parameters:**
- `job_id` (path, string, required)

**Responses:**
- `200`: Successful Response
- `401`: Missing or invalid API key.
- `403`: The API key lacks the required scope.
- `404`: The requested resource does not exist.
- `422`: The request could not be validated.
- `429`: The caller exceeded a future rate limit.
- `500`: An unexpected server error occurred.
- `503`: The database is temporarily unavailable.

## Capabilities

### `GET /v1/capabilities`

**List Capabilities**

**Parameters:**
- `q` (query, string, optional)
- `outcome` (query, string, optional)
- `country` (query, string, optional)
- `provider` (query, string, optional)
- `status` (query, string, optional)
- `access` (query, string, optional)
- `pricing_model` (query, string, optional)

**Responses:**
- `200`: Successful Response
- `422`: Validation Error

### `GET /v1/capabilities/{slug}`

**Capability Detail**

**Parameters:**
- `slug` (path, string, required)

**Responses:**
- `200`: Successful Response
- `422`: Validation Error

## Insurance assistant

### `GET /v1/insurance/catalog`

**What the assistant reads**

Every market the assistant can answer for, with the carriers and document classes behind it. Public and unauthenticated on purpose: a reader has to be able to judge the corpus BEFORE trusting an answer out of it, and that judgement cannot be gated behind the sign-up it is supposed to inform.

Counts only documents that are actually retrievable — loaded AND embedded. A document the assistant cannot reach is not coverage.

`document_types` distinguishes what the documents ARE. `terms` is the binding policy wording, `ipid` the EU-standardised two-page summary, `methodology` a distributor-facing underwriting manual. `provenance` separates documents published by the carrier from documents supplied to us under a distribution relationship — different claims, and only the first is one a reader can go and verify.

**Responses:**
- `200`: Successful Response

## Profile

### `GET /v1/me`

**Get the caller profile**

Returns the six public profile fields for the user resolved from the API key. Requires `profile:read`. The caller cannot provide or override a user ID. Example: `curl -H 'Authorization: Bearer em_test_FAKE...' https://api.example.test/v1/me`.

**Responses:**
- `200`: Successful Response
- `401`: Missing or invalid API key.
- `403`: The API key lacks the required scope.
- `404`: The caller profile does not exist.
- `422`: The request could not be validated.
- `429`: The caller exceeded a future rate limit.
- `500`: An unexpected server error occurred.
- `503`: The database is temporarily unavailable.

## Service status

### `GET /health`

**Check service health**

Returns static process health. This endpoint is public and never queries PostgreSQL.

**Responses:**
- `200`: Successful Response

## Use cases

### `GET /v1/use-cases`

**List Use Cases**

**Parameters:**
- `q` (query, string, optional)
- `outcome` (query, string, optional)
- `country` (query, string, optional)
- `provider` (query, string, optional)
- `status` (query, string, optional)
- `access` (query, string, optional)
- `category` (query, string, optional)
- `max_price` (query, string, optional)

**Responses:**
- `200`: Successful Response
- `422`: Validation Error

### `GET /v1/use-cases/{slug}`

**Use Case Detail**

**Parameters:**
- `slug` (path, string, required)

**Responses:**
- `200`: Successful Response
- `422`: Validation Error

### `POST /v1/use-cases/{slug}/quote`

**Quote Use Case**

**Parameters:**
- `slug` (path, string, required)

**Request body:**
- `input` (object, required)

**Responses:**
- `200`: Successful Response
- `422`: Validation Error

### `POST /v1/use-cases/{slug}/runs`

**Start Use Case Run**

**Parameters:**
- `slug` (path, string, required)

**Request body:**
- `input` (object, required)

**Responses:**
- `202`: Successful Response
- `422`: Validation Error

## Workspaces

### `GET /v1/workspaces`

**List the caller workspaces**

Returns active workspaces where the API-key user is a member. Requires `workspaces:read`. A workspace-bound key returns only its bound workspace. This first list is intentionally unpaginated; future list endpoints use opaque cursor pagination as documented in the README.

**Responses:**
- `200`: Successful Response
- `401`: Missing or invalid API key.
- `403`: The API key lacks the required scope.
- `404`: The requested resource does not exist.
- `422`: The request could not be validated.
- `429`: The caller exceeded a future rate limit.
- `500`: An unexpected server error occurred.
- `503`: The database is temporarily unavailable.



# Capability contracts


# Insurance Assistant

Answer insurance-methodology questions from a published corpus with sources.

- Version: `1.0.0`
- Provider: `emable`
- Status: `live`
- Access: `read`
- Charging unit: One limited corpus question
- Maximum run cost: 0 credits
- Evidence freshness: Corpus catalogue and source metadata are read at request time.
- Execution surfaces: specialist_web, rest

## Dependencies

- None

## Sources

- Published insurer documents indexed in the Emable European insurance corpus.

## Limitations

- Answers only markets and product lines with verified corpus coverage.
- Does not replace regulated professional advice.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 1500,
      "description": "The insurance-methodology question."
    },
    "country": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2,
      "pattern": "^[A-Za-z]{2}$",
      "description": "ISO-2 market code, e.g. CZ, ES."
    },
    "product_line": {
      "type": "string",
      "maxLength": 80,
      "description": "Product line to scope the answer to."
    },
    "language": {
      "type": "string",
      "maxLength": 20,
      "description": "Preferred answer language."
    }
  },
  "required": [
    "question",
    "country"
  ],
  "additionalProperties": false
}
```

# Market Validator

Validate a business decision against a bounded synthetic audience.

- Version: `1.0.0`
- Provider: `emable`
- Status: `live`
- Access: `write`
- Charging unit: One run over 10 personas
- Maximum run cost: 500 credits
- Evidence freshness: Audience and source snapshots are recorded with each Validator run.
- Execution surfaces: specialist_web, mcp

## Dependencies

- A configured audience and Validator execution entitlement

## Sources

- The customer-selected Emable audience and Validator synthetic personas.

## Limitations

- Trial runs are limited to 10 personas.
- Synthetic-persona evidence is directional, not observed customer behavior.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "hypothesis": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    },
    "market": {
      "type": "string",
      "minLength": 2,
      "maxLength": 120
    },
    "audience_id": {
      "type": "string",
      "format": "uuid"
    }
  },
  "required": [
    "hypothesis",
    "market"
  ],
  "additionalProperties": false
}
```

# AFA Assurance

Check an answer against the AFA legislation and ethics assurance matrix.

- Version: `1.0.0`
- Provider: `emable`
- Status: `pilot`
- Access: `read`
- Charging unit: One answer check within the account quota
- Maximum run cost: 0 credits
- Evidence freshness: The response cites the assurance sources used by the configured matrix.
- Execution surfaces: specialist_web, rest

## Dependencies

- Configured AFA legislation and ethics assurance matrix

## Sources

- The legislation and ethics assurance matrix configured in the AFA validator.

## Limitations

- Coverage is limited to the configured Czech assurance matrix.
- A passing check does not constitute legal advice or regulatory approval.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 5000,
      "description": "The client question the answer responds to."
    },
    "answer": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "The AI or advisor answer to judge."
    },
    "check": {
      "type": "string",
      "enum": [
        "legislation",
        "ethics",
        "full"
      ],
      "description": "Which assurance matrix to judge against."
    }
  },
  "required": [
    "question",
    "answer",
    "check"
  ],
  "additionalProperties": false
}
```

# EXA Answer Filter

Judge a written insurance answer against insurer documents and return a trust verdict.

- Version: `1.0.0`
- Provider: `emable`
- Status: `pilot`
- Access: `read`
- Charging unit: One answer judged within the account quota
- Maximum run cost: 0 credits
- Evidence freshness: The verdict reflects the insurer documents indexed at the time of the call.
- Execution surfaces: specialist_web, rest

## Dependencies

- The EXA methodology gateway and its insurer document index

## Sources

- The insurer product documents indexed by the EXA methodology assistant.

## Limitations

- A filter, not an assistant: it never generates an answer, only judges one.
- Coverage follows the indexed insurer corpus, today Czech and Slovak insurers.
- A passing verdict is a grounding signal, not compliance approval. For a MiFID-style compliance verdict use afa__validate_answer.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 5000
    },
    "answer": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000
    },
    "insurer": {
      "type": "string",
      "maxLength": 120
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 2000
      },
      "maxItems": 50
    },
    "country": {
      "type": "string",
      "enum": [
        "CZ",
        "SK"
      ]
    },
    "insurance_type": {
      "type": "string",
      "maxLength": 60
    }
  },
  "required": [
    "question",
    "answer"
  ],
  "additionalProperties": false
}
```

# EU Market Data

Answer aggregate questions about European financial-services markets.

- Version: `1.0.0`
- Provider: `emable`
- Status: `live`
- Access: `read`
- Charging unit: One aggregate query within the BI entitlement
- Maximum run cost: 0 credits
- Evidence freshness: Country and source refresh dates are returned with aggregate results.
- Execution surfaces: specialist_web

## Dependencies

- Reviewed country coverage in the European adviser dataset

## Sources

- Emable European advisor and firm datasets exposed through aggregate queries.

## Limitations

- Trial results are aggregate-only.
- Coverage and refresh dates vary by country and source register.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 1000,
      "description": "The aggregate market question being answered."
    },
    "countries": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 2
      },
      "minItems": 1,
      "maxItems": 10,
      "description": "ISO-2 codes of the markets the question is about."
    }
  },
  "required": [
    "question",
    "countries"
  ],
  "additionalProperties": false
}
```

# Company Intelligence

Analyze a company's public website into a structured market brief.

- Version: `1.0.0`
- Provider: `emable`
- Status: `live`
- Access: `read`
- Charging unit: One public-URL analysis within the account quota
- Maximum run cost: 0 credits
- Evidence freshness: The public website is retrieved for the submitted run.
- Execution surfaces: rest, cli

## Dependencies

- None

## Sources

- Public pages retrieved from the submitted company URL.

## Limitations

- Only publicly reachable HTTP or HTTPS pages can be analyzed.
- The result reflects available website content, not independently verified facts.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "company_url": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048,
      "description": "Absolute public HTTP or HTTPS URL of the company website."
    }
  },
  "required": [
    "company_url"
  ],
  "additionalProperties": false
}
```

# Distribution Intelligence

Analyze authorized distribution data inside a verified workspace.

- Version: `1.0.0`
- Provider: `emable`
- Status: `pilot`
- Access: `read`
- Charging unit: One query within the signed workspace contract
- Maximum run cost: 0 credits
- Evidence freshness: Defined by the signed workspace data contract.
- Execution surfaces: mcp

## Dependencies

- Signed provider data contract
- Verified workspace entitlement

## Sources

- Datasets allowlisted in the signed provider workspace contract.

## Limitations

- Access is restricted to verified workspaces.
- The pilot remains approval-gated until shared OAuth is complete.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 1000
    },
    "dataset": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    }
  },
  "required": [
    "question",
    "dataset"
  ],
  "additionalProperties": false
}
```

# Germany Market Intelligence

Access selected Germany financial-distribution market data with traceable evidence.

- Version: `1.0.0`
- Provider: `nuda`
- Status: `pilot`
- Access: `read`
- Charging unit: Included in a paid Germany Market Intelligence entitlement
- Maximum run cost: 0 credits
- Evidence freshness: Every payload includes package version and checked dates.
- Execution surfaces: specialist_web, mcp

## Dependencies

- Paid Germany Market Intelligence workspace entitlement

## Sources

- NUDA Germany offline market-intelligence package, version 2026-08-27.

## Limitations

- No Germany market values are available without a paid entitlement.
- Named institutions and full decision layers require NUDA Enterprise.
- This capability is read-only and never writes to CRM or a sales pipeline.

## Input schema

```json
{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
```


# Use-case contracts


# Sourced Insurance Answers

Give advisers a source-grounded insurance answer with trust state and citations.

- Version: `1.0.0`
- Provider: `emable`
- Status: `available`
- Maximum run cost: 0 credits
- Evidence freshness: Corpus catalogue and source metadata are read at request time.
- Execution surfaces: rest

## Delivered result

- Answer insurance-methodology questions from a published corpus with sources.

## Steps and maximum charges

- `insurance-assistant`: Insurance Assistant, up to 0 credits

## Limitations

- Answers only markets and product lines with verified corpus coverage.
- Does not replace regulated professional advice.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 1500,
      "description": "The insurance-methodology question."
    },
    "country": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2,
      "pattern": "^[A-Za-z]{2}$",
      "description": "ISO-2 market code, e.g. CZ, ES."
    },
    "product_line": {
      "type": "string",
      "maxLength": 80,
      "description": "Product line to scope the answer to."
    },
    "language": {
      "type": "string",
      "maxLength": 20,
      "description": "Preferred answer language."
    }
  },
  "required": [
    "question",
    "country"
  ],
  "additionalProperties": false
}
```

# Validate Before Shipping

Test a product, price or positioning decision before launch.

- Version: `1.0.0`
- Provider: `emable`
- Status: `available`
- Maximum run cost: 500 credits
- Evidence freshness: Audience and source snapshots are recorded with each Validator run.
- Execution surfaces: mcp

## Delivered result

- Validate a business decision against a bounded synthetic audience.

## Steps and maximum charges

- `market-validator`: Market Validator, up to 500 credits

## Limitations

- Trial runs are limited to 10 personas.
- Synthetic-persona evidence is directional, not observed customer behavior.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "hypothesis": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    },
    "market": {
      "type": "string",
      "minLength": 2,
      "maxLength": 120
    },
    "audience_id": {
      "type": "string",
      "format": "uuid"
    }
  },
  "required": [
    "hypothesis",
    "market"
  ],
  "additionalProperties": false
}
```

# Advice Assurance Check

Check an AI-generated financial answer before it reaches a client.

- Version: `1.0.0`
- Provider: `emable`
- Status: `pilot`
- Maximum run cost: 0 credits
- Evidence freshness: The response cites the assurance sources used by the configured matrix.
- Execution surfaces: rest

## Delivered result

- Check an answer against the AFA legislation and ethics assurance matrix.

## Steps and maximum charges

- `afa-assurance`: AFA Assurance, up to 0 credits

## Limitations

- Coverage is limited to the configured Czech assurance matrix.
- A passing check does not constitute legal advice or regulatory approval.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 5000,
      "description": "The client question the answer responds to."
    },
    "answer": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "The AI or advisor answer to judge."
    },
    "check": {
      "type": "string",
      "enum": [
        "legislation",
        "ethics",
        "full"
      ],
      "description": "Which assurance matrix to judge against."
    }
  },
  "required": [
    "question",
    "answer",
    "check"
  ],
  "additionalProperties": false
}
```

# Advisor Talent Fit

Turn explicit role requirements into a bounded talent-fit brief.

- Version: `1.0.0`
- Provider: `emable`
- Status: `available`
- Maximum run cost: 0 credits
- Evidence freshness: Role requirements are supplied for the current analysis.
- Execution surfaces: web

## Delivered result

- Produce a basic talent-fit analysis without exporting contact data.

## Steps and maximum charges

- `talent-intelligence`: Talent Intelligence, up to 0 credits

## Limitations

- The trial does not export or enrich contact data.
- The generic capability rail stores only a safe summary and result reference.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "role_title": {
      "type": "string",
      "minLength": 2,
      "maxLength": 160
    },
    "analysis_goal": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    }
  },
  "required": [
    "role_title",
    "analysis_goal"
  ],
  "additionalProperties": false
}
```

# EU Market Snapshot

Compare aggregate adviser-market structure without commissioning a static report.

- Version: `1.0.0`
- Provider: `emable`
- Status: `available`
- Maximum run cost: 0 credits
- Evidence freshness: Country and source refresh dates are returned with aggregate results.
- Execution surfaces: web

## Delivered result

- Answer aggregate questions about European financial-services markets.

## Steps and maximum charges

- `eu-market-data`: EU Market Data, up to 0 credits

## Limitations

- Trial results are aggregate-only.
- Coverage and refresh dates vary by country and source register.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 3,
      "maxLength": 1000,
      "description": "The aggregate market question being answered."
    },
    "countries": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 2
      },
      "minItems": 1,
      "maxItems": 10,
      "description": "ISO-2 codes of the markets the question is about."
    }
  },
  "required": [
    "question",
    "countries"
  ],
  "additionalProperties": false
}
```

# Company Market Brief

Turn one public company URL into a structured market brief.

- Version: `1.0.0`
- Provider: `emable`
- Status: `available`
- Maximum run cost: 0 credits
- Evidence freshness: The public website is retrieved for the submitted run.
- Execution surfaces: rest, cli

## Delivered result

- Analyze a company's public website into a structured market brief.

## Steps and maximum charges

- `company-intelligence`: Company Intelligence, up to 0 credits

## Limitations

- Only publicly reachable HTTP or HTTPS pages can be analyzed.
- The result reflects available website content, not independently verified facts.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "company_url": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048,
      "description": "Absolute public HTTP or HTTPS URL of the company website."
    }
  },
  "required": [
    "company_url"
  ],
  "additionalProperties": false
}
```

# European Market-Entry Pack

Choose and enter a European adviser market with sourced market evidence, a proposition test and approved target recommendations.

- Version: `1.0.0`
- Provider: `emable`
- Status: `validation_required`
- Maximum run cost: 28000 credits
- Evidence freshness: Country and source refresh timestamps are returned in the report.
- Execution surfaces: web, rest, cli, mcp

## Delivered result

- Aggregate comparison of the selected European markets
- Market structure, firm concentration, licence mix and source freshness
- 50-persona Validator test of the submitted proposition
- Ten qualified targets using licensed or public fields only
- Sourced human report, machine JSON and shareable view

## Steps and maximum charges

- `company`: Company and ICP brief, up to 1000 credits
- `markets`: EU market comparison, up to 4000 credits
- `structure`: Selected-market structure, up to 3000 credits
- `validator`: 50-persona proposition test, up to 10000 credits
- `targets`: Ten qualified targets, up to 7000 credits; human approval required
- `report`: Sourced report and JSON, up to 3000 credits

## Limitations

- No guarantee of sales, conversion or market-entry success.
- A target outside the submitted ICP is replaced or that target's credits are released.
- No automatic outreach.
- Named or contact-bearing output requires human approval.

## Input schema

```json
{
  "type": "object",
  "properties": {
    "company_url": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048
    },
    "product_category": {
      "type": "string",
      "minLength": 2,
      "maxLength": 160
    },
    "target_adviser_icp": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    },
    "candidate_markets": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 2
      },
      "minItems": 2,
      "maxItems": 5
    },
    "value_proposition": {
      "type": "string",
      "minLength": 10,
      "maxLength": 3000
    }
  },
  "required": [
    "company_url",
    "product_category",
    "target_adviser_icp",
    "candidate_markets",
    "value_proposition"
  ],
  "additionalProperties": false
}
```


# Agent skill


---
name: build-with-emable
description: Discover, quote, and safely run governed Emable financial capabilities and use cases through REST or MCP. Use when building an AI agent or application that needs sourced European financial intelligence, explicit permissions, predictable credit cost, citations, or auditable run records.
---

# Build with Emable

1. Read `https://api.emable.ai/v1/capabilities` and `/v1/use-cases` before choosing a tool.
2. Inspect the selected detail contract, version, permissions, evidence freshness, limitations, and supported surface.
3. Quote a use case before execution. Never infer price from an old prompt or cached catalogue.
4. Authenticate with the least-privilege API key or MCP OAuth scopes needed for the call.
5. Send a fresh idempotency key for a new run and reuse it only for an exact retry.
6. Treat `awaiting_approval` as a pause. Do not bypass approval or start outreach.
7. Return citations and source freshness with the result. Keep unavailable metrics unavailable.
8. On `402`, stop and ask the account owner to top up. On `409 commercial_validation_required`, do not retry.
9. Poll the shared run record until `succeeded`, `failed`, or `refused`, then report actual completed-step charges.
10. Never copy raw customer inputs or results into public analytics, logs, or prompts.
