Appearance
API reference
What a product's client calls: an anonymous identity the service makes, reports and their answers (live), a contact only if the user gives one, moving the identity to another device, and the user's own data. Every request carries the product's key (X-Alias-Key); all but three carry the user too (X-Alias-User, X-Alias-Secret, as POST /v1/identity or a transfer gave them).
Errors are {"error": "…"} with a status: 400 (what's wrong, in words), 401 (no such key, id or secret), 403 (blocked, or a browser origin the product doesn't allow), 404, 409, 413, 429 (a limit: try later), 5xx. The clients follow this description: the same calls and names in each.
Headers. Every request carries the product's key, X-Alias-Key. Calls marked user also carry the user's X-Alias-User and X-Alias-Secret.
Operations
getProduct
GET /v1/product · key only
The product's public settings (for the client's UI).
Answers:
newIdentity
POST /v1/identity · key only
A new anonymous identity, made by the service (or a new secret for an id support reset).
Limited to 20 an hour per address per product.
Body (optional): object
| Field | Type | |
|---|---|---|
id (optional) | string | An id whose secrets support reset. |
Answers:
claimTransfer
POST /v1/transfer/claim · key only
This device gets the identity a transfer code names, with a secret of its own.
10 tries an hour per address per product; a code ends after 5 wrong tries, or 10 minutes.
Body: object
| Field | Type | |
|---|---|---|
code | string |
Answers:
me
GET /v1/me · user
The id and secret are good; the id's devices and contact.
Answers:
eraseMe
DELETE /v1/me · user
Erase the id and everything of it (reports, screenshots, contact), for good.
Answers:
200Erased: objecterased: stringtickets: integer
- otherwise an Error
myData
GET /v1/me/data · user
A copy of everything kept about the id, as JSON (screenshots base64).
Answers:
200The copy: object- otherwise an Error
getContact
GET /v1/me/contact · user
The contact given (null none), and the product's policy.
Answers:
200The state: ContactState- otherwise an Error
setContact
PUT /v1/me/contact · user
Give (or change) a contact, if the product takes one (else 409).
Body: object
| Field | Type | |
|---|---|---|
kind | email, other | |
value | string | up to 254 characters |
Answers:
200Given: ContactState- otherwise an Error
withdrawContact
DELETE /v1/me/contact · user
Withdraw the contact (deleted at once).
Answers:
200Gone: ContactState- otherwise an Error
newTransfer
POST /v1/me/transfer · user
A code to type on another device within 10 minutes.
Answers:
tickets
GET /v1/tickets · user
The user's tickets, newest first (50), without their threads.
Answers:
report
POST /v1/tickets · user
Send a report.
Body: Report
Answers:
ticket
GET /v1/tickets/{id} · user
One ticket, with its thread.
| Parameter | In | Type | |
|---|---|---|---|
id | path | integer (int64) |
Answers:
reply
POST /v1/tickets/{id}/comments · user
Reply (a ticket waiting on the user, or resolved, opens again; a closed one is 409).
| Parameter | In | Type | |
|---|---|---|---|
id | path | integer (int64) |
Body: Reply
Answers:
updates
GET /v1/updates · user
The tickets support answered or changed since a time (polling).
| Parameter | In | Type | |
|---|---|---|---|
since | query | string (date-time) | The last answer's now; none: everything support ever touched. |
Answers:
200Updates, and the time to ask from next: objectupdates: array of Updatenow: string (date-time)
- otherwise an Error
events
GET /v1/events · user
The same, pushed (Server-Sent Events) while open.
event: answer with an Update as data, and a comment line every 25 s. At most 3 streams per user. A client that can't send headers on a stream (a browser's EventSource) polls /v1/updates instead.
Answers:
200The stream: string- otherwise an Error
Objects
Error
| Field | Type | |
|---|---|---|
error | string |
Identity
| Field | Type | |
|---|---|---|
id | string | A UUID v7.; e.g. 01a1a2b3-9cdf-71e1-b2d5-91d78e28a35a |
secret | string | Shown this once: keep it (only its hash is kept here).; pattern ^[0-9a-f]{64}$ |
Field
| Field | Type | |
|---|---|---|
name | string | |
label (optional) | string | |
type | text, number, bool, geo, link, json | |
template (optional) | string | A link's: {field} replaced by that field's value. |
Product
| Field | Type | |
|---|---|---|
id | string | |
name | string | |
privacy_url (optional) | string | |
branding (optional) | object | |
fields | array of Field | What a report's context may carry; the rest is dropped. |
contact | off, optional | |
contact_kinds | array of email, other | |
keeping | object |
Me
| Field | Type | |
|---|---|---|
id | string | |
created_at | string (date-time) | |
devices | integer | Devices holding a secret for this id. |
contact (optional) | Contact or null |
Contact
| Field | Type | |
|---|---|---|
kind | email, other | |
value | string | |
given_at | string (date-time) |
ContactState
| Field | Type | |
|---|---|---|
contact | Contact or null | |
policy (optional) | off, optional | |
kinds (optional) | array of string |
Report
| Field | Type | |
|---|---|---|
note | string | up to 4000 characters |
screenshot (optional) | string | A JPEG, up to 3 MB. |
context (optional) | object | The product's fields (GET /v1/product). |
app_version (optional) | string | up to 40 characters |
telemetry (optional) | object | Free JSON up to the product's size, matching its schema if it has one (else 400, saying where). |
Reply
| Field | Type | |
|---|---|---|
body | string | up to 4000 characters |
screenshot (optional) | string | |
context (optional) | object | |
telemetry (optional) | object |
Entry
| Field | Type | |
|---|---|---|
id | integer (int64) | |
author | user, support | |
name (optional) | string | A support person's name. |
kind | comment, status | status: body is the new status. |
body | string | |
created_at | string (date-time) | |
context (optional) | object | |
has_screenshot (optional) | boolean |
Status
open, in_progress, waiting, resolved, closed
Ticket
| Field | Type | |
|---|---|---|
id | integer (int64) | |
product | string | |
status | Status | |
note | string | |
context (optional) | object | |
app_version | string | |
has_screenshot | boolean | |
created_at | string (date-time) | |
updated_at | string (date-time) | |
support_at (optional) | string (date-time) | Support's last answer or status change. |
thread (optional) | array of Entry |
Update
| Field | Type | |
|---|---|---|
kind | answer | |
ticket | integer (int64) | |
status | Status | |
at | string (date-time) |
Transfer
| Field | Type | |
|---|---|---|
code | string | Typed on the other device (any case; O, I, L read as 0, 1, 1).; pattern ^[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$ |
expires_at | string (date-time) |