docs

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.

TermMeaning
WorkspaceOwns the Forms and reads their Submissions.
RoleEvery member of a Workspace is an owner or a member. Owners invite, remove, change roles and can delete the Workspace.
InviteA pending offer for an email address to join a Workspace with a Role. Not to be confused with a survey's Email invitations.
FormAn ingest surface. It has an API key, a kind and an ordered list of Fields.
FieldA named slot on a Form. The key is the JSON property; the label is what appears in the Studio.
SubmissionOne JSON payload received by a Form, plus origin, user-agent and received time.
StudioThe 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.

quickstart.ts
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?

On this page