Overview
Describe the feed you want in prose, answer Composer's questions, approve the result.
The Composer API turns a plain-English description of a dataset into a running feed. You post what you want, the Composer researches the source and drafts a schema, and it stops to ask you things along the way — those stops are called gates. Approve the last one and the feed is published on a schedule.
Base URL
https://feedbuilder.usestring.aiOne host serves every organization, and your API key is what says which one you are. Every route is under /v1, and
every route under /v1 needs a key. The two documentation routes — GET /openapi.yaml and GET /docs — take no
key, so you can evaluate the contract before you have one.
The shape of a build
Start it. POST /v1/builds with your request in prose. You get a build id back immediately; the build runs
asynchronously.
Watch it. Subscribe to GET /v1/builds/{id}/events for server-sent events, or poll GET /v1/builds/{id}.
Answer its gates. When status is awaiting_input, the build is parked on pending_gate. Answer with
POST /v1/builds/{id}/gates/{gate_id} and it continues.
Approve publication. The last gate is usually publish_review. Approving it is what opens the pull request
and registers the delivery subscription — it is the step that makes the data reachable.
Your first build
curl -X POST "https://feedbuilder.usestring.ai/v1/builds" \
-H "Authorization: Bearer $STRING_FEED_BUILDER_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "a feed of laptop listings from example.com, with price, title and URL"
}'{ "object": "build", "id": "9f3c0b2e-7a41-4d6a-b0c5-1e8f2d4a7c31" }The Location response header carries the build's path — /v1/builds/9f3c0b2e-7a41-4d6a-b0c5-1e8f2d4a7c31 —
rather than an absolute URL.
See Walkthrough for one real build start to finish, with the actual requests and responses.
Endpoints
| Method | Path | What |
|---|---|---|
POST | /v1/builds | Start a build |
GET | /v1/builds | List your builds |
GET | /v1/builds/{id} | Get one build |
PATCH | /v1/builds/{id} | Set auto-proceed |
DELETE | /v1/builds/{id} | Soft-delete a build |
POST | /v1/builds/{id}/cancel | Cancel a build |
GET | /v1/builds/{id}/events | Stream progress |
POST | /v1/builds/{id}/gates/{gate_id} | Answer a gate |
POST | /v1/builds/{id}/messages | Send a message |
GET | /v1/builds/{id}/sample | Get sample rows |
Generating a client
GET /openapi.yaml serves an OpenAPI 3.1 document generated from the service's own types, so it describes the binary
that answered you. Point any generator at it:
npx @openapitools/openapi-generator-cli generate \
-i "https://feedbuilder.usestring.ai/openapi.yaml" -g typescript-fetch -o ./feedbuilder-clientOne endpoint your generated client will not handle
GET /v1/builds/{id}/events is a long-lived text/event-stream, which OpenAPI cannot describe. Use your
language's SSE client for that one endpoint and the generated client for the other nine — see
Streaming.