Ferro API reference

From your first request to every response field.

Explore the pricing and service endpoints defined in the current API contract.

HTTP + JSON / ProtobufContract v1.0.012 endpoints
New here?

The quickstart covers creating an API key, a runnable example for every operation, plan limits and errors. Examples send your key from $FERRO_API_KEY to https://api.morphiqlabs.com.

post

/v1/analytics

#

Numerical result

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/analytics' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --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,
  "market_price": 10.45
}'

Request body required

FusedAnalyticsRequest encoded as JSON or morphiq.ferro_risk.v1.FusedAnalyticsRequest

application/json

application/protobuf

A request for price and Greeks, optionally at a volatility solved from an observed premium first. With `market_price`, volatility is solved and the Greeks are evaluated at the solved value — one admission, one solve, and the solved point passed inward as verified evidence rather than re-derived. Without it, the supplied `volatility` is used and the result is the all-ten-Greeks operation under another name.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional

Served only together with `market_price` (#330).

maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
market_pricenumber | null · doubleoptional

The observed premium to invert before evaluating the Greeks.

model_versionstring | nulloptional
option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired
volatilitynumber · doublerequired

Used only when `market_price` is absent.

Responses

200 Numerical result

application/json

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid pricing request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Capacity exhausted, funding, policy or admission temporarily unavailable, or service draining

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/analytics:batch

#

Ordered batch results

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/analytics:batch' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "requests": [
    {
      "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,
      "market_price": 10.45
    }
  ]
}'

Request body required

BatchFusedAnalyticsRequest encoded as JSON or morphiq.ferro_risk.v1.BatchFusedAnalyticsRequest

application/protobuf

Ordered request envelope; runtime applies the pinned plan limit.

Additional fields are not accepted.

requestsarray of FusedAnalyticsRequestrequired
minItems: 1maxItems: 1024
Array item schema

Responses

200 Ordered batch results

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid batch request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Ingress or weighted compute capacity exhausted, or funding, policy or admission temporarily unavailable

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/greeks

#

Numerical result

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/greeks' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --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
}'

Request body required

GreeksAllTenRequest encoded as JSON or morphiq.ferro_risk.v1.GreeksAllTenRequest

application/json

application/protobuf

A request for the price and all ten Greeks at a supplied volatility. The same shape as `PriceRequest`: the Greeks are derivatives of the price, so they are a property of the same contract and the same coordinates.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional

Accepted by the wire contract, refused by this operation until the engine exposes schedule-aware Greeks without a premium (#330). A schedule is served on `FusedAnalytics` with `market_price`.

maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
model_versionstring | nulloptional
option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired
volatilitynumber · doublerequired

Responses

200 Numerical result

application/json

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid pricing request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Capacity exhausted, funding, policy or admission temporarily unavailable, or service draining

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/greeks:batch

#

Ordered batch results

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/greeks:batch' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "requests": [
    {
      "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
    }
  ]
}'

Request body required

BatchGreeksAllTenRequest encoded as JSON or morphiq.ferro_risk.v1.BatchGreeksAllTenRequest

application/json

application/protobuf

Ordered request envelope; runtime applies the pinned plan limit.

Additional fields are not accepted.

requestsarray of GreeksAllTenRequestrequired
minItems: 1maxItems: 1024
Array item schema

Responses

200 Ordered batch results

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid batch request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Ingress or weighted compute capacity exhausted, or funding, policy or admission temporarily unavailable

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/implied-volatility

#

Numerical result

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/implied-volatility' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --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,
  "market_price": 10.45
}'

Request body required

ImpliedVolatilityRequest encoded as JSON or morphiq.ferro_risk.v1.ImpliedVolatilityRequest

application/json

application/protobuf

A request to invert an observed premium into a volatility. Carries `market_price` and no `volatility`: volatility is the unknown being solved for, so a request that supplied one would be asking the service to ignore it.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional
maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
market_pricenumber · doublerequired

The observed premium to invert.

model_versionstring | nulloptional
option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired

Responses

