v2 · early access open

The COB API.
Retrieval that doesn't miss.

Upload your documents. Ask questions, get answers with page‑exact citations. Two endpoints, one silo, zero infrastructure. The same COB‑2 engine that reads tables, charts, equations and scans, now behind a single key.

query.sh

    
Quickstart

Two calls. That's the whole integration.

One call to upload, one call to ask. COB‑2 handles everything in between: parsing, tables, scans, embeddings, retrieval, citations. You never touch a vector database. pip install cob-farm and go, or speak plain HTTP from any language.

1 Upload documents
upload.sh

        
2 Ask questions
response.json

        

This is the live contract, not a mockup, the full reference covers every route. Answers carry page‑exact citations you can render as links. The end of "trust me."

Endpoints

Everything runs through one tiny surface.

Fully managed and built from proprietary PHOROS tools: Chat runs COB‑2 Deep Search, storage runs on COB‑Index. No components to tune, nothing to operate.

POST /v2/documents

Upload

Stage documents, get presigned uploads, commit the batch. Quoted before ingestion, charged exactly the quote. PDF, DOCX, and PowerPoint accepted.

POST /v2/chat

Query

Point questions here. Every call runs COB‑2 Deep Search, agentic, multi‑minute turns welcome. Answers arrive with page‑exact citations.

COB-INDEX · FULLY MANAGED

The Silo

Where your corpus lives. Omniscient over all visible content, full multimodal and OCR support, not just text, with O(log n) query time as your library grows. No knobs. We run it entirely.

Under the hood

One key. Three state‑of‑the‑art primitives.

Parsing, embeddings and retrieval‑augmented chat, each best‑in‑class, fused into a single managed surface. All content of every document, the fine print in the scans, the totals in the tables, stored, indexed and cited to the exact page.

$ integration is two calls: one where you upload, one where you ask.
Use cases

Document content omniscience, any use case.

COB doesn't assume what you're building. It's the retrieval layer under whatever you build on top; chat is just one option. Here's what the same upload‑and‑query loop looks like in other hands.

Agent memory

Long-term memory for coding agents

Load your specs, design docs, PRDs and runbooks into a silo once. Your agent calls silo.ask() as a tool and gets the real answer with the page it came from, instead of guessing from a stale context window. PDF & DOCX today; Markdown support on the roadmap.

1 silo per project · asks all day
Support

Support bots that stop making things up

Your bot, your LLM, your tone. COB is the tool call in the middle: manuals and help docs uploaded nightly, every customer answer pulled from a real page your agent can show. Fewer escalations, zero invented policies.

nightly sync · continuous queries
Finance

Data rooms, answered overnight

Upload the deal folder, run your fixed list of 300 diligence questions as a script, write the answers into your report. The benchmark COB leads was built from exactly these filings, tables, footnotes and all.

1 upload · 300 queries · 1 report
Compliance

Security questionnaires on autopilot

Every vendor review asks the same 200 questions. Keep your policies and SOC 2 docs in a silo and answer the whole questionnaire programmatically, each answer cited to the exact page an auditor can check.

1 silo · every questionnaire
Construction

Specs & drawings, answered

Retention rates, submittal deadlines, detail callouts buried in sheet scans. The multimodal ingestion your PM software can't build in‑house is two calls away, inside your product.

embedded in your UI
Pipelines

Unstructured in, structured out

For each of 10,000 loan files: ask "what's the stated LTV?" and write the answer to a database column. COB as a pipeline stage, not a product. No humans, no vector database, no prompt archaeology.

10k queries · zero humans

These are examples, not fences. The API doesn't care what you build. It cares that when you ask, the answer is on the page it says it's on.

Pricing

Pay for what you use.

Low, usage‑based rates. No seats, no minimums, no infrastructure line item. You pay for documents uploaded and questions asked. That's it.

Free
$0 /forever

Kick the tires in the sandbox.

  • 1 silo, 50 documents
  • 250 queries / month
  • Page-exact citations included
  • Community support
Start free
Enterprise
Custom, enterprise

Your volume, your terms.

  • Volume pricing & committed use
  • Private deployment options
  • SLAs, SSO, audit logs
  • A human who answers the phone
Talk to us
Benchmarks

The numbers.

0%
FinanceBench, highest published RAG score
0%
of page content made searchable
O(log n)
query time as corpora grow
4
cows currently grazing
Get started

Put COB on your corpus.

Create an account, load credits, create a key. Your first silo is queryable the moment ingestion completes, and you can watch it happen from the console.

Open the console
← back to the farm
console / overview

