https://feedbackloop.page. Find the public project ID in Release notes → Add to app. Publish notes before testing; project IDs are public identifiers, not access keys.
List published releases
limit, offset, sorting or authentication parameter.
Only active published notes in an available project are returned. Drafts, unpublished/deleted notes, removed projects and unavailable parent ownership do not become public through this endpoint. A valid project with no notes returns
200 with items: [] and nextCursor: null.
Current server responses always include excerpt and previewImageSource. They are optional in the SDK’s Release type so older responses and saved copies remain readable. When absent, a compact preview can show the title and article link without an excerpt or image. Selected images must still occur in the saved Markdown; removing the selected image clears its preview or falls back to the first remaining image.
Render excerpts as text, not HTML. Pass a preview source through the same managed/external image policy as document images. Never treat the source as a pre-signed or executable URL; a failed image should leave the text and article link available.
The TypeScript Release and ReleasePage types are also exported from @feedbackloop/react. They describe the wire contract; a type annotation does not validate untrusted JSON. The package root does not export its internal fetch/parser helpers.
Continue history
Pass the previousnextCursor through URLSearchParams without inspecting or modifying it:
nextCursor is null. Do not use semantic version as a history cursor, and do not assume a cursor is a permanent snapshot while owners publish or edit notes. Treat it as scoped to this project’s history request. A supplied cursor must be nonempty and at most 4096 characters; invalid cursors return 400.
Select an exact app version
version must be a complete valid SemVer, at most 256 characters. Ranges such as ^1.2.3, partial versions, empty values and the word latest are invalid. Accepted input is normalized; prerelease and build metadata are preserved. Build metadata is part of exact identity: 1.2.3+desktop.7 does not select 1.2.3+desktop.8.
An exact request returns zero or one item and always nextCursor: null. A valid version with no published match returns 200 with an empty array, not a different release or an unavailable-project error.
version with cursor. Unknown list query parameters, repeated selection parameters and simultaneous version/cursor values return 400. Use URLSearchParams so the + in build metadata is encoded as %2B, rather than decoded as a space.
Status and delivery contract
Errors use a safe JSON message such as
{"message":"Invalid release selection."}. Use the HTTP status for control flow rather than matching message text. Cancellation, connectivity errors and invalid response bodies are separate client failures. Avoid tight retry loops and do not cache failures as permanent missing releases.
Responses carry Cache-Control: no-store, Access-Control-Allow-Origin: * and Access-Control-Allow-Methods: GET, OPTIONS. This is noncredentialed CORS: send no cookies, bearer token or custom owner headers, and use credentials: 'omit'. No Access-Control-Allow-Credentials is provided. Browser and native WebView origins can read the same public content. The API does not need a customer-specific Convex client.
Managed and external images
Markdown may contain./images/<id>, where <id> contains only letters, digits, _ or -. Resolve that exact relative shape through the owning release:
404.
Set the image element’s src to the release-scoped endpoint and let the browser follow the 302. Do not store its signed Location as a durable image URL or expose private storage credentials. Previously issued signed URLs can remain valid until their normal expiry after a note changes. no-store does not recall a URL already issued.
External Markdown images should allow only explicit HTTP(S) URLs without embedded credentials. Do not resolve arbitrary relative paths against your app origin. With a CSP, img-src must allow the API origin and the actual final storage/CDN or external image origins; connect-src needs the API origin for release JSON.
Render and cache safely
Treat every document field as untrusted content. For a minimal safe text display, use DOM text nodes rather than HTML insertion:rel="noopener noreferrer" when opening a new tab. Apply the image policy above after sanitization. Never pass API Markdown straight to innerHTML or an equivalent unsafe HTML prop.
If you add offline storage, label saved content, bound its size and lifetime, isolate by project and exact version, and revalidate before claiming current publication. Clear affected entries on authoritative unavailability. A cached exact document must not acknowledge an installed app version as freshly published; app-owned update and persistence policy remains separate from this API.