Skip to main content
The Products API is the typed surface iOS uses for card-first idea capture and review. POST /ideas returns a ProductCard in 3-5 seconds after a fast interpretation pass — the full research pipeline continues asynchronously. GET /products/{card_id} returns the ProductDetail payload including the live state, checkpoints, the synthesized artifact, and the top-20 evidence rows with provenance metadata so clients can render source links and freshness badges next to claims.
These endpoints coexist with the legacy POST /research and GET /research/{id}/status flow described in the Research API. The card-first endpoints return strongly typed shapes; the legacy endpoints remain for backward compatibility.

Create an idea

Submits a raw idea, runs a fast interpretation cascade (Sonnet, ~3-5s), and returns a ProductCard immediately. Full research is dispatched in the background. Every card returned from this endpoint is guaranteed to have a non-null project_id — the server auto-bridges a project row in the same transaction, and falls back through a defense-in-depth path inside the card-creation chokepoint if the primary bridge fails. Use project_id directly to navigate via GET /projects/{id}. The call is idempotent per user on the semantic content of the idea: re-submitting the same idea reuses the existing project rather than creating a duplicate. If both bridge paths fail, the request fails loudly with 500 BRIDGE_INVARIANT_VIOLATED rather than returning a card the client can’t navigate to. See Errors for the response shape. Rate limit: 20 requests per minute.
string
required
The product idea or question. Between 4 and 8,000 characters.
202 response
Subscribe to research progress through GET /research/{job_id}/events using the returned research_job_id.

ProductCard fields

string
required
Product card UUID.
string
required
UUID of the research job dispatched for this card. Use it to subscribe to streaming events.
string
UUID of the project row linked to the card. Use it to fetch the project via GET /projects/{id}.Cards returned from POST /ideas always have a non-null project_id — the server fails the request with 500 BRIDGE_INVARIANT_VIOLATED rather than ship a card without one.Cards returned from GET /products and GET /products/{id} may rarely be null if they were created before the project bridge shipped. These pre-bridge cards self-heal: the next time the card is accessed through the card-creation chokepoint (for example, when an existing research job is reattached), the server auto-bridges a project and updates the card row in place. As a defensive fallback, clients can render the card via GET /products/{id} while waiting for the heal to propagate.
string
required
Short title generated from the idea.
string
Suggested product name.
string
One-line summary of the idea.
string
Auto-assigned product category (for example, fintech, devtools).
string
required
Lifecycle state: researching, completed, or failed.
number
Pipeline progress, 0–100.
string
Key of the most recent pipeline checkpoint (for example, interpret, search, analyze, synthesize).
string
required
ISO 8601 timestamp the card was created.
string
required
ISO 8601 timestamp the card was last updated.

List products

Returns the authenticated user’s product cards, most-recently-updated first. Reading this list automatically records a list_viewed behavioral event server-side — clients don’t need to instrument it. Rate limit: 60 requests per minute.
number
default:"20"
Page size. Between 1 and 100.
number
default:"0"
Number of rows to skip. Use with limit for pagination.
Returns a JSON array of ProductCard objects, ordered by updated_at descending.

Get a product

Returns the full ProductDetail for a card the authenticated user owns: the card metadata, the original idea interpretation, classification, checkpoints, the synthesized research artifact (when available), and the top-20 evidence rows. Reading the detail records a detail_opened behavioral event server-side. Rate limit: 60 requests per minute.
string
required
Product card UUID.
200 response

Response fields

string
required
Product card UUID. Same as card.id.
object
required
Card metadata. See ProductCard shape returned by POST /ideas above.
object
required
Structured interpretation of the user’s raw idea. Includes raw_input, normalized_idea, target_user, problem_statement, and proposed_solution.
object
required
Auto-assigned category, subcategory, market_type, and confidence (0-1) for the idea.
array
required
Pipeline checkpoints with status and timing. Each checkpoint has id, job_id, key, title, status, summary, started_at, completed_at.
object
The synthesized ResearchArtifact once research has completed. null while research is still running. Contains the market summary, competitors, recommendation, and renderable UI sections.
array
required
Top-20 evidence rows backing the artifact. Sorted by confidence descending, then freshness_score descending, then fetched_at descending. Clients render these as source-link badges next to competitors and market signals.Evidence rows are populated by the live research pipeline as the analyze stage completes — newly-finished cards return their sources alongside the artifact. Empty arrays mean the job hasn’t reached the analyze stage yet (subscribe to research events) or completed with no attributed sources.

Record a behavioral event

Records a behavioral event for outcome-based learning. Most events are auto-recorded server-side by GET /products and GET /products/{id} — call this endpoint only for client-driven signals like card swipes, taps, or shares. Rate limit: 120 requests per minute.
string
required
Event name. Between 1 and 64 characters.Common event names: list_viewed, detail_opened, card_viewed, section_expanded, card_completed, build_started, share_tapped.Sending build_started or share_tapped also reinforces the canonical entities cited in the card’s artifact, surfacing high-converting companies and features earlier in future retrieval. Other event names are recorded but do not feed the outcome loop.
string
Product card UUID, when the event relates to a specific card.
string
Research job UUID, when the event relates to a specific research run.
string
Project UUID, when the event relates to a specific project.
object
default:"{}"
Free-form metadata (numbers, strings, nested objects) to attach to the event.
Returns 204 No Content on success.