Welcome back, farmer.

Credit balance
$0.00 of $50 gauge
Uploads are quoted and debited before ingestion. Queries meter per call. When the balance runs out, requests are declined. You are never billed behind your back.

Recent activity

0
Queries · 30d
metered per call
0
Docs uploaded · 30d
quoted before ingest
$0.00
Spent · 30d
from the ledger

Queries, last 14 days

Hover a bar for the day's count.

Silo status

Uploads are rejected while a silo is anything but complete. Watch it flip here.

console / api keys

API keys

Your keys

Keys carry your full balance. Rotate if one leaks, delete what you don't use. The secret is shown exactly once at creation; only a hash is stored, so it can never be displayed again.

NameKeyCreatedLast usedActions
console / silos

Silos

Why uploads get declined

Two mechanical gates run before anything touches the pipeline. Gate 1: the silo's status must read complete. Uploading into a silo mid-ingestion is rejected outright to protect the corpus. Gate 2: the quoted cost of the upload must fit inside your credit balance. Pass both and the upload enters the queue; you'll watch the status walk from ingesting to complete right here.

console / usage

Usage

0
Queries · 30d
metered per call
0
Uploads · 30d
quoted & settled
0
Events · 30d
everything logged

Recent calls

Every request, its silo, and what it drew from the balance.

WhenCallSiloDetailCost
console / billing

Billing & credits

Current balance
$0.00
Prepaid credits are the only way COB bills. A leaked key can drain a balance. It can never generate a surprise invoice.
Account id
········
Your lifetime id. It never changes, and some support and API workflows will ask for it.

Payment method

No card on file
Payment processing arrives with the wiring pass. Top-ups above are simulated.

Transactions

Every credit in and out.

DateDescriptionAmount
cob.farm /docs Console
Reference

The COB API

Everything on this page is the live production contract. Base URL https://api.cob.farm, one bearer token, JSON in and out. If you can make an HTTP request, you can build on COB, and if you use Python, pip install cob-farm makes it three lines.

Authentication

Every request carries your API key as a bearer token. Keys are created in the console; the secret is shown once at creation and only a hash is stored. Keys draw on your account's prepaid credit balance.

Authorization: Bearer cob_sk_live_...

Quickstart

quickstart

      

Uploads are quoted before ingestion and you are charged exactly the quote, never more. If your balance can't cover a batch, the commit returns 402 with the exact shortfall and nothing is charged or ingested.

Endpoints

RouteWhat it does
GET /healthLiveness. No auth. Returns {"ok": true}.
GET /v2/pricingCurrent rates: per-query price and the per-document / page / image / table upload rates. Rates can be fractions of a cent; each file total rounds up to whole cents once. Always authoritative, read it instead of hardcoding prices.
GET /v2/silosList your silos.
POST /v2/silosCreate a silo. Body {"name": "deal-room"}{"silo_id": "silo_..."}. Save the id.
GET /v2/silos/{silo_id}Silo detail with live_status (complete / processing / ingesting / error) and progress (0-1). Poll this after committing an upload.
POST /v2/documentsStage a batch: send filenames, receive presigned S3 upload URLs.
POST /v2/documents/commitQuote the staged batch, charge credits, begin ingestion.
POST /v2/chatAsk a silo a question. Returns a page-cited answer.
GET /v2/silos/{silo_id}/documentsList the documents in a silo (your originals only).
DELETE /v2/silos/{silo_id}/documents/{filename}Remove one document from a silo. The corpus rebuilds; poll until complete.

POST /v2/documents upload files POST /v2/documents/commit

Streams whitespace keepalive bytes while the quote computes (long documents take a while to scan), then one JSON object. Await the full body, do not line-stream; leading whitespace is legal JSON. Failures arrive as {"error": ...} in a 200 body, exactly like chat. Uploading is a three-beat flow. Stage: tell COB the filenames; it returns a batch_id and one presigned S3 POST per file (valid 1 hour, 1 GB/file, 25 files/batch, PDF·DOCX·PPTX). Upload: POST each file's bytes to its presigned URL, a plain multipart form using the returned fields plus your file as file. Commit: COB inspects the staged bytes, quotes the batch (pages, described images, visual pages, table pages, priced per GET /v2/pricing; a visual page is a page carrying a table, a real image, or math content, and tables counts table pages, including scanned pages that likely carry tables), checks your balance, and on success debits the quote and begins ingestion, returning 202.

FieldTypeNotes
silo_idstringTarget silo. Required on stage and commit.
filenamesstring[]Stage only. The names you're about to upload.
batch_idstringCommit only. From the stage response.