200 Numerical result

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid pricing request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Capacity exhausted, funding, policy or admission temporarily unavailable, or service draining

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/implied-volatility:batch

#

Ordered batch results

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/implied-volatility:batch' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "requests": [
    {
      "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,
      "market_price": 10.45
    }
  ]
}'

Request body required

BatchImpliedVolatilityRequest encoded as JSON or morphiq.ferro_risk.v1.BatchImpliedVolatilityRequest

application/protobuf

Ordered request envelope; runtime applies the pinned plan limit.

Additional fields are not accepted.

requestsarray of ImpliedVolatilityRequestrequired
minItems: 1maxItems: 1024
Array item schema

Responses

200 Ordered batch results

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid batch request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Ingress or weighted compute capacity exhausted, or funding, policy or admission temporarily unavailable

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/price

#

Price calculated

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/price' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --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
}'

Request body required

PriceRequest encoded as JSON or morphiq.ferro_risk.v1.PriceRequest

application/json

application/protobuf

A single option-pricing request. All numeric fields are required.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional

Discrete cash dividends within the option's life. American Bjerksund-Stensland 2002 only; omit for continuous `dividend_yield` alone.

maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
model_versionstring | nulloptional

Optional algorithm-version pin. Omit to use the current version.

option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired
volatilitynumber · doublerequired

Responses

200 Price calculated

application/json

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid pricing request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Capacity exhausted, funding, policy or admission temporarily unavailable, or service draining

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
post

/v1/price:batch

#

Ordered batch results

cURL
curl --fail-with-body --request POST 'https://api.morphiqlabs.com/v1/price:batch' \
  --header "Authorization: Bearer $FERRO_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "requests": [
    {
      "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
    }
  ]
}'

Request body required

BatchPriceRequest encoded as JSON or morphiq.ferro_risk.v1.BatchPriceRequest

application/json

application/protobuf

An ordered batch of option-pricing requests.

Additional fields are not accepted.

requestsarray of PriceRequestrequired
minItems: 1maxItems: 1024
Array item schema

Responses

200 Ordered batch results

application/json

application/protobuf

Response headers
x-request-id string
Unique service-generated request identifier
400 Malformed request

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
401 Credential missing or not verifiable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
402 The account's funding is spent until a top-up or the next budget period

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
403 The account is not permitted, or its plan does not include this operation

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
406 Response media type is not acceptable

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
408 Request body deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
409 The reservation expired before execution began

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
413 Request too large

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
415 Unsupported media type

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
422 Invalid batch request, or work that cannot be priced under the account's limits

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
429 Request rate or concurrent request allowance exhausted

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
500 Pricing failure

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
503 Ingress or weighted compute capacity exhausted, or funding, policy or admission temporarily unavailable

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
504 Compute deadline exceeded

application/problem+json

Response headers
x-request-id string
Unique service-generated request identifier
get

/health

#

Compatibility readiness check

cURL
curl --fail-with-body --request GET 'https://api.morphiqlabs.com/health'

Responses

200 Compatibility readiness check

application/json

Response headers
x-request-id string
Unique service-generated request identifier
503 Service is draining or no valid policy is available

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier
get

/live

#

Process is alive

cURL
curl --fail-with-body --request GET 'https://api.morphiqlabs.com/live'

Responses

200 Process is alive

application/json

Response headers
x-request-id string
Unique service-generated request identifier
get

/openapi.json

#

OpenAPI 3.1 service contract

cURL
curl --fail-with-body --request GET 'https://api.morphiqlabs.com/openapi.json'

Responses

200 OpenAPI 3.1 service contract

application/json

any JSON value

Response headers
x-request-id string
Unique service-generated request identifier
get

/ready

#

Service accepts protected work under a valid policy

cURL
curl --fail-with-body --request GET 'https://api.morphiqlabs.com/ready'

Responses

200 Service accepts protected work under a valid policy

application/json

Response headers
x-request-id string
Unique service-generated request identifier
503 Service is draining or no valid policy is available

application/problem+json

Response headers
Retry-After string
Minimum retry delay in seconds
x-request-id string
Unique service-generated request identifier

Data schemas

