One call returns everything flat. No pagination. No joins. Every client, contract, file, and platform stat, raw JSON, ready for any AI model or automation.
Everything returned in a single call. Colours denote data type, no headers needed.
{ "user": "you@domain.com", "client_count": 12, "clients": [{ "name": "Acme Corp", "email": "hi@acme.com", "industry": "SaaS", "join_date": "2025-11-01", "notes": "Follow up Q1. Decision maker is Sarah.", "delivery_freq_days": 30, "sent": false, "contracts": [{ "name": "contract.pdf", "url": "https://files.titanlineco.com/...", "text": "This agreement is entered into between Acme Corp and... payment terms net 30. Deliverables defined in Schedule A." }], "files": [{ "name": "brief.pdf", "url": "https://files.titanlineco.com/...", "text": "Project brief: redesign onboarding. Target 40% drop-off reduction. Launch Q2." }] }], "platform_count": 3, "platforms": [{ "name": "LinkedIn", "account": "@yourhandle", "total": 4200, "follow_ups": 180, "interest": 42, "ready": 8 }] }
HTTP Request node with Header Auth. Query field accepts JSON body for write operations.
Two primitives. GET pulls the state. POST writes it back. Everything else the AI assembles from context.
KEY = "YOUR_KEY" BASE = "https://titanlineco.com/api" H = {"Authorization": f"Bearer {KEY}"} data = requests.get(f"{BASE}/data?add=clients,platforms", headers=H).json() with open("titanline_data.txt", "w") as f: f.write(json.dumps(data, indent=2))
for client in data["clients"]: requests.post(f"{BASE}/data", headers={**H, "Content-Type": "application/json"}, json={ "client_id": client["client_id"], "sent": True, "checkboxes": {"report": True, "email": True} })
def knowledge_base(path="titanline_data.txt"): with open(path) as f: return f.read()
POSTs are building blocks. Simple, composable, intentionally minimal. We can't document every sequence the AI assembles what the context demands. These are three projections of what that looks like.
clients = requests.get(f"{BASE}/data?add=clients", headers=H).json()["clients"] for c in [x for x in clients if not x["sent"]]: send_email(c) requests.post(f"{BASE}/data", headers={**H,"Content-Type":"application/json"}, json={"client_id":c["client_id"],"sent":True}) verify = requests.get(f"{BASE}/data?add=clients",headers=H).json()["clients"] confirmed = next(x for x in verify if x["client_id"] == c["client_id"]) assert confirmed["sent"] == True
client = requests.get(f"{BASE}/data?add=clients",headers=H).json()["clients"][0] note = model.chat(f"Summarise this client from their files: {client['files']}") requests.post(f"{BASE}/data",headers={**H,"Content-Type":"application/json"},json={ "client_id": client["client_id"], "notes": note }) updated = requests.get(f"{BASE}/data?add=clients",headers=H).json()["clients"] match = next(x for x in updated if x["client_id"] == client["client_id"]) assert match["notes"] == note
clients = requests.get(f"{BASE}/data?add=clients",headers=H).json()["clients"] for c in clients: requests.post(f"{BASE}/data",headers={**H,"Content-Type":"application/json"},json={"client_id":c["client_id"],"sent":False,"checkboxes":{}}) reset = requests.get(f"{BASE}/data?add=clients",headers=H).json()["clients"] assert all(not c["sent"] for c in reset)
The response is never the confirmation. The next GET is.
One command. Full snapshot to a local file.
Pulls everything to a local file. Feed it manually into any model or audit a specific period.
curl -H "Authorization: Bearer YOUR_KEY" "https://titanlineco.com/api/data?add=clients,platforms" >> clients.txt
Loads once on login. Writes are immediate. Background refresh only fires when the tab is visible. Snapshot diff, if nothing changed, zero re-render.
Actual response from a live Titanline account. Files and contracts include extracted text ready for AI context.
Subscribe to get your API key from the Settings panel.