Commit responses: 202 {"quoted_cents", "files": [{filename, quoted_cents, pages, images, visual_pages, tables, scanned_pages}]} · 402 {"quoted_cents", "balance_cents", "shortfall_cents", "files"} (nothing charged) · 409 if the silo is mid-ingestion. Then poll GET /v2/silos/{silo_id} until live_status is complete.

POST /v2/chat

Queries run COB‑2 Deep Search, a real agentic process, so turns routinely take one to several minutes on large corpora. The connection stays open the whole time: the response streams keepalive whitespace while the agent works, then delivers one complete JSON object. Leading whitespace is legal JSON, so every standard client (requests, fetch, the SDK, your agent framework) that waits for the body and parses it behaves identically to a normal JSON API. Don't line-stream this endpoint; just await the body.

FieldTypeNotes
silo_idstringSilo to ask. Required.
querystringThe question. Required.
conversation_idstring?Pass a previous response's id for multi-turn context (kept 24h). Omit to start fresh, one is minted for you.

Response: {"answer", "conversation_id", "cost_cents"}. Citations arrive inline in the answer text as [document.pdf, Page N]. Set your HTTP client timeout generously, 900 seconds is safe.

GET /v2/silos/{silo_id}/documents

Lists what's in a silo: your original uploads, nothing else. The pipeline's internal working files never appear here. Response: {"silo_id", "count", "documents": [{"filename", "size_bytes"}]}, sorted by filename. Use the returned filename values verbatim with the DELETE route below.

DELETE /v2/silos/{silo_id}/documents/{filename}

Removes one document and everything derived from it: the file itself, its extracted content, and its vectors all leave the silo, so deleted material can never appear in answers again. The silo walks through processing while the corpus rebuilds; the call returns 202 immediately and you poll GET /v2/silos/{silo_id} until live_status is complete. URL‑encode the filename in the path. One deletion at a time per silo: while one is rebuilding, further deletes (and uploads) return 409, wait for complete between them. Upload credits are not refunded on deletion.

Responses: 202 {"accepted", "silo_id", "filename", "status"} · 404 if the silo or document is not found · 409 if the silo is busy.

Errors

StatusMeaning
400Malformed request, missing field, unsupported file type, or too many files.
401Missing, malformed, or revoked API key.
402Insufficient credits. Body carries quoted_cents / balance_cents / shortfall_cents. Nothing was charged.
404Silo not found or not yours; on deletion, also a document that is not in the silo.
409Silo busy: an ingestion or deletion is in flight. Wait for complete, then retry.
502An upstream stage failed (agent or file manager). Nothing was charged for the failed call; retry.
200 + {"error"}A failure that occurred mid-stream on /v2/chat arrives inside the JSON body. Check for an error key; the Python SDK raises it as an exception automatically.

All error bodies are {"error": "human-readable reason", ...}.

Pricing

Prepaid credits, integer cents, no surprises. Queries are a flat rate per call. Uploads are quoted per batch before ingestion from what's actually inside your files, per document, per page, per image, per detected table, and the commit response itemizes it per file. Current rates always come from GET /v2/pricing; treat that endpoint as the source of truth rather than copying numbers from anywhere, including this page. When the balance can't cover an action, the action doesn't happen, you are never billed behind your back.

Python SDK

pip install cob-farmimport cob. The SDK wraps everything above, including the staged upload dance and the streaming chat handling.

SurfaceDoes
cob.Client(key)Connect. Or set COB_API_KEY and call cob.Client().
client.pricing() / client.silos()Rates · your silos.
client.create_silo(name)Make a new silo → Silo. Save silo.id.
client.get_silo(id)Attach to an existing silo → Silo.
silo.upload(paths, wait=False)Stage + upload + commit in one call → Receipt (.total_cents .files .batch_id).
silo.wait(timeout=None)Block until ingestion completes, printing live progress %. quiet=True to silence.
silo.status / silo.progressLive state, same numbers the console pills show.
silo.ask(q, conversation_id=None)Answer (.text .cost_cents .conversation_id).
silo.documents()List the silo's documents (0.1.3+) → [{"filename", "size_bytes"}].
silo.delete_document(filename)Remove one document (0.1.2+). Returns the silo, so silo.delete_document("old.pdf").wait() blocks until the rebuild completes.
cob.upload(key, silo_id, paths) / cob.ask(key, silo_id, q)Flat one-call tier, no objects.
cob.InsufficientCredits, cob.SiloBusy, ...Typed exceptions; the credits one carries .shortfall_cents.