Know the cost before execution.
Read your active schedule, quote a specific request, and choose the maximum CU charge you will accept.
All cost utilities require your API key and use its account-specific policy. They charge zero CUs and run no numerical calculation. Set FERRO_API_KEY using the key setup instructions. These examples use synthetic option inputs. Responses illustrate an example account schedule; your rates, policy revision, request IDs and service version may differ. Optional policy and budget metadata is omitted for readability.
Discover your rates
curl --fail-with-body 'https://api.morphiqlabs.com/v1/cost/schedule' \
--header "Authorization: Bearer $FERRO_API_KEY"The schedule includes its ID, version, effective dates, policy revision, per-unit rates, fixed request fee, minimum charge and charging rule. Rates use explicit billing units: an option contract or a regime window. Internal policy provenance is omitted.
curl --fail-with-body --get 'https://api.morphiqlabs.com/v1/cost/schedule' \
--header "Authorization: Bearer $FERRO_API_KEY" \
--data-urlencode 'operation=price' \
--data-urlencode 'model=black_scholes_merton/1'Filters combine with AND. Use price, implied_volatility, greeks, analytics or regime. Batch operations use the same rate rows. A valid filter with no matches returns an empty rates list; an invalid operation or model identifier is rejected. A schedule row alone does not establish that your account can execute that model.
Filtered schedule response
{
"schedule": {
"effective_from": "2026-10-19T00:00:00Z",
"effective_until": null,
"failure_charging": "commit_at_execution_start",
"fixed_request_fcu": 0,
"minimum_charge_fcu": 0,
"policy_revision": "5f33de9e901762390e72bb9820f01e64b704e43155973871672973878405f0f5",
"rates": [
{
"billing_unit": "contract",
"fcu_per_unit": 1,
"max_discrete_dividends": 0,
"model": "black_scholes_merton/1",
"operation": "price"
}
],
"record_version": 2,
"rounding": "none",
"schedule_id": "fcu-student-v1",
"schedule_version": "2026-10-19-r2"
},
"metadata": {
"api_version": "v1",
"fcu_charged": 0,
"fcu_schedule_id": "fcu-student-v1",
"fcu_schedule_version": "2026-10-19-r2",
"request_id": "example-schedule",
"service_version": "0.4.1"
}
}Without filters, the response has the same shape with every schedule row in schedule.rates. schedule_version identifies the customer-facing rate schedule; record_version is the immutable policy record’s version. policy_revision identifies the resolved policy. A null effective_until means the schedule record has no fixed end date; it does not promise a price lock.
Quote the actual request
curl --fail-with-body 'https://api.morphiqlabs.com/v1/cost/quote' \
--header "Authorization: Bearer $FERRO_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"operation":"price","request":{"exercise_style":"european","pricing_model":"auto","option_type":"call","spot":100,"strike":100,"time_to_expiry_years":1,"risk_free_rate":0.05,"dividend_yield":0,"volatility":0.2}}'Send an operation and the same JSON body you would submit for execution. Supported operations are price, implied_volatility, greeks, analytics, their _batch variants, and regime. Batch bodies retain their requests array.
quote.total_fcu is the exact amount that would be committed under the quoted policy and resolved workload. Fixed fees and minimums apply once to the whole request. The breakdown identifies schedule rate classes; resolved_models identifies the selected numerical algorithms, including the resolution of auto. These can differ where algorithms share a billing class.
The response’s metadata.fcu_charged is zero: it describes the quote call itself. Its policy revision and schedule identity identify the quoted rates. Quotes reserve no funds or capacity and do not lock a price. They do not guarantee future funding, availability, numerical convergence or execution success. Invalid, unsupported and unavailable work returns an error rather than a zero-price quote.
{
"quote": {
"fixed_fcu": 0,
"lines": [
{
"billing_unit": "contract",
"fcu_per_unit": 1,
"model": "black_scholes_merton/1",
"operation": "price",
"quantity": 1,
"variable_fcu": 1
}
],
"minimum_charge_fcu": 0,
"total_fcu": 1,
"variable_fcu": 1
},
"resolved_models": [
{
"model": "black_scholes_merton/1",
"quantity": 1
}
],
"metadata": {
"api_version": "v1",
"fcu_charged": 0,
"fcu_schedule_id": "fcu-student-v1",
"fcu_schedule_version": "2026-10-19-r2",
"request_id": "example-quote",
"service_version": "0.4.1"
}
}Here, execution would cost one CU, while obtaining the quote charged zero CUs. The utility reports its prospective charge in quote.total_fcu; the execution response reports its own quote in metadata.fcu_quoted. Neither is a charge receipt: the committed amount is metadata.fcu_charged.
Quote a batch
This complete request quotes two identical synthetic European contracts. Use price_batch as the quote operation and retain the execution body’s requests array.
curl --fail-with-body 'https://api.morphiqlabs.com/v1/cost/quote' \
--header "Authorization: Bearer $FERRO_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"operation": "price_batch",
"request": {
"requests": [
{
"dividend_yield": 0,
"exercise_style": "european",
"option_type": "call",
"pricing_model": "auto",
"risk_free_rate": 0.05,
"spot": 100,
"strike": 100,
"time_to_expiry_years": 1,
"volatility": 0.2
},
{
"dividend_yield": 0,
"exercise_style": "european",
"option_type": "call",
"pricing_model": "auto",
"risk_free_rate": 0.05,
"spot": 100,
"strike": 100,
"time_to_expiry_years": 1,
"volatility": 0.2
}
]
}
}'{
"quote": {
"fixed_fcu": 0,
"lines": [
{
"billing_unit": "contract",
"fcu_per_unit": 1,
"model": "black_scholes_merton/1",
"operation": "price",
"quantity": 2,
"variable_fcu": 2
}
],
"minimum_charge_fcu": 0,
"total_fcu": 2,
"variable_fcu": 2
},
"resolved_models": [
{
"model": "black_scholes_merton/1",
"quantity": 2
}
],
"metadata": {
"api_version": "v1",
"fcu_charged": 0,
"fcu_schedule_id": "fcu-student-v1",
"fcu_schedule_version": "2026-10-19-r2",
"request_id": "example-batch_quote",
"service_version": "0.4.1"
}
}The two contracts share one rate class, so lines contains one row with quantity: 2. A mixed-model batch may contain multiple rows. variable_fcu sums the line charges; fixed_fcu applies once, and minimum_charge_fcu is a floor on the request total, not another fee to add. Use the returned total_fcu as authoritative.
To execute this batch, send its inner request body to /v1/price:batch with X-MorphIQ-Max-CU: 2 if two CUs is your chosen ceiling. Each separately submitted chunk needs its own quote and ceiling; the header does not cap a workflow or session.
Set an execution ceiling
curl --fail-with-body 'https://api.morphiqlabs.com/v1/price' \
--header "Authorization: Bearer $FERRO_API_KEY" \
--header 'Content-Type: application/json' \
--header 'X-MorphIQ-Max-CU: 1' \
--data '{"exercise_style":"european","pricing_model":"auto","option_type":"call","spot":100,"strike":100,"time_to_expiry_years":1,"risk_free_rate":0.05,"dividend_yield":0,"volatility":0.2}'This example accepts a maximum of one CU for the entire execution request. Choose your own ceiling, or use the returned quote.total_fcu for the same request. X-MorphIQ-Max-CU accepts one unsigned 64-bit integer, including zero. A larger actual quote returns 409 cost_limit_exceeded before commitment, with zero CUs charged. Equality is accepted.
The ceiling applies to HTTP JSON, HTTP Protobuf and gRPC metadata (x-morphiq-max-cu). It does not change payload schemas or reserve the earlier quoted policy. If execution commits, its full commercial charge remains owed on a later timeout or model failure. Do not blindly retry an execution timeout.
When the quote exceeds your ceiling
Submitting the two-contract batch above with a one-CU ceiling produces the following refusal under the example schedule. This is an execution request; choose your ceiling deliberately when running it against your own account.
cURL · batch with a one-CU ceiling
curl --fail-with-body 'https://api.morphiqlabs.com/v1/price:batch' \
--header "Authorization: Bearer $FERRO_API_KEY" \
--header 'Content-Type: application/json' \
--header 'X-MorphIQ-Max-CU: 1' \
--data '{
"requests": [
{
"dividend_yield": 0,
"exercise_style": "european",
"option_type": "call",
"pricing_model": "auto",
"risk_free_rate": 0.05,
"spot": 100,
"strike": 100,
"time_to_expiry_years": 1,
"volatility": 0.2
},
{
"dividend_yield": 0,
"exercise_style": "european",
"option_type": "call",
"pricing_model": "auto",
"risk_free_rate": 0.05,
"spot": 100,
"strike": 100,
"time_to_expiry_years": 1,
"volatility": 0.2
}
]
}'{
"error": {
"code": "cost_limit_exceeded",
"message": "the quoted CU charge exceeds x-morphiq-max-cu"
},
"metadata": {
"api_version": "v1",
"compute_schedule_version": "2026-09-11",
"engine_version": "0.39.1",
"engines": [
{
"name": "morphiq-risk",
"revision": "b4c29d492ff96dddf9b25f745d2be4d253202164",
"version": "0.39.1"
}
],
"fcu_charged": 0,
"fcu_quoted": 2,
"fcu_schedule_id": "fcu-student-v1",
"fcu_schedule_version": "2026-10-19-r2",
"request_id": "example-ceiling_error",
"units_charged": 0
}
}fcu_quoted: 2 records the execution quote; fcu_charged: 0 confirms that nothing was committed. units_charged is internal execution accounting, not commercial CUs. Engine identity identifies the selected adapter and does not assert that calculation ran. Review the current quote and your intended budget before increasing the ceiling. A malformed or duplicate ceiling returns 422; other admission refusals can occur before the ceiling check.
Limits and failures
Utilities share a separate per-account rate bucket, using your pinned plan’s sustained request rate and burst allowance. They do not consume execution rate tokens. Account concurrency and service ingress limits still apply. Quoted bodies must meet the target operation’s byte and batch limits; the quote envelope allows at most 8 KiB of overhead. Utility responses are private and not cacheable.
Expect 401/403 for authentication or entitlement refusals, 400/422 for malformed or invalid inputs, 413 for oversized bodies, 429 for rate or concurrency exhaustion, and 503/504 for availability or deadline failures. The utility endpoints are JSON-only. See the reference for all response schemas.
Python users can use client.cost_schedule(), client.quote(request), and client.price(request, max_cu=quote.quote.total_fcu) with a compatible SDK release. The same methods are available on AsyncMorphIQ; see the Python guide.