Skip to main content

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.

Do not start with /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

NeedLaneEndpointUse it for
Simple bots and dashboardsREST + WebSockethttps://api.sentico-labs.xyz / wss://api.sentico-labs.xyzSigned JSON actions, account reads, market data, frontend-like workflows
Existing FIX stackFIX 4.4fix.sentico-labs.xyz:9878 with SNI fix.sentico-labs.xyzSession-auth order entry, cancels, cancel-replace, status, mass-cancel, drop-copy
Lowest Senticore-native wireBSL Direct TCPbsl.sentico-labs.xyz:9001 with SNI bsl.sentico-labs.xyzPersistent raw TCP/TLS quote flow, 192-byte compact action frames, per-action account signature
SBE/FIXP shopsBinary-FIX / FIXPfixp.sentico-labs.xyz:9879 with SNI fixp.sentico-labs.xyzSOFH + 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 valueUsed by
apiKeyIdHTTP HMAC header, FIX Username(553), FIXP credentials
apiSecretHTTP HMAC signing, FIX Password(554), FIXP credentials
apiPassphraseHTTP HMAC passphrase, FIX Password(554), FIXP credentials
Agent private keyDelegated 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:

FieldMeaning
bslTcp.host, bslTcp.port, bslTcp.tlsSniNative BSL Direct TCP endpoint
fix.host, fix.port, fix.tlsSniNative FIX 4.4 endpoint
fix.orderEntry.senderCompIdTag49FIX order-entry SenderCompID(49)
fix.dropCopy.senderCompIdTag49FIX drop-copy SenderCompID(49) when available
fix.targetCompIdTag56FIX TargetCompID(56), normally SENTICORE

4. Know which order interface does what

InterfacePlace orderCancelReplace / quote refreshStatus / drop-copy
REST signed JSONLimit/market signed actionsSigned cancel actionsSigned cancel + new action or route-specific batch helperAccount/order reads, private WS/SSE
BSL compact HTTPPlaceOrder inside compact batchSigned cancel action inside compact batchCompact batch quote refresh/cancel-replace where enabledPrivate streams/gap-fill; response is an ack unless full is enabled
BSL Direct TCP192-byte compact action frameCompact signed cancel framePersistent quote-loop frames, same action semantics as compact submitSequenced acks plus private streams/drop-copy
FIX 4.4D NewOrderSingleF OrderCancelRequestG OrderCancelReplaceRequest, q MassCancelH OrderStatusRequest, AF MassStatus, drop-copy session
FIXP/SBETemplate 1 NewOrderSingleTemplate 2 OrderCancelRequestTemplate 3 CancelReplace, template 4 MassCancelTemplate 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.

ResponseMeaning
HTTP/BSL ackMode: ingress_walAccepted 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 ackSession-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_agent and trying to use it for FIX, BSL, or FIXP order entry. Use institutional_agent.
  • Sending FIX TLS SNI as api.sentico-labs.xyz. Use fix.sentico-labs.xyz.
  • Putting a 20-byte wallet address into accountId. Internal accountId values 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., or fixp. through Cloudflare. These lanes are raw TCP/TLS, not HTTP.

Next pages