Feedback API

Let your customers send bug reports and feature requests to a Planora board, from your own website or app.

Overview

Every board has its own intake key, which starts with pk_. Find it, and ready-to-paste snippets with your key filled in, under Settings → Feedback intake. Only Owners and Admins can see it.

The key is public: it can go in your website’s code. All it can do is file feedback on that one board, and nothing becomes a card until an Owner or Admin approves it under Feedback, unless the board approves automatically. If a key is abused, regenerate it: the old one stops working at once.

Add the widget

The quickest way. Paste one line before </body> and a Feedback button appears in the corner of every page. Copy it from Settings to get your Planora address and key:

<script src="https://your-planora-address/widget.js" data-key="pk_your_key" async></script>

Change how it looks and behaves with these attributes, all optional:

data-label
The button’s text. Default “Feedback”.
data-color
The button’s background, any CSS color. Default dark gray.
data-position
bottom-left to move the button left. Default bottom right.
data-theme
light or dark. Default follows the visitor’s system.
data-name
Your signed-in user’s name, so they do not have to type it.
data-email
Your signed-in user’s email, likewise.
data-mode
inline to show the form in your page instead of behind a button.
data-target
With inline: a CSS selector for the element to put the form in.

To open the form from your own button or menu, call window.Planora.open(). close() and toggle() work too.

Send it from your code

For your own form, or a server, send a POST to your board’s endpoint. There is no sign-in: the key in the address is all it needs, and browsers on any domain may call it.

POST https://api.swiftlyph.online/api/v1/intake/pk_your_key/feedback
type
Required. bug or feature.
title
Required. Up to 255 characters.
description
Up to 5,000 characters. Becomes the card’s description.
reporter_name
Up to 120 characters. Shown on the card as “Reported by”.
reporter_email
A contact address, shown to whoever reviews it. Planora never emails it.
screenshots[]
Up to five PNG, JPG or WebP images of up to 5 MB each. Send as multipart form data.

With JSON, from a terminal or a server:

curl -X POST 'https://api.swiftlyph.online/api/v1/intake/pk_your_key/feedback' \
  -H 'Content-Type: application/json' \
  -d '{"type":"bug","title":"Checkout button does nothing","description":"Safari 17, nothing happens when I click Pay."}'

With screenshots, from the browser:

const body = new FormData()
body.append('type', 'bug')
body.append('title', 'Checkout button does nothing')
body.append('screenshots[]', file) // a File from an <input type="file">

await fetch('https://api.swiftlyph.online/api/v1/intake/pk_your_key/feedback', { method: 'POST', body })

Leave Content-Type out when sending FormData: the browser sets it, with the boundary the upload needs.

Responses

201 Created means it arrived. The reply says nothing about your board, only the report’s id and where it stands:

{ "data": { "id": 42, "status": "pending" } }

status is pending while it waits for review, or approved if the board approves automatically and it is already a card.

404 Not Found
The key is wrong, or was regenerated. Get the current one from Settings.
422 Unprocessable
A field failed a rule above. The reply’s errors object names each field and why.
429 Too Many Requests
Over the rate limit. Wait the number of seconds in the Retry-After header.

Rate limits

Each board’s key accepts 60 reports a minute, and each visitor’s address 10 a minute.

If your reports go through your own server first, every visitor shares your server’s address and so its limit. Send from the visitor’s browser, or with the widget, to avoid that.