String API
Composer API

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.ai

One 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

Start a 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"
  }'
201 Created
{ "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

MethodPathWhat
POST/v1/buildsStart a build
GET/v1/buildsList 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}/cancelCancel a build
GET/v1/builds/{id}/eventsStream progress
POST/v1/builds/{id}/gates/{gate_id}Answer a gate
POST/v1/builds/{id}/messagesSend a message
GET/v1/builds/{id}/sampleGet 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-client

One 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.