Skip to content
MyStocks Developers
API v1

API v1

Current stable contract

Versioning policyRelease changelog
Sandbox console
Choose your API

Partner API Specification

MyStocks Partner API

September 2026 B2B specification, integration fundamentals, product reference, and clarifications for the current online API contract.

Explore endpoints

2 of 2
POST

/trade

Place trade

Full endpoint documentation
Sandbox unsupportedcreateTrade

Places a BUY or SELL order on your own partner account (not a sub-account — use /users/{userId}/trade for those). Sandbox master trading is unsupported and returns HTTP 422; use POST /users/{userId}/trade with a funded sandbox sub-account instead. BUY — escrows USD from your master wallet. Settlement is T+3 for most African exchanges. SELL — requires you to hold the shares. Proceeds are credited on settlement. Pass Idempotency-Key to make retries safe. The same key returns the cached order within 24 h.

Parameters

This endpoint has no path or query parameters.

Headers

AuthorizationstringRequired

Bearer sk_sandbox_<your_key> for sandbox requests.

Idempotency-KeystringheaderRequired

Unique string that makes write calls safe to retry on network failure. Required for money movement, trading, KYC, subscriptions, and webhook creation. Deduplicated for 24 hours -- duplicate keys return the cached response. HTTP 409 if a concurrent request with the same key is still in progress.

Example: dep_user42_1743152580

Request body

fundingWalletCurrencystring

Convert explicitly to USD before submitting an order

symbolstringRequired

Stock symbol. Accepts exchange-qualified (SCOM.KE, DANGCEM.NG) or bare ticker (SCOM) -- auto-resolved when unambiguous. Returns 422 with match list if ambiguous.

Example: "SCOM.KE"

typeBUY | SELLRequired

Order direction.

Example: "BUY"

quantitynumber

Number of shares. Whole-share markets require integer quantities; fractional-enabled markets allow up to 6 decimal places. Mutually exclusive with cashValue.

Example: 500

cashValuenumber

USD notional amount for cash-mode fractional investing. Mutually exclusive with quantity and must match the cashValue used to obtain quoteId for MARKET orders.

Example: 50

quoteIdstring

Fresh pre-trade quote ID from GET /quote/{symbol}. Quotes expire after 60 seconds and can be used once. Required for MARKET orders, including the default when orderType is omitted; ignored for LIMIT/STOP/STOP_LIMIT.

Example: "qt_2f4d5a7b8c9e4f01a2b3c4d5e6f78901"

orderTypeMARKET | LIMIT | STOP | STOP_LIMIT

MARKET (default): quote-gated and routed to automatic MyStocks internal-book execution. LIMIT/STOP/STOP_LIMIT are resting orders — they are placed WITHOUT a quote, escrow at the trigger price, rest in status WORKING, and route to automatic internal-book execution when the latest delayed price observation crosses the trigger (during market hours). BUY LIMIT fills at/below limitPrice; SELL LIMIT at/above; BUY STOP triggers at/above stopPrice; SELL STOP at/below. Prices are in the stock's LOCAL trading currency. Fires order.triggered on activation.

limitPricenumber

Local-currency limit price. Required for LIMIT and STOP_LIMIT.

stopPricenumber

Local-currency stop/trigger price. Required for STOP and STOP_LIMIT.

clientOrderIdstring

Optional partner-supplied order reference. Must be unique per partner when supplied.

Example: "partner-ord-10001"

timeInForceDAY | GTC | GTD

Order validity instruction, enforced by the OMS lifecycle daemon. GTC (default) keeps the order live until executed or cancelled. DAY orders auto-cancel if not executed within 24 hours; GTD orders auto-cancel at expiresAt. On expiry, BUY escrow is refunded, SELL reservations are released, and an order.cancelled webhook fires. IOC is not supported by the current MyStocks internal-book order contract.

expiresAtstring

Required for GTD orders. Stored for OMS expiry governance.

orderInstructionstring

Optional free-text execution instruction for the MyStocks internal-book engine.

stopLossnumber

Optional. Order auto-cancels if the stock falls below this USD price before settlement.

