Endpoints
Every endpoint the API answers, from its specification. Every answer is JSON and carries api_version, a notice (data and methodology, not advice) and checks (what it counted against your plan); a sandbox answer also carries sandbox.
GET /v1/healthno key
Is the engine running?. Heartbeat, last scan and stocks covered. No key needed.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/health"
GET /v1/universekey: Authorization: Bearer
Stocks covered. Every stock the engine follows, with its Shariah status and when it was last checked.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/universe"
GET /v1/screen/{symbol}key: Authorization: Bearer
Shariah screen for one stock. The verdict with its evidence: business activity, debt and cash against the 24-month average market value, interest income against revenue, the limits used and the method. A key carrying the client's own Shariah limits gets the verdict decided by those limits.
| Parameter | In | Required | Type | Example |
symbol | path | yes | string | AAPL |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/screen/AAPL"
GET /v1/screenkey: Authorization: Bearer
Shariah screen for many stocks. Up to 50 symbols a call, in one answer.
| Parameter | In | Required | Type | Example |
symbols | query | yes | string | AAPL,MSFT,NVDA |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/screen?symbols=AAPL,MSFT,NVDA"
GET /v1/purification/{symbol}key: Authorization: Bearer
Purification. The share of each dividend to give away (the company's interest income as a share of its revenue). Add dividend= to get the amount.
| Parameter | In | Required | Type | Example |
symbol | path | yes | string | AAPL |
dividend | query | no | number | 120 |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/purification/AAPL?dividend=120"
GET /v1/zakatkey: Authorization: Bearer
Zakat on a portfolio. Zakat at 2.5% two common ways: every share at market value (market_value), and each share at its company's own zakatable assets -- cash, short-term investments, receivables and inventory per share from its latest balance sheet, against its price (company_assets; AAOIFI Shariah Standard 35), a quarter of the value where a company's figures are missing (named in proxied). The live nisab (85 g gold, 595 g silver) in the currency asked for. Each holding's Shariah status and zakatable share come back too. quarter_rule (the older flat 25%) is kept for version 1.3's clients.
| Parameter | In | Required | Type | Example |
holdings | query | no | string | AAPL:5000,MSFT:2500 |
cash | query | no | number | 1000 |
currency | query | no | string | GBP |
standard | query | no | string | silver |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/zakat?holdings=AAPL:5000,MSFT:2500&cash=1000"
GET /v1/marketkey: Authorization: Bearer
Market reading. Index trends against their 200-day averages, and the VIX fear gauge.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/market"
GET /v1/signalskey: Authorization: Bearer
Entry signals. Stocks that passed every gate at the last scan, best score first.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/signals"
GET /v1/model/corekey: Authorization: Bearer
Long-term model portfolio. The holdings MARBIN's rules pick today, with the rules.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/model/core"
GET /v1/filings/{symbol}key: Authorization: Bearer
Company filings red flags. US companies: SEC 8-K red flags (bankruptcy, triggering events, delisting, restated results) and insider buying and selling over 90 days, sales after exercising options counted apart. The engine checks its watchlist twice a day; covered=false for a company with no SEC filings. Shown, not acted on.
| Parameter | In | Required | Type | Example |
symbol | path | yes | string | AAPL |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/filings/AAPL"
GET /v1/track-recordkey: Authorization: Bearer
How MARBIN's forecasts have done. From the forecast ledger: each kind of forecast (the return model, the MARBIN score, analysts' price targets, the risk score) at each horizon, checked against what happened -- rank correlation with the outcome (mean_ic), top-minus-bottom fifth (spread_pct), analysts' hit rates. Past results are no guide to the future.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/track-record"
GET /v1/historykey: Authorization: Bearer
What the history holds. The dates covered, the stocks, the exchange-rate pairs and every field a stock's daily reading has.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/history"
GET /v1/history/fieldskey: Authorization: Bearer
What every history field means. Each field a stock's daily reading can carry, with its unit, and the fields sent when fields= isn't given.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/history/fields"
GET /v1/history/{symbol}key: Authorization: Bearer
One stock's daily readings. The engine's closing reading of a stock on each day: price and technicals, MARBIN score and risk score (with their parts), stop and target, forecast, analysts, the Shariah verdict and ratios, fundamentals, filings red flags and insider selling. fields= picks columns (or all); 30 days by default, up to 400.
| Parameter | In | Required | Type | Example |
symbol | path | yes | string | AAPL |
from | query | no | date | |
to | query | no | date | |
fields | query | no | string | score,risk_score,debt_pct |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/history/AAPL?from=2026-10-01&fields=score,risk_score,shariah_passed"
GET /v1/history/day/{date}key: Authorization: Bearer
Every stock on one day. The whole universe's reading on one day.
| Parameter | In | Required | Type | Example |
date | path | yes | date | |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/history/day/2026-10-02?fields=score,risk_score"
GET /v1/history/marketkey: Authorization: Bearer
The market by day. The VIX and each index against its 200-day average.
No parameters.
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/history/market?from=2026-10-01"
GET /v1/fx/{pair}key: Authorization: Bearer
Exchange rates by day. Daily closing rates, e.g. GBPUSD.
| Parameter | In | Required | Type | Example |
pair | path | yes | string | GBPUSD |
Answers: 200 OK, 400 A bad parameter, 401 No valid key, 403 This key is limited to other groups (its scopes), 404 Not covered, 429 Over this key's requests a minute
curl -H "Authorization: Bearer $MARBIN_KEY" "https://api.marbin.co.uk/v1/fx/GBPUSD?from=2026-09-01"
POST /v1/oauth/tokenbank API: OAuth token
Machine sign-in: an access token. OAuth 2.0 client credentials (RFC 6749 section 4.4). Send the client id and secret MARBIN gave the bank -- HTTP Basic (preferred) or client_id and client_secret in the form -- with grant_type=client_credentials and, optionally, scope (space-separated, at most the client's). The token lives 15 minutes; ask for a new one when it runs out. Errors here are RFC 6749's: {error, error_description}.
No parameters.
Answers: 200 A token, 400 unsupported_grant_type, invalid_scope or invalid_request, 401 invalid_client: unknown client or wrong secret, 429 slow_down (see Retry-After): too many tokens for this client a minute, too many requests from this address, or too many wrong secrets from it (a backoff, doubling up to 15 minutes; the right secret from another address still works), 405 method_not_allowed: POST only (Allow: POST)
curl -H "Authorization: Bearer $TOKEN" -X POST "https://bank-api.marbin.co.uk/v1/oauth/token"
GET /v1/customersbank API: OAuth token
The bank's customers. Paged, oldest id first: limit (1-200, default 50) and the next_cursor of the page before. Filters: status, kind (live or practice: the main account's), email, external_id. Removed customers only with status=removed. Scope: customers:read.
| Parameter | In | Required | Type | Example |
status | query | no | string | |
kind | query | no | string | |
email | query | no | string | |
external_id | query | no | string | |
limit | query | no | string | |
cursor | query | no | string | |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute
curl -H "Authorization: Bearer $TOKEN" -X GET "https://bank-api.marbin.co.uk/v1/customers"
POST /v1/customersbank API: OAuth token
Onboard a customer. An invitation in the bank's name, pending until approved: emailed to the customer in the bank's name (powered by MARBIN) unless send_invitation is false, and their email queued for the bank portal's sign-in list (sign_in_access). The customer signs in on the bank's portal with this email, connects their own broker account and makes their choices, then the bank approves them. Record the bank's own customer check (bank_check) and customer number (external_id) here if they're ready. One person, one provider: an email already with MARBIN or another provider is refused (409 already_with_another_provider, never which), and so is a new customer over the bank's customer limit (409 over_customer_limit). Scope: customers:write.
| Parameter | In | Required | Type | Example |
Idempotency-Key | header | yes | string | |
Answers: 201 Created, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 A customer with this email or external_id already exists (already_exists), the email is already with MARBIN or another provider (already_with_another_provider), the bank's customer limit is reached (over_customer_limit), or the bank may offer no broker its customers can connect (no_broker_allowed), 422 A field isn't valid, or the Idempotency-Key was used with a different request
curl -H "Authorization: Bearer $TOKEN" -X POST "https://bank-api.marbin.co.uk/v1/customers"
POST /v1/customers/batchbank API: OAuth token
Onboard customers in bulk. Up to 500 customers in one call, each checked as POST /v1/customers checks one and as the partner portal's Invite in bulk checks a line: a bad email or name, the same email or external_id twice in the request, already the bank's customer, already with MARBIN or another provider (never which), over the bank's customer limit. The ready ones are invited at once (pending until approved, their sign-in access queued); their invitation emails go out in the background at about 2 a second (send_invitations: false to leave them to the bank). One result per customer, in the request's order: a rejected one changes nothing; the call answers 200 whatever the mix. A retry with the same Idempotency-Key gets the same answer and invites no one twice. Scope: customers:write.
| Parameter | In | Required | Type | Example |
Idempotency-Key | header | yes | string | |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 The bank may offer no broker its customers can connect (no_broker_allowed): nobody is invited, 413 Over 512 KB, 422 Not a list of 1 to 500 customers, an unknown field, or the Idempotency-Key was used with a different request, 501 Two-person approval is on for bulk invitations and isn't available through the API yet
curl -H "Authorization: Bearer $TOKEN" -X POST "https://bank-api.marbin.co.uk/v1/customers/batch"
GET /v1/customers/{customer_id}bank API: OAuth token
One customer. With their accounts, each live or practice. Scope: customers:read.
| Parameter | In | Required | Type | Example |
customer_id | path | yes | string | cus_3f9a1c07e52b84d6 |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute
curl -H "Authorization: Bearer $TOKEN" -X GET "https://bank-api.marbin.co.uk/v1/customers/{customer_id}"POST /v1/customers/{customer_id}/bank-checkbank API: OAuth token
Record the bank's own customer check. Before approval (invited or registered): the reference of the bank's own customer check, who did it and when. Shown to the bank's staff; MARBIN's approval flow is unchanged. Scope: customers:write.
| Parameter | In | Required | Type | Example |
customer_id | path | yes | string | cus_3f9a1c07e52b84d6 |
Idempotency-Key | header | yes | string | |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 Not in a state for this (e.g. already paused), 422 A field isn't valid, or the Idempotency-Key was used with a different request
curl -H "Authorization: Bearer $TOKEN" -X POST "https://bank-api.marbin.co.uk/v1/customers/{customer_id}/bank-check"GET /v1/accounts/{account_id}/holdingsbank API: OAuth token
What MARBIN holds in an account. Each holding and the totals after costs, in the account's currency: total_cost = paid + buying costs; gain = value - total_cost; if_sold_today also takes off a sale's estimated costs. The same figures as the customer's own page and app. Scope: accounts:read.
| Parameter | In | Required | Type | Example |
account_id | path | yes | string | cus_3f9a1c07e52b84d6 |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 Not trading yet (invited or registered)
curl -H "Authorization: Bearer $TOKEN" -X GET "https://bank-api.marbin.co.uk/v1/accounts/{account_id}/holdings"GET /v1/accounts/{account_id}/performancebank API: OAuth token
How an account has done. Time-weighted returns against funds the customer could hold instead (day, week, month, year to date, since start), and the money made: holdings after buying costs, sales net of selling costs. Past results are no guide to the future. Scope: accounts:read.
| Parameter | In | Required | Type | Example |
account_id | path | yes | string | cus_3f9a1c07e52b84d6 |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 Not trading yet (invited or registered)
curl -H "Authorization: Bearer $TOKEN" -X GET "https://bank-api.marbin.co.uk/v1/accounts/{account_id}/performance"POST /v1/accounts/{account_id}/pausebank API: OAuth token
Pause an account. No new trades; the stops on its holdings stay. One person is enough: a safety action never waits. Scope: accounts:pause.
| Parameter | In | Required | Type | Example |
account_id | path | yes | string | cus_3f9a1c07e52b84d6 |
Idempotency-Key | header | yes | string | |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 Not in a state for this (e.g. already paused), 422 A field isn't valid, or the Idempotency-Key was used with a different request
curl -H "Authorization: Bearer $TOKEN" -X POST "https://bank-api.marbin.co.uk/v1/accounts/{account_id}/pause"POST /v1/accounts/{account_id}/resumebank API: OAuth token
Resume a paused account. Only a paused account (never an approval). Dual control -- one approver at MARBIN and one at the bank -- will apply here once it's switched on; today the client's bank role is the guard. Scope: accounts:pause.
| Parameter | In | Required | Type | Example |
account_id | path | yes | string | cus_3f9a1c07e52b84d6 |
Idempotency-Key | header | yes | string | |
Answers: 200 OK, 400 A bad parameter or body, 401 No valid access token, 403 The token hasn't this scope, or the client's role may not, 404 Not this bank's, or doesn't exist (the same answer), 429 Over this client's requests a minute, 409 Not in a state for this (e.g. already paused), 422 A field isn't valid, or the Idempotency-Key was used with a different request
curl -H "Authorization: Bearer $TOKEN" -X POST "https://bank-api.marbin.co.uk/v1/accounts/{account_id}/resume"The endpoints marked bank API are a bank's own systems managing its customers, at their own address with their own machine sign-in (OAuth 2.0 client credentials): see the reference, For banks.