Public API
Developer keys to read and write your forms and responses from your own software.
Read and change your forms and responses from your own software with a developer key: sync responses to a spreadsheet or CRM, create forms from your system, or add responses that come in elsewhere.
Make a key
In Settings → Developers (owners and admins), name the key after what will use it and pick its scope:
| Scope | Can |
|---|---|
| Read | List forms, read a form, read responses. |
| Read and write | Also create, change, publish and delete forms, and add or delete responses. |
The key (it starts with mk_) is shown once: copy it then. The list shows each key's first
characters, who made it and when it was last used. Revoke a key you no longer use or that
may have leaked. A key acts as the person who made it, never above its scope, and stops working
if they leave the workspace.

Calling the API
Send the key as a bearer token to https://app.mikxx.com/api/v1:
curl https://app.mikxx.com/api/v1/forms \
-H "Authorization: Bearer mk_your_key"
Bodies are JSON. Each key can make 120 calls a minute; past that the answer is 429.
| Method | Path | Does |
|---|---|---|
GET | /api/v1/forms | Your forms, most recently edited first. |
POST | /api/v1/forms | Make a draft form: {"name": "Leads"}. |
GET | /api/v1/forms/{id} | One form: its questions (steps), display and theme, and its version. |
PATCH | /api/v1/forms/{id} | Change it. Send the version you read and only what changes (name, steps, theme, status). "status": "active" publishes. |
DELETE | /api/v1/forms/{id} | Delete the form and its responses. |
GET | /api/v1/forms/{id}/responses | Responses, newest first: {"items": [...], "next": …}. |
POST | /api/v1/forms/{id}/responses | Add a response: {"data": {"question-id": "answer"}}. |
GET | /api/v1/forms/{id}/responses/{response_id} | One response. |
DELETE | /api/v1/forms/{id}/responses/{response_id} | Delete a response. |
Responses, a page at a time
GET …/responses returns up to 100 (?limit= for fewer). When there are more, pass next
back as ?before= for the next page. To pick up only new ones, pass the newest created_at
you have as ?since=. Each response has its id, created_at, status, paid_at and data:
answers keyed by question id, the ids in the form's steps.
Adding a response
The form must be live. Answers are checked like ones sent from the form (required questions,
choices, ranges, logic and calculations); problems come back as 422 with
{"errors": {"question-id": "what's wrong"}}. Automations run as for any response. No payment
is taken for responses added this way.
Changing a form
A PATCH goes through the same checks as the builder. If the form changed since you read it,
the answer is 409 with the current form: read its version and try again.
Errors
| Code | Means |
|---|---|
401 | No key, a wrong one, or it was revoked. |
403 | A read key tried to change something. |
404 | Not in your workspace. |
409 | The form changed since you read it. |
422 | Answers that don't check out. |
429 | Too many calls this minute. |