Concepts
Noonmark receives Submissions through a POST and shows everything in the Studio. You host nothing here — the screen is yours, the URL is ours.
The five terms
The interface and the API use the same words, always with the same meaning. Worth reading once.
| Term | Meaning |
|---|---|
| Workspace | Owns the Forms and reads their Submissions. |
| Role | Every member of a Workspace is an owner or a member. Owners invite, remove, change roles and can delete the Workspace. |
| Invite | A pending offer for an email address to join a Workspace with a Role. Not to be confused with a survey's Email invitations. |
| Form | An ingest surface. It has an API key, a kind and an ordered list of Fields. |
| Field | A named slot on a Form. The key is the JSON property; the label is what appears in the Studio. |
| Submission | One JSON payload received by a Form, plus origin, user-agent and received time. |
| Studio | The interface where a Workspace creates Forms and reads Submissions. |
Getting started
Create a Form in the Studio. It comes with an API key frm_… and a URL to
POST to. Public survey Forms also speak WebMCP — see WebMCP.
import { Noonmark } from "@noonmark/sdk";
const noonmark = new Noonmark({ apiKey: "frm_..." });
await noonmark.submit({
email: "ana@acme.com",
message: "The button disappears on mobile",
rating: 4,
});You get a 201 with { "ok": true, "id": "…" }. The Submission appears in the Studio
straight away.
The two kinds
The kind decides who builds the screen, and it never changes after creation.
feedback — your code builds the screen
You already know what to send. The Fields exist to validate the payload.
survey — Noonmark builds the screen
Your code reads the Fields with noonmark.form() and renders them. It gets a
public page.
A survey Form also accepts a direct POST. The kind never closes ingest — it only
decides whether Noonmark knows how to draw the screen. The public page registers
WebMCP tools.
What did you think of this content?