Field types, required values and constraints from the OpenAPI contract.

BatchFusedAnalyticsItemResult #

Ordered result with an explicit per-item failure alternative.

all of

Must satisfy every schema below:

Part 1
Part 2
indexinteger · int32required
minimum: 0

BatchFusedAnalyticsOutcome #

one of

Must satisfy exactly one schema below:

Variant 1
resultFusedAnalyticsResultrequired
statusstringrequired

Allowed values: "success"

Variant 2
errorErrorBodyrequired
statusstringrequired

Allowed values: "error"

BatchFusedAnalyticsRequest #

Ordered request envelope; runtime applies the pinned plan limit.

Additional fields are not accepted.

requestsarray of FusedAnalyticsRequestrequired
minItems: 1maxItems: 1024
Array item schema

BatchFusedAnalyticsResponse #

One metadata block for the entire admitted batch.

metadataResponseMetadatarequired
resultsarray of BatchFusedAnalyticsItemResultrequired

BatchGreeksAllTenItemResult #

Ordered result with an explicit per-item failure alternative.

all of

Must satisfy every schema below:

Part 1
Part 2
indexinteger · int32required
minimum: 0

BatchGreeksAllTenOutcome #

one of

Must satisfy exactly one schema below:

Variant 1
resultGreeksAllTenResultrequired
statusstringrequired

Allowed values: "success"

Variant 2
errorErrorBodyrequired
statusstringrequired

Allowed values: "error"

BatchGreeksAllTenRequest #

Ordered request envelope; runtime applies the pinned plan limit.

Additional fields are not accepted.

requestsarray of GreeksAllTenRequestrequired
minItems: 1maxItems: 1024
Array item schema

BatchGreeksAllTenResponse #

One metadata block for the entire admitted batch.

metadataResponseMetadatarequired
resultsarray of BatchGreeksAllTenItemResultrequired

BatchImpliedVolatilityItemResult #

Ordered result with an explicit per-item failure alternative.

all of

Must satisfy every schema below:

Part 1
Part 2
indexinteger · int32required
minimum: 0

BatchImpliedVolatilityOutcome #

one of

Must satisfy exactly one schema below:

Variant 1
statusstringrequired

Allowed values: "success"

Variant 2
errorErrorBodyrequired
statusstringrequired

Allowed values: "error"

BatchImpliedVolatilityRequest #

Ordered request envelope; runtime applies the pinned plan limit.

Additional fields are not accepted.

requestsarray of ImpliedVolatilityRequestrequired
minItems: 1maxItems: 1024
Array item schema

BatchImpliedVolatilityResponse #

One metadata block for the entire admitted batch.

metadataResponseMetadatarequired

BatchItemResult #

Ordered result for one batch element.

all of

Must satisfy every schema below:

Part 1
Part 2
indexinteger · int32required
minimum: 0

BatchOutcome #

Per-item batch outcome. Structural request failures remain request-level errors.

one of

Must satisfy exactly one schema below:

Variant 1
resultPriceResultrequired
statusstringrequired

Allowed values: "success"

Variant 2
errorErrorBodyrequired
statusstringrequired

Allowed values: "error"

BatchPriceRequest #

An ordered batch of option-pricing requests.

Additional fields are not accepted.

requestsarray of PriceRequestrequired
minItems: 1maxItems: 1024
Array item schema

BatchPriceResponse #

Successful response for a batch, including any per-item pricing failures.

metadataResponseMetadatarequired
resultsarray of BatchItemResultrequired
Array item schema

DividendEvent #

One discrete cash dividend. Time is a year fraction on the same basis as `time_to_expiry_years`, not a calendar date. The contract carries no calendar, day-count convention or timezone, and introducing one here to express a dividend date would add a basis the rest of the contract does not have and cannot validate. The engine's own `DividendEvent` is `ex_time_years` for the same reason.

Additional fields are not accepted.

cash_amountnumber · doublerequired

Cash amount per share, in the same currency as spot and strike.

ex_time_yearsnumber · doublerequired

Ex-dividend time as a year fraction from valuation.

ErrorBody #

