The Research API runs a five-stage pipeline — interpret, search, judge, analyze, synthesize — and returns results via cursor-resumable NDJSON streams. You can start a standalone research job and optionally attach it to a project, or useDocumentation Index
Fetch the complete documentation index at: https://docs.manticscore.com/llms.txt
Use this file to discover all available pages before exploring further.
POST /projects/research to do both atomically. Every POST /research call returns immediately; the pipeline runs in the background and you consume progress through the events endpoint.
Start research
The product idea or question to research. Maximum 5,000 characters.
UUID of an existing project to attach the research to. Pass
null to create unattached research.Pipeline mode. Use
market for a full competitive landscape analysis. Use feature to focus on feature analysis — this automatically chains into feature deep research on the top 5 features after the market research completes.The rate limit is 10 requests per minute. If you’re rate-limited with a valid session token, ManticScore queues the request automatically (up to 5 per user) and retries it when capacity is available — you don’t need to retry manually.
- 202 — queued
- 200 — cache hit
- 200 — idempotency replay
GET /research/{job_id}/events.Stream research events
Subscribe to the live NDJSON stream for a research job. The cursor parameter lets you resume from any point — the server replays all events since that sequence number before switching to live delivery.Sequence number to resume from. Use
0 to start from the beginning.{"v": 1, "event": "<type>", "data": {...}}. The event types are:
| Event | Description |
|---|---|
stream_start | Connection confirmed. Contains request_id and job_id. |
stage | A pipeline stage started, completed, or failed. See stage names below. |
progress | Free-text progress message within a stage. |
retry | A stage is being retried. Contains attempt number and source. |
result | Research completed. Contains the full research artifact. |
error | A fatal error occurred. Contains message, code, and retryable. |
done | Stream is closed. Always the last event. |
interpret, search, judge, analyze, synthesize, persist.
The
judge stage runs between search and analyze when retrieval quality scoring is enabled. It is non-blocking — if it fails, the pipeline continues to analyze regardless.Auto-seeded build graph on completion. When research finishes with a quality score of
70 or higher and the attached project has no existing build graph, the server automatically creates a draft build graph seeded with the top 5 features from the research. The graph is created with status: "ready" and source: "research_auto_seeded" and emits its events on the build channel. Lower-quality research (< 70) and projects that already have a graph are skipped — you can still create one manually via POST /build-graphs. This is a fire-and-forget hook; if it fails the research result is not affected.Get research status
Returns the current status and the last event sequence number without opening a stream.200 response
One of
queued, running, completed, failed.Use this as the
cursor value when reconnecting to the events stream to avoid replaying events you’ve already processed.Present only when
status is failed. Contains code, message, and retryable.Common research error codes:EMPTY_OUTPUT— The pipeline ran end-to-end, gathered no supporting evidence, and produced zero incumbents, zero emerging players, and zero features. This typically means the submitted idea was a meta-description, gibberish, or too narrow to research. Returned withretryable: false— re-running the same input will produce the same result. Surface themessageto the user and prompt them to submit a more specific product idea.MODEL_EMPTY_DESPITE_EVIDENCE— The pipeline collected supporting evidence but the model still returned zero incumbents, zero emerging players, and zero features (and a strict-mode retry also returned empty). This is distinct fromEMPTY_OUTPUT: the input was researchable, but the model failed to extract structured competitors from the source material. Returned withretryable: false. Surface themessageand suggest the user rephrase the idea as a specific product or feature.EMPTY_INPUT— The submitted idea was rejected before the pipeline ran (for example, missing or whitespace-only body text). Returned withretryable: false.
EMPTY_OUTPUT and MODEL_EMPTY_DESPITE_EVIDENCE errors include an evidence_count field on the error payload reporting how many sources the pipeline gathered before the analyze stage failed.List queued retries
Returns the authenticated user’s pending DLQ rows — research requests that hit the rate limit and were captured for later replay. iOS surfaces this list as “you have N queued retries”. Items expire silently after 24 hours. Rate limit: 30 requests per minute.200 response
Number of pending entries returned. Capped to entries created within the last 24 hours.
Pending items are replayed automatically when capacity frees up — this endpoint is read-only and exists so clients can show a “queued retries” badge to the user.
Attach research to a project
Associates an existing research job with a project. Useful if you started research without aproject_id and want to link it after the fact.
UUID of the project to attach this research job to.
200 response
Diff research versions
Compare the current research version against the previous one to see what changed between runs.200 response
{"diff_available": false, "reason": "No previous version to compare against"}.
Remix: get adjacent ideas
Generates three pivot ideas related to the completed research. Each suggestion includes a rationale and an explanation of how it differentiates from the original idea.200 response
Control visibility (reuse scope)
Set whether your research can be used as a cache source for other users.user means only you can reuse it; public makes it available to the global cache.
Update one job
Either
user (private) or public.Update all completed research at once
200 response
Share research publicly
Creates a public share link for a completed research job. The link is served as an App Clip page atmanticscore.com/clip/research-....
200 response
400 if the research is not yet completed.
Read shared research (public)
Anyone with the share token can read the research without authentication.Accept: application/json to get the JSON response.
Revoke a share link
200 response
Analyze a competitor feature
Reverse-engineers a specific feature from a named competitor. Returns a structured analysis covering UX flow, technical approach, implementation challenges, open-source alternatives, and a build estimate. Rate limit: 5 requests per minute.The competitor’s name. Maximum 200 characters.
The feature to analyze. Maximum 500 characters.
Additional context about your own product or constraints. Maximum 2,000 characters.
Optional project UUID to scope the analysis.
Export to PDF
Downloads a completed research job as a binary PDF file. The export is rendered from the same job artifacts shown in the app — interpretation, incumbents, emerging players, features, white spaces, and signals — and is scoped to the authenticated user. If WeasyPrint is unavailable on the server, the endpoint falls back to a plain-text export.Export format. Currently only
pdf is supported.Content-Type: application/pdf and a Content-Disposition: attachment header naming the file <idea>-research.pdf. The PDF includes the research title, creation timestamp, and a Quality: <score>/100 badge when a quality score is available.
| Status | Meaning |
|---|---|
200 | PDF (or text/plain fallback) returned. |
404 | Research job not found, owned by another user, or not in completed status. |
422 | Unsupported format value. |