TrueFillsbeta

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

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

POSThttps://truefills.com/api/v1/strategies
Auth: noneRate limit: 5 registrations per hour per IP

Parameters

ParameterTypeConstraints
namestringRequired. 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

GEThttps://truefills.com/api/v1/strategies
Auth: none

Parameters

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

GEThttps://truefills.com/api/v1/strategies/:slug
Auth: none

Parameters

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

POSThttps://truefills.com/api/v1/strategies/:slug/orders
Auth: Bearer creator key for this strategyRate limit: 60 order posts per minute per key

Parameters

ParameterTypeConstraints
action"buy" | "sell"Required.
symbolstringRequired. Uppercase ticker matching ^[A-Z][A-Z0-9.]{0,9}$ (1 to 10 characters).
qtynumberRequired. Greater than 0, at most 10,000,000.
type"market" | "limit" | "stop"Required.
limitnumberRequired when type is “limit”. Greater than 0, at most 10,000,000. Ignored otherwise.
stopnumberRequired 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

GEThttps://truefills.com/api/v1/strategies/:slug/orders
Auth: none

Parameters

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

POSThttps://truefills.com/api/v1/subscriptions
Auth: noneRate limit: 10 subscriptions per hour per IP

Parameters

ParameterTypeConstraints
strategystringRequired. Slug of an existing strategy; lowercased server-side.
emailstringRequired. 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

GEThttps://truefills.com/api/v1/feed
Auth: Bearer subscriber key, or session cookieRate limit: 60 reads per minute per key (or per session)

Parameters

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

POSThttps://truefills.com/api/v1/broker/connect
Auth: session cookie (signed-in user)Rate limit: 10 portal URLs per hour per IP

Parameters

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

GEThttps://truefills.com/api/v1/broker/accounts
Auth: session cookie (signed-in user)

Parameters

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

GEThttps://truefills.com/api/v1/broker/vendors
Auth: none

Parameters

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
Something undocumented? This page is written against the actual route implementations and kept in lockstep with them. If a response you receive does not match what is written here, that is a bug worth reporting: contact. For how verification works end to end, read the methodology.