Example: 0.11

takeProfitnumber

Optional. Order auto-settles if the stock rises above this USD price before settlement.

Example: 0.16

Response fields

orderIdstring

Unique order ID. Use to poll status or cancel.

Example: "ord_abc123xyz"

symbolstring

Example: "SCOM.KE"

namestring

Example: "Safaricom PLC"

exchangestring

Example: "NSE"

orderTypeMARKET | LIMIT | STOP | STOP_LIMIT

Order type. MARKET orders are quote-gated; LIMIT/STOP/STOP_LIMIT rest as WORKING until triggered.

Example: "LIMIT"

limitPricenumber | null

Limit price in the stock's local currency (LIMIT / STOP_LIMIT only).

stopPricenumber | null

Stop price in the stock's local currency (STOP / STOP_LIMIT only).

cancelableboolean

Whether the order can be cancelled now (DELETE). True while PENDING or WORKING.

replaceableboolean

Whether the order can be modified now (PATCH). True only for a WORKING resting order.

typeBUY | SELL
statusPENDING | WORKING | PARTIALLY_FILLED | PROCESSING | COMPLETED | FILLED | REJECTED | CANCELLED | EXPIRED

PENDING after submission. WORKING = resting LIMIT/STOP/STOP_LIMIT order waiting for its trigger price (becomes PENDING on trigger). PARTIALLY_FILLED and FILLED are the canonical execution states. REJECTED, CANCELLED, and EXPIRED are terminal outcomes. PROCESSING is a legacy transition alias and COMPLETED is a v1 compatibility alias of FILLED; neither represents custody settlement. Settlement is tracked separately as PENDING, SETTLED, or FAILED.

quoteIdstring | null

Pre-trade quote ID consumed by this order.

quoteExpiresAtstring | null
quoteUsdPricenumber | null
clientOrderIdstring | null

Partner-supplied order reference.

omsStatusstring | null

Canonical OMS lifecycle status.

timeInForcestring | null
filledQuantitynumber
remainingQuantitynumber
averageFillPricenumber | null
executionVenuestring | null
lastExecutionReportIdstring | null
executionSlaunion

Live execution SLA clock for orders that have entered the PENDING dealing-desk queue. Null while a resting order is still WORKING.

quantityinteger
priceAtOrdernumber

Stock price in local currency at submission.

usdPriceAtOrdernumber

USD equivalent of priceAtOrder.

fxRateAtOrdernumber | null

Managed FX rate used for local-to-USD conversion at order submission.

fxSourcestring | null
fxRateAsOfstring | null
fxConversionunion
feenumber

Total fee in USD (base + partner markup).

baseFeenumber

MyStocks base broker fee (0.75% of gross).

partnerMarkupFeenumber

Your markup fee component. Zero if markupBps = 0.

totalAmountnumber

BUY: gross + fee. SELL: gross - fee.

currencystring

Example: "USD"

localCurrencystring

Example: "KES"

rejectionCodestring | null

Structured rejection code. Populated when status = REJECTED.

rejectionReasonstring | null

Free-text rejection detail provided by the MyStocks internal-book execution service. Populated when status = REJECTED.

cancelledAtstring | null
settledAtstring | null

Set when custody settlement completes; independent of the canonical FILLED execution state. Legacy completed records that pre-date this field return their immutable completion/creation timestamp as compatibility evidence.

createdAtstring
canonicalStatusPENDING | WORKING | PARTIALLY_FILLED | FILLED | REJECTED | CANCELLED | EXPIRED
settlementStatusPENDING | SETTLED | FAILED
orderLifecyclestring | null

EXPIRED for expiry; expiry is not a rejection.

cancelReasonstring | null

Response codes

201Order placed.
400Insufficient wallet balance.
409Idempotency conflict — duplicate in-flight.
422Business rule violation in production; master-account trading is not available in sandbox.

The September 2026 MyStocks Partner API & Developer Platform Specification brings together eight commercial API products, their endpoint inventory, error vocabulary, webhook events, and integration requirements.

