API reference · v1
Every endpoint, as it actually behaves.
The complete v1 surface: request fields, validation bounds, status codes and rate limits, documented from the running implementation. New here? Start with the quick start. Base URL for all paths: https://truefills.com.
Conventions
- Bearer auth. Authenticated requests send
Authorization: Bearer YOUR_KEY. There are two key kinds: a creator key minted when you register a strategy, and a subscriber key minted when you subscribe. Both are shown once, stored only as SHA-256 hashes, and compared in constant time. A wrong or missing key returns 401. - JSON only. Request bodies must be JSON with
Content-Type: application/json. A body that fails to parse returns 400 with a specific error message. Every response is JSON. - Rate limits. Exceeding a limit returns 429 with body
{"error":"rate limit exceeded; slow down and retry","retryAfterSec":N}and aRetry-Afterheader in seconds. Wait that long, then retry. Limits are keyed per IP for unauthenticated writes and per key for authenticated calls; exact numbers are listed on each endpoint below. - Append-only. A posted order is sealed into its strategy’s public hash chain the moment it arrives: each entry stores the previous entry’s hash and its own SHA-256 over that link plus the order body. Nothing can be edited or deleted afterward, by anyone, including us.
Strategies
Register a bot and mint its creator API key. The key appears once in this response and is stored only as a hash; it cannot be recovered. The slug is derived from the name: lowercased, non-alphanumerics collapsed to dashes, trimmed to 40 characters.
Endpoint
https://truefills.com/api/v1/strategiesParameters
| Parameter | Type | Constraints |
|---|---|---|
| name | string | Required. 60 characters or fewer after trimming. Must slugify to at least 3 characters. The name “Printhouse” is reserved, and the derived slug must not already be taken. |
Example
curl -X POST https://truefills.com/api/v1/strategies \
-H "Content-Type: application/json" \
-d '{"name": "My Mean Reversion Bot"}'Success response (201)
{
"slug": "my-mean-reversion-bot",
"name": "My Mean Reversion Bot",
"apiKey": "f3a9...48 hex characters",
"note": "Store this key now; it is shown once. Post orders to /api/v1/strategies/my-mean-reversion-bot/orders with Authorization: Bearer <key>."
}Errors
- 400 body is not JSON, or “name” is missing or not a string
- 409 name over 60 characters, slug under 3 characters, reserved name, or slug already taken
- 429 rate limit exceeded; honor Retry-After
Public list of all strategies: the flagship first, then every registered user strategy. New user strategies start in mode “unverified”.
Endpoint
https://truefills.com/api/v1/strategiesParameters
None.
Example
curl https://truefills.com/api/v1/strategies
Success response (200)
{
"strategies": [
{ "slug": "printhouse", "name": "Printhouse", "flagship": true, "mode": "paper" },
{ "slug": "my-mean-reversion-bot", "name": "My Mean Reversion Bot", "createdAt": "2026-09-05T14:02:11.412Z", "mode": "unverified" }
]
}Errors
- none this endpoint always returns 200
Public record for one strategy. User strategies return registration data plus the head of their order chain. The flagship slug returns a richer record: live stats, the equity series, verification pointers and the URL of its published chain file. Responses may be cached for up to an hour.
Endpoint
https://truefills.com/api/v1/strategies/:slugParameters
None.
Example
curl https://truefills.com/api/v1/strategies/my-mean-reversion-bot
Success response (200), user strategy
{
"slug": "my-mean-reversion-bot",
"name": "My Mean Reversion Bot",
"mode": "unverified",
"createdAt": "2026-09-05T14:02:11.412Z",
"orderCount": 12,
"chainHead": "9c41...hash of the latest sealed order, null when empty"
}
// GET https://truefills.com/api/v1/strategies/printhouse returns instead:
// { "slug", "name", "flagship": true, "mode", "startedLive",
// "stats": { "equity", "totalPlPct", ... }, "equitySeries": [{ "date", "equity" }, ...],
// "verification": { "source", "chain", "records" }, "chainUrl": "/chain/printhouse.jsonl" }Errors
- 404 unknown strategy slug
Orders
Post an order as your bot places it. The order is appended to the strategy's public hash chain immediately and cannot be changed afterward. Market orders carry no claimed price, so the server stamps refPrice, the market price observed on arrival, and seals it with the order.
Endpoint
https://truefills.com/api/v1/strategies/:slug/ordersParameters
| Parameter | Type | Constraints |
|---|---|---|
| action | "buy" | "sell" | Required. |
| symbol | string | Required. Uppercase ticker matching ^[A-Z][A-Z0-9.]{0,9}$ (1 to 10 characters). |
| qty | number | Required. Greater than 0, at most 10,000,000. |
| type | "market" | "limit" | "stop" | Required. |
| limit | number | Required when type is “limit”. Greater than 0, at most 10,000,000. Ignored otherwise. |
| stop | number | Required when type is “stop”. Greater than 0, at most 10,000,000. Ignored otherwise. |
Example
curl -X POST https://truefills.com/api/v1/strategies/my-mean-reversion-bot/orders \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"buy","symbol":"AAPL","qty":10,"type":"limit","limit":150.00}'Success response (201)
{
"sealed": true,
"order": {
"seq": 12,
"ts": "2026-09-05T14:31:07.412Z",
"action": "buy",
"symbol": "AAPL",
"qty": 10,
"type": "limit",
"limit": 150,
"prevHash": "9c41...hash of the previous entry, GENESIS for the first",
"hash": "e07b...sha256 over prevHash plus this order body"
}
}Errors
- 400 body is not JSON, or a field fails validation; the error message names the field
- 401 invalid or missing API key for this strategy
- 429 rate limit exceeded; honor Retry-After
Market orders include refPrice in the sealed entry when a price was observable on arrival.
Public, hash-chained order log for a user strategy, oldest first. Anyone can recompute the chain to verify nothing was altered. The flagship's chain is not served here; it is published at /chain/printhouse.jsonl.
Endpoint
https://truefills.com/api/v1/strategies/:slug/ordersParameters
None.
Example
curl https://truefills.com/api/v1/strategies/my-mean-reversion-bot/orders
Success response (200)
{
"orders": [
{
"seq": 0,
"ts": "2026-09-04T19:55:01.002Z",
"action": "buy",
"symbol": "AAPL",
"qty": 10,
"type": "market",
"refPrice": 149.87,
"prevHash": "GENESIS",
"hash": "9c41..."
}
]
}Errors
- 404 unknown strategy slug (including the flagship slug; see /chain/printhouse.jsonl)
Subscriptions and feed
Subscribe to a strategy's signal feed by API and mint a one-time subscriber key. Free during early access; billing attaches to the same subscription when payments go live. Subscribing again with the same email returns the existing subscription with a 200 and no new key; keys cannot be recovered.
Endpoint
https://truefills.com/api/v1/subscriptionsParameters
| Parameter | Type | Constraints |
|---|---|---|
| strategy | string | Required. Slug of an existing strategy; lowercased server-side. |
| string | Required. Must be a plausible email (checked against a simple pattern); stored trimmed and lowercased. |
Example
curl -X POST https://truefills.com/api/v1/subscriptions \
-H "Content-Type: application/json" \
-d '{"strategy":"printhouse","email":"you@example.com"}'Success response (201; 200 if already subscribed)
{
"subscriptionId": "3f0e8a4c-7c1d-4e9a-9f2b-1a6d8c0e5b42",
"strategy": "printhouse",
"status": "early-access",
"apiKey": "b7d2...48 hex characters",
"note": "Store this key now; it is shown once. Poll /api/v1/feed with Authorization: Bearer <key>. Free during early access; billing attaches to this subscription at launch."
}Errors
- 400 body is not JSON, or the email fails validation
- 404 unknown strategy slug
- 429 rate limit exceeded; honor Retry-After
Latest orders for your subscribed strategy. Two ways in: a subscriber key as a bearer token, or a signed-in browser session whose email holds a subscription (add ?strategy=slug to pick one; the flagship is the default). User strategies return their last 50 sealed orders. The flagship returns live orders read directly from the broker when the connection is configured, otherwise an empty list with an explanatory note.
Endpoint
https://truefills.com/api/v1/feedParameters
None.
Example
curl https://truefills.com/api/v1/feed \ -H "Authorization: Bearer YOUR_SUBSCRIBER_KEY"
Success response (200), user strategy
{
"strategy": "my-mean-reversion-bot",
"status": "early-access",
"orders": [ ...last 50 sealed orders, same shape as the public order log... ],
"note": "Latest sealed orders for your subscribed strategy."
}
// Flagship feed entries come from the broker and look like:
// { "ts", "action", "symbol", "qty", "type", "limit"?, "stop"?, "status" }Errors
- 401 invalid or missing subscriber key, and no session with a subscription
- 429 rate limit exceeded; honor Retry-After
- 503 flagship broker feed temporarily unavailable; retry shortly
GET /api/v1/subscriptions serves the same handler; /api/v1/feed is the documented path.
Broker connections
Read-only account links power broker-sourced records. These endpoints use the signed-in browser session, not API keys: broker links belong to people, not bots. Credentials are entered on the broker’s own portal, never here, and no order placement exists on this platform.
Registers the signed-in user with the broker-connection provider (once) and returns a one-time portal URL. Open it, pick your brokerage, sign in there; the link created is read-only.
Endpoint
https://truefills.com/api/v1/broker/connectParameters
None.
Example
curl -X POST https://truefills.com/api/v1/broker/connect \ -H "Cookie: your TrueFills session"
Success response (200)
{
"redirect": "https://app.snaptrade.com/connect?...one-time portal URL"
}Errors
- 401 sign in required
- 429 rate limit exceeded; honor Retry-After
- 502 the connection provider rejected the request; the error message says which step failed
- 503 broker connections are not enabled yet on this deployment
Connected brokerage accounts for the signed-in user: institution, account name, balance. Read-only data. Returns linked: false with an empty list when no broker has been connected.
Endpoint
https://truefills.com/api/v1/broker/accountsParameters
None.
Example
curl https://truefills.com/api/v1/broker/accounts \ -H "Cookie: your TrueFills session"
Success response (200)
{
"linked": true,
"accounts": [
{
"id": "acc_...",
"name": "Individual",
"institution": "Robinhood",
"logo": "https://...institution logo, null when unknown",
"balance": { "amount": 12450.33, "currency": "USD" }
}
]
}Errors
- 401 sign in required
- 503 broker connections are not enabled yet on this deployment
Public list of supported brokerages. Served from a committed snapshot when the live provider list is unavailable, so it never renders empty. Responses may be cached for up to an hour.
Endpoint
https://truefills.com/api/v1/broker/vendorsParameters
None.
Example
curl https://truefills.com/api/v1/broker/vendors
Success response (200)
{
"vendors": [
{ "slug": "SCHWAB", "name": "Schwab", "logo": "https://...or null" },
{ "slug": "FIDELITY", "name": "Fidelity", "logo": null }
]
}Errors
- none this endpoint always returns 200