Stable, machine-readable error details.

codestringrequired
fieldstring | nulloptional
messagestringrequired

ErrorEnvelope #

Top-level HTTP error envelope.

errorErrorBodyrequired
metadataResponseMetadatarequired

ExerciseStyle #

Contract exercise convention, independent of the pricing algorithm.

string

Allowed values: "european" "american"

FusedAnalyticsRequest #

A request for price and Greeks, optionally at a volatility solved from an observed premium first. With `market_price`, volatility is solved and the Greeks are evaluated at the solved value — one admission, one solve, and the solved point passed inward as verified evidence rather than re-derived. Without it, the supplied `volatility` is used and the result is the all-ten-Greeks operation under another name.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional

Served only together with `market_price` (#330).

maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
market_pricenumber | null · doubleoptional

The observed premium to invert before evaluating the Greeks.

model_versionstring | nulloptional
option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired
volatilitynumber · doublerequired

Used only when `market_price` is absent.

FusedAnalyticsResponse #

Successful response for one fused-analytics operation.

metadataResponseMetadatarequired
resultFusedAnalyticsResultrequired

FusedAnalyticsResult #

Price, Greeks and — when a premium was supplied — the solve that produced the volatility they were evaluated at.

greeksGreeksAllTenrequired
implied_volatilityone ofoptional

Must satisfy exactly one schema below:

Variant 1

null

Variant 2

Present only when the request supplied `market_price`.

ImpliedVolatilityResult

model_versionstringrequired
pricenumber · doublerequired
pricing_modelResolvedPricingModelrequired

GreeksAllTen #

The ten Greeks, on the contract's stated bases. Time derivatives are **per year**. The engine reports them per calendar day, which embeds a 365-day calendar; the contract carries no calendar, so the service scales by the engine's own day count at this boundary and the caller applies whichever convention it holds. Vega is raw `dV/dσ` per unit volatility, not per point. Nothing else is rescaled.

charmnumber · doublerequired

`d²V/(dS dt)`, **per year**.

colornumber · doublerequired

`d³V/(dS² dt)`, **per year**.

deltanumber · doublerequired

`dV/dS`.

gammanumber · doublerequired

`d²V/dS²`.

rhonumber · doublerequired

`dV/dr`, per unit rate.

thetanumber · doublerequired

`dV/dt`, **per year**.

vannanumber · doublerequired

`d²V/(dS dσ)`, per unit volatility.

veganumber · doublerequired

`dV/dσ`, per unit volatility.

vetanumber · doublerequired

`d²V/(dσ dt)`, **per year** per unit volatility.

volganumber · doublerequired

`d²V/dσ²`, per unit volatility squared.

GreeksAllTenRequest #

A request for the price and all ten Greeks at a supplied volatility. The same shape as `PriceRequest`: the Greeks are derivatives of the price, so they are a property of the same contract and the same coordinates.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional

Accepted by the wire contract, refused by this operation until the engine exposes schedule-aware Greeks without a premium (#330). A schedule is served on `FusedAnalytics` with `market_price`.

maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
model_versionstring | nulloptional
option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired
volatilitynumber · doublerequired

GreeksAllTenResponse #

Successful response for one all-ten-Greeks operation.

metadataResponseMetadatarequired
resultGreeksAllTenResultrequired

GreeksAllTenResult #

The price and Greeks of one contract at the volatility supplied.

greeksGreeksAllTenrequired
model_versionstringrequired
pricenumber · doublerequired
pricing_modelResolvedPricingModelrequired

ImpliedVolatilityRequest #

A request to invert an observed premium into a volatility. Carries `market_price` and no `volatility`: volatility is the unknown being solved for, so a request that supplied one would be asking the service to ignore it.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional
maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
market_pricenumber · doublerequired

The observed premium to invert.

model_versionstring | nulloptional
option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired

ImpliedVolatilityResponse #

Successful response for one implied-volatility operation.

metadataResponseMetadatarequired

ImpliedVolatilityResult #

A solved implied volatility and the diagnostics that qualify it.

implied_volatilitynumber · doublerequired

Decimal fraction, on the same basis as `PriceRequest.volatility`.

iterationsinteger · int32required
minimum: 0
model_versionstringrequired
pricing_modelResolvedPricingModelrequired
residualnumber · doublerequired
residual_basisResidualBasisrequired
used_fallbackbooleanrequired

Whether the solve left its primary path. Not a quality signal on its own: an American solve inverts by bisection and reports `true` for every live solve, while a Bachelier solve reports `false` because bisection is its canonical solver rather than a degraded fallback.

OptionType #

Option payoff direction.

string

Allowed values: "call" "put"

PolicyResponseMetadata #

Pinned policy identity and contributing record versions nested in response metadata.

planstringrequired

Versioned plan reference, formatted as id@version.

recordsarray of stringrequired

Contributing versioned records in resolution precedence order.

Array item schema

string

revisionstringrequired

Full opaque revision, encoded as 64 lowercase hexadecimal digits.

snapshot_idstringrequired

PriceRequest #

A single option-pricing request. All numeric fields are required.

Additional fields are not accepted.

dividend_schedulearray of DividendEventoptional

Discrete cash dividends within the option's life. American Bjerksund-Stensland 2002 only; omit for continuous `dividend_yield` alone.

maxItems: 16
Array item schema
dividend_yieldnumber · doublerequired
exercise_styleExerciseStylerequired
model_versionstring | nulloptional

Optional algorithm-version pin. Omit to use the current version.

option_typeOptionTyperequired
pricing_modelPricingModelrequired
risk_free_ratenumber · doublerequired
spotnumber · doublerequired
strikenumber · doublerequired
time_to_expiry_yearsnumber · doublerequired
volatilitynumber · doublerequired

PriceResponse #

Successful response for one pricing operation.

metadataResponseMetadatarequired
resultPriceResultrequired

PriceResult #

The transport-neutral result of one pricing operation.

exercise_styleExerciseStylerequired
model_versionstringrequired

Stable revision of the selected pricing algorithm.

option_typeOptionTyperequired
pricenumber · doublerequired
pricing_modelResolvedPricingModelrequired

PricingModel #

Pricing algorithm selection. `Auto` resolves from the exercise style.

string

Allowed values: "auto" "black_scholes_merton" "bjerksund_stensland_2002" "bjerksund_stensland_1993"

ProtobufBody #

string · binary

ResidualBasis #

The basis a solved residual is expressed in. The residual is not one quantity. European and Black paths report a forward-normalised price residual comparable against the engine's convergence threshold; Bachelier and American Bjerksund-Stensland report a raw option-price residual. Publishing the number without its basis would invite exactly the cross-model comparison it does not support, so the basis travels with it and a client that ignores this field cannot silently get it wrong.

string

Allowed values: "forward_normalised_price" "option_price"

ResolvedPricingModel #

Pricing algorithm selected after resolving an input request. Unlike [`PricingModel`], this output-only type cannot represent `auto`.

string

ResponseMetadata #

Metadata shared by every successful response and API error.

api_versionstringrequired
budget_periodstring | nulloptional
budget_reset_atstring | nulloptional

UTC end of the budget period from the pinned account snapshot, when known.

compute_schedule_versionstringrequired
engine_versionstringrequired

Version of the FerroRisk service and linked pricing engine.

fcu_chargedinteger | null · int64optional

Committed commercial charge, including on post-commit failures. Absent in open development mode; zero for protected pre-commit refusals.

minimum: 0
fcu_quotedinteger | null · int64optional

Commercial quote; absent until reservation succeeds.

minimum: 0
fcu_schedule_idstring | nulloptional
fcu_schedule_versionstring | nulloptional
policyone ofoptional

Must satisfy exactly one schema below:

Variant 1

null

Variant 2
remaining_fcu_instance_estimateinteger | null · int64optional

Instance estimate, never an authoritative account balance or authorization input.

minimum: 0
request_idstringrequired
units_chargedinteger · int64required
minimum: 0

StatusResponse #

Liveness/readiness representation.

servicestringrequired
statusstringrequired
versionstringrequired