Download PartnerAPI.pdf (339 pages) · Browse all eight products · Open API Reference

Environments and authentication

EnvironmentBase URLStandard API key prefix
Productionhttps://mystocks.africa/api/v1/partnerpk_live_
Sandboxhttps://mystocks.africa/api/sandbox/v1/partnersk_sandbox_

Send API credentials using Authorization: Bearer or x-api-key. Read-only data keys, OAuth client credentials, and Firebase-authenticated console operations have distinct scopes and requirements. Follow the authentication guide and each operation's security definition in the API Reference.

Use sandbox and paper trading for integration testing. Check the product catalog's sandbox column before calling an operation: production-only endpoints and unsupported stubs are not fully simulated.

Request safety and operational contracts

TopicOnline guidance
IdempotencyAuthentication and contract guarantees: mutation requirements, bootstrap exceptions, 24-hour replay retention, and payload mismatch handling.
Rate limitsTier quotas and response headers: Starter 100, Growth 500, and Enterprise 2,000 requests per minute, with contracted custom limits where applicable.
HTTP errors and dealing-desk rejectionsErrors: distinguish synchronous request failures from asynchronous order rejection reasons.
Webhook signatures and retriesWebhooks: event directory, raw-body HMAC-SHA256 verification, delivery logs, and retry behavior.
Event streamsServer-Sent Events: connection limits, heartbeats, replay, and reconnection.
Production readinessGoing live, controlled production pilot, and general availability.

Product and endpoint reference

The product catalog covers all 203 operations across 156 route paths. Every product page includes method, path, operation ID, purpose, sandbox availability, and links to its implementation guides. The interactive reference contains request and response schemas, parameters, examples, and status codes.

The PDF's additional discovery and infrastructure section is separate from this inventory. Use OpenAPI JSON or OpenAPI YAML for public schema discovery. Partner brand discovery supports the hosted tenant experience; scheduler workers are operated by MyStocks and require internal credentials.

Clarifications for the PDF edition

The downloadable PDF is preserved as supplied. Use the following current online guidance when integrating:

PDF wording or exampleOnline contract clarification
OpenAPI 3.0.3 / API version 1.0.0The published machine-readable specification declares OpenAPI 3.1.0, API version 1. Use the version declared in the downloaded schema.
partners.mystock.africa and tenant examples with mystock.africaThe partner domain is partners.mystocks.africa; tenant domains use mystocks.africa. The documentation is also available at https://partners.mystocks.africa/partners/docs.
OAuth JWT and sec_live_ secret examplesFollow the OAuth client credentials guide: the client secret is the API key; returned access tokens use ms_oauth_ and expire after 15 minutes. Do not infer a JWT format.
Every operation has strict sandbox parityPer-operation OpenAPI metadata and the product catalogs identify sandbox availability and unsupported stubs. Master POST /trade and POST /payout return 422 in sandbox; trade through a sub-account instead.
Every mutation requires idempotency with no exceptionsCredential bootstrap and recovery operations have documented exceptions. See authentication.
x-ratelimit-reset is in millisecondsX-RateLimit-Reset is a Unix timestamp in seconds; Retry-After is also in seconds.
Per-second burst allowancesUse the published minute quotas and concurrent stream limits; the PDF's burst figures are not a separate documented entitlement.
Real-time market intelligence or order book analyticsAfrican equity quotes are 15-minute delayed. Webhooks and SSE carry account and market-status events, not streaming price ticks or Level-2 depth. See market data.
Six webhook retries across two hoursThe retry schedule contains six attempts including the initial attempt, with scheduled retry delays. See webhook delivery semantics; do not treat two hours as a guaranteed total delivery window.
Generated sample valuesTreat examples as illustrative; required fields, enums, eligibility, authentication, and response status codes come from the operation contract.

For signature verification, use the webhook guide's examples, including malformed-signature handling, rather than calling timingSafeEqual on unchecked buffers of potentially unequal length.

Appendices and implementation resources

Was this page useful?

Your signal helps us tighten partner onboarding docs.

Send note

Last updated on

On this page