Capability · ETL & search

Ingest, index and search, without a vector DB.

Turn URLs, HTML and text into a searchable vector store, and run live web and deep-research search — a stateless white-label of Twin Browser, billed straight through with no markup.

POST /v1/etl · /v1/etl/query · /v1/search

What you get

Built for regulated workloads

ETL and search are a curated, stateless proxy over Twin Browser’s browser-execution API. POST sources to /v1/etl and the upstream extracts, transforms, chunks, embeds and stores them; query them back with /v1/etl/query — no vector database to run. /v1/search adds live web search, and depth:"deep" runs an async research pass you poll at /v1/jobs/{token}. phi-cloud holds no state: the vector store, collections and jobs all live upstream, isolated per customer and billed exactly at the upstream’s rate.

Pipeline

Extract → embed → store

One POST to /v1/etl runs a browser-grade extract, transform, chunk, embed and store over your urls, html or text. Nothing to host — the pipeline and vector store live upstream; you get back a collection you can query.
Retrieval

Semantic query

/v1/etl/query returns the best-matching chunks from your collection with scores — a RAG index without standing up or scaling a vector DB yourself.
Search

Web + deep research

/v1/search returns live web results synchronously; depth:"deep" kicks off an asynchronous research run that you poll at /v1/jobs/{token} until it settles.
Isolation

Per-customer namespace

Every customer’s content is namespaced to its own collection, derived server-side from your API key (never the request body) — a query can only ever reach your own rows. Async jobs return a customer-bound token, not a raw upstream id.
Billing

Pass-through pricing

You pay exactly what the upstream charges, converted credits→USD (1 USD = 1000 credits) with no phi-cloud markup. Async jobs settle once, on the first terminal poll.
PHI

General traffic only

Twin Browser is not a PHI-eligible host, so an X-PHI:true request returns phi_blocked. Paid keys only — ETL and search are off the free test tier so evaluators can’t spend the shared balance.

Availability & pricing

Where it runs, what it costs

Every route is region-resident and the PHI gate is enforced per call. Prices include the flat +10% gateway margin and mirror the live /v1/pricing rate card.

RegionProviderModelTierPrice
AllTwin BrowserETL ingest · /v1/etlGeneralPass-through
AllTwin BrowserETL query · /v1/etl/queryGeneralPass-through
AllTwin BrowserWeb search · /v1/searchGeneralPass-through
AllTwin BrowserDeep research · /v1/search (async)GeneralPass-through
AnyETL / search (PHI)No routephi_blocked

Billed pass-through — you pay exactly the upstream’s reported credits, converted at 1 USD = 1000 credits with no phi-cloud markup. General traffic only, and paid keys only (not the free test tier).

Try it

A real call, end to end

Ingest a few sources, then query them semantically — no vector DB to run. Everything is scoped to your own collection.

curl
# 1 — ingest sources into a collection
curl https://phi-cloud.com/api/v1/etl \
  -H "Authorization: Bearer $PHI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "sources": ["https://example.com/handbook"], "collection": "handbook" }'

# 2 — semantic query over that collection
curl https://phi-cloud.com/api/v1/etl/query \
  -H "Authorization: Bearer $PHI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "what is the refund window?", "collection": "handbook" }'
response
x-phi-routed: etl-query/EU/non_phi
x-phi-upstream: twin-browser
x-phi-cost-micro: 4000
{ "matches": [{ "text": "Refunds within 30 days...", "score": 0.82 }],
  "collection": "handbook" }

Statelessness & isolation

  • phi-cloud is a stateless proxy — the vector store, collections and job state all live in Twin Browser, not here. Nothing about your content is persisted by the gateway.
  • Every customer shares one upstream tenant, isolated by a per-customer collection namespace derived from your API key (never the request body), so a query can only reach your own content.
  • Async deep-search jobs return an HMAC token bound to your customer id; /v1/jobs/{token} only un-wraps it for the same customer, so job ids can’t be guessed across tenants.
  • General traffic only: Twin Browser is not PHI-eligible, so X-PHI:true returns phi_blocked. Paid keys only — the free test tier is off.
Good to know
  • · Deep search is asynchronous — /v1/search with depth:"deep" returns a job token to poll at /v1/jobs/{token}; shallow search is synchronous.
  • · The captcha-solving and agentic-automation surface (run, live, skills, monitors) is intentionally not exposed — off-posture for a compliance product.

FAQ

Common questions

In Twin Browser, the upstream that runs the pipeline and hosts the vector store. phi-cloud is a stateless proxy — it authenticates your key, namespaces your collection, forwards with our server key and bills pass-through. It holds no vector store, no collection list and no job table.
No. Every customer’s collection is namespaced server-side from your API key identity, never from the request body, so a query is scoped to your namespace and can’t reach another tenant’s rows. Async jobs return a customer-bound token, not the raw upstream job id.
No. Twin Browser is not a PHI-eligible host, so any X-PHI:true request returns phi_blocked — use ETL and search for general content only. It is also paid-keys only; the free test tier is disabled so evaluators can’t spend the shared balance.
Pass-through. You pay exactly the credits Twin Browser reports for the call, converted to USD at 1 USD = 1000 credits with no phi-cloud markup. Async jobs settle once, on the first terminal poll.

Ready when you are

Put etl & search in production — without giving up your data.

Spin up a key in minutes. The residency and PHI posture above arrives unchanged.

Free to test · Prepaid credits, no subscription · No data retained