Quickstart
Create a key and make your first request in a few minutes.
1. Create an API key
- Create a free account with your email address and enter the code we send you.
- Choose Set up Free plan, then Create API key.
- Copy the key when it is shown. It is displayed once and cannot be recovered; if you lose it, revoke it and create another.
A new key can take a few minutes to be enabled; until then, requests with it are refused.
2. Make a request
The API is served at https://api.morphiqlabs.com over HTTPS only. Send the key in the Authorization header; keys are never accepted in the URL.
export FERRO_API_KEY='<your key>'
curl --fail-with-body 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}'Every response has a result (or results for a batch) and a metadata object with the request_id, the engine and model versions and the FCU charged for the request. Quote the request_id when you contact support.
3. Every operation
Each operation has a single form and an ordered :batch form that returns one outcome per contract, in order. European and American options are supported; pricing_model: "auto" picks the model for the exercise style. Field definitions are in the API reference; FCU weights per contract are on the usage page.
Price an option POST /v1/price
curl --fail-with-body 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}'Price a batch POST /v1/price:batch
curl --fail-with-body 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},{"exercise_style":"american","pricing_model":"auto","option_type":"put","spot":100,"strike":105,"time_to_expiry_years":0.5,"risk_free_rate":0.05,"dividend_yield":0.01,"volatility":0.25}]}'Solve implied volatility POST /v1/implied-volatility
curl --fail-with-body 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}'Solve implied volatility for a batch POST /v1/implied-volatility:batch
curl --fail-with-body 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},{"exercise_style":"american","pricing_model":"auto","option_type":"put","spot":100,"strike":105,"time_to_expiry_years":0.5,"risk_free_rate":0.05,"dividend_yield":0.01,"market_price":9.5}]}'Compute all ten Greeks POST /v1/greeks
curl --fail-with-body 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}'Compute Greeks for a batch POST /v1/greeks:batch
curl --fail-with-body 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},{"exercise_style":"american","pricing_model":"auto","option_type":"put","spot":100,"strike":105,"time_to_expiry_years":0.5,"risk_free_rate":0.05,"dividend_yield":0.01,"volatility":0.25}]}'Price, Greeks and implied volatility in one call POST /v1/analytics
curl --fail-with-body 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}'Fused analytics for a batch POST /v1/analytics:batch
curl --fail-with-body 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},{"exercise_style":"american","pricing_model":"auto","option_type":"put","spot":100,"strike":105,"time_to_expiry_years":0.5,"risk_free_rate":0.05,"dividend_yield":0.01,"volatility":0.25}]}'4. Free plan limits
| Monthly allowance | 1,000,000 FCU per UTC calendar month, no rollover; requests stop at the allowance |
|---|---|
| Capacity | Best effort: requests may be refused with 503 under load |
| Sustained rate | 5 requests per second (bursts up to 10) |
| Concurrent requests | 1 |
| Contracts per batch | 100 |
| Request size | 8 KiB single, 1 MiB batch |
| Active API keys | 1 |
Your account page shows your plan and limits.
5. Errors
Errors return a JSON body with a machine-readable error.code, a message and, where it applies, the field. Requests that fail before computation are not charged.
| Status | Meaning |
|---|---|
401 | The key is missing, revoked or not recognized. Check the Authorization header. |
402 | The monthly FCU allowance is spent. It resets at the start of the next UTC month. |
403 | Your plan does not include this operation. |
413 | The request body or batch is larger than your plan allows. |
422 | The inputs are invalid or cannot be priced; the error names the field. |
429 | Rate or concurrency limit reached. Retry after a short, randomized delay. |
503 | Capacity is temporarily unavailable. Retry with exponential backoff. |
6. Keep your key safe
- Call the API from your server or scripts. Never put a key in browser code, a mobile app or a public repository.
- Load the key from an environment variable or a secret manager, not from source code, and keep it out of logs.
- To rotate a key on the Free plan, revoke the old key in your account, then create a new one.
- If a key may have leaked, revoke it at once from your account and tell us at support@morphiqlabs.com.
7. Support
Email support@morphiqlabs.com from your account email, with the request_id of any request in question. Use of the API is subject to the terms of service and the market-data policy.