Market Maker Start Here
Use this page first when integrating a market-maker bot, quote engine, or institutional OMS. It gives the intended beta path end to end: which lane to use, which agent to create, which order types are supported, and how to smoke test the connection.
/api/v1/institutional/*Those routes are provisioning, reporting, and account-management surfaces. They are not the self-serve market-maker order-entry path. For trading, start with REST/WebSocket, FIX 4.4, BSL Direct TCP, or FIXP as listed below.
1. Pick the lane
| Need | Lane | Endpoint | Use it for |
|---|---|---|---|
| Simple bots and dashboards | REST + WebSocket | https://api.sentico-labs.xyz / wss://api.sentico-labs.xyz | Signed JSON actions, account reads, market data, frontend-like workflows |
| Existing FIX stack | FIX 4.4 | fix.sentico-labs.xyz:9878 with SNI fix.sentico-labs.xyz | Session-auth order entry, cancels, cancel-replace, status, mass-cancel, drop-copy |
| Lowest Senticore-native wire | BSL Direct TCP | bsl.sentico-labs.xyz:9001 with SNI bsl.sentico-labs.xyz | Persistent raw TCP/TLS quote flow, 192-byte compact action frames, per-action account signature |
| SBE/FIXP shops | Binary-FIX / FIXP | fixp.sentico-labs.xyz:9879 with SNI fixp.sentico-labs.xyz | SOFH + SBE + FIXP recoverable sessions, binary New/Cancel/CancelReplace/MassCancel |
FIX, BSL Direct TCP, and FIXP are raw TLS-over-TCP lanes. Keep their DNS records DNS-only. They do not work through a Cloudflare HTTPS proxy.
2. Create the right agent
For FIX, BSL, and FIXP, create an institutional_agent with an HMAC credential.
A normal api_agent is useful for standard HTTP bots and private reads, but it
is rejected for institutional order entry.
Minimum beta scopes for a market-maker agent:
["read", "trade", "cancel", "quote", "drop_copy"]
Create the agent and first HMAC credential in one call:
POST /api/agents/create
Content-Type: application/json
{
"authorization": {
"domain": "app.sentico-labs.xyz",
"appName": "SentiPredict",
"scheme": "senticore_typed_v2",
"environment": "Arbitrum One",
"chainId": 42161,
"userWalletAddress": "0xOwnerWallet",
"agentPublicKey": "0xGeneratedAgentAddress",
"label": "MM quote engine",
"agentType": "institutional_agent",
"scopes": ["read", "trade", "cancel", "quote", "drop_copy"],
"policy": {},
"expiresAt": 1790000000000,
"authorizationNonce": "7c4a0e4a5d43c4d8c9e2a55b",
"issuedAt": 1760000000000,
"signature": "0x..."
},
"issueInitialCredential": true
}
The wallet owner signs the authorization message. Store these returned values immediately because the raw secret material is shown only once:
| Returned value | Used by |
|---|---|
apiKeyId | HTTP HMAC header, FIX Username(553), FIXP credentials |
apiSecret | HTTP HMAC signing, FIX Password(554), FIXP credentials |
apiPassphrase | HTTP HMAC passphrase, FIX Password(554), FIXP credentials |
| Agent private key | Delegated signing, if your bot signs account actions directly |
Full typed-signing details are in API Agents.
3. Read the connectivity bundle
After creating the institutional_agent, read the bundle. Use the returned
hosts, ports, SNI values, and FIX CompIDs instead of guessing.
GET /api/v1/bsl/connectivity
SC-Auth-Version: 2
SC-Key: <apiKeyId>
SC-Nonce: <monotonic nonce>
SC-Timestamp: <unix ms>
SC-Passphrase: <apiPassphrase>
SC-Signature: <hmac signature>
Alias:
GET /api/v1/fix/connectivity
The bundle returns:
| Field | Meaning |
|---|---|
bslTcp.host, bslTcp.port, bslTcp.tlsSni | Native BSL Direct TCP endpoint |
fix.host, fix.port, fix.tlsSni | Native FIX 4.4 endpoint |
fix.orderEntry.senderCompIdTag49 | FIX order-entry SenderCompID(49) |
fix.dropCopy.senderCompIdTag49 | FIX drop-copy SenderCompID(49) when available |
fix.targetCompIdTag56 | FIX TargetCompID(56), normally SENTICORE |
4. Know which order interface does what
| Interface | Place order | Cancel | Replace / quote refresh | Status / drop-copy |
|---|---|---|---|---|
| REST signed JSON | Limit/market signed actions | Signed cancel actions | Signed cancel + new action or route-specific batch helper | Account/order reads, private WS/SSE |
| BSL compact HTTP | PlaceOrder inside compact batch | Signed cancel action inside compact batch | Compact batch quote refresh/cancel-replace where enabled | Private streams/gap-fill; response is an ack unless full is enabled |
| BSL Direct TCP | 192-byte compact action frame | Compact signed cancel frame | Persistent quote-loop frames, same action semantics as compact submit | Sequenced acks plus private streams/drop-copy |
| FIX 4.4 | D NewOrderSingle | F OrderCancelRequest | G OrderCancelReplaceRequest, q MassCancel | H OrderStatusRequest, AF MassStatus, drop-copy session |
| FIXP/SBE | Template 1 NewOrderSingle | Template 2 OrderCancelRequest | Template 3 CancelReplace, template 4 MassCancel | Template 10 ExecutionReport, template 12 BusinessMessageReject |
Current FIX 4.4 order entry is prediction-market oriented and expects
Book(9100) (YES or NO) on placement. Spot quote engines should use REST
signed actions or BSL order-entry batches until spot FIX semantics are enabled
for their account.
5. Treat acknowledgements correctly
Fast acknowledgements are admission signals, not fill truth.
| Response | Meaning |
|---|---|
HTTP/BSL ackMode: ingress_wal | Accepted into the venue path. Reconcile final state separately. |
FIX ExecutionReport(35=8, 150=A, 39=A) | PendingNew admission ack. Working/fill/cancel state arrives later. |
| FIXP execution ack | Session-level order response. Continue consuming execution/drop-copy frames. |
For final strategy state, reconcile from private streams, FIX/FIXP drop-copy, account/order reads, or protected BSL gap-fill. For portfolio/bootstrap reads after fast cycles, request a fresh read where supported instead of relying on a cached projection.
6. Smoke-test before trading size
Run the docs contract audit from the repository root:
node scripts/e2e/mm-docs-contract-audit.cjs
FIX 4.4 order-entry smoke:
FIX_PASSWORD="$API_SECRET:$API_PASSPHRASE" \
python scripts/fix_conformance_smoke.py \
--host fix.sentico-labs.xyz \
--port 9878 \
--tls-server-name fix.sentico-labs.xyz \
--sender-comp-id "$FIX_SENDER_COMP_ID" \
--target-comp-id SENTICORE \
--account "$ACCOUNT" \
--username "$API_KEY_ID" \
--password "$FIX_PASSWORD" \
--market-id 1 \
--price 100000 \
--replace-price 110000 \
--qty 10000 \
--rounds 2
FIXP codec and live-session smoke:
python scripts/fixp_conformance_smoke.py verify-golden
python scripts/fixp_conformance_smoke.py session \
--host fixp.sentico-labs.xyz \
--port 9879 \
--tls \
--sni fixp.sentico-labs.xyz \
--api-key "$API_KEY_ID" \
--api-secret "$API_SECRET" \
--api-passphrase "$API_PASSPHRASE" \
--account "$ACCOUNT" \
--market 1 \
--side bid \
--price 100000 \
--qty 10000 \
--orders 20 \
--cancel-after-ack
Common integration mistakes
- Creating an
api_agentand trying to use it for FIX, BSL, or FIXP order entry. Useinstitutional_agent. - Sending FIX TLS SNI as
api.sentico-labs.xyz. Usefix.sentico-labs.xyz. - Putting a 20-byte wallet address into
accountId. InternalaccountIdvalues are 32 bytes; omit the field unless you know the exact account id. - Treating a fast ack as a fill or resting-order confirmation.
- Reusing a different FIX
SenderCompID(49)on every reconnect. Keep it stable unless you intentionally reset sequence state. - Orange-proxying
fix.,bsl., orfixp.through Cloudflare. These lanes are raw TCP/TLS, not HTTP.