Skip to content

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

FieldType
id (optional)stringAn 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

FieldType
codestring

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:

  • 200 Erased: object
    • erased: string
    • tickets: integer
  • otherwise an Error

myData ​

GET /v1/me/data · user

A copy of everything kept about the id, as JSON (screenshots base64).

Answers:

  • 200 The copy: object
  • otherwise an Error

getContact ​

GET /v1/me/contact · user

The contact given (null none), and the product's policy.

Answers:

setContact ​

PUT /v1/me/contact · user

Give (or change) a contact, if the product takes one (else 409).

Body: object

FieldType
kindemail, other
valuestringup to 254 characters

Answers:

withdrawContact ​

DELETE /v1/me/contact · user

Withdraw the contact (deleted at once).

Answers:

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:

  • 200 The list: object
  • otherwise an Error

report ​

POST /v1/tickets · user

Send a report.

Body: Report

Answers:

ticket ​

GET /v1/tickets/{id} · user

One ticket, with its thread.

ParameterInType
idpathinteger (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).

ParameterInType
idpathinteger (int64)

Body: Reply

Answers:

updates ​

GET /v1/updates · user

The tickets support answered or changed since a time (polling).

ParameterInType
sincequerystring (date-time)The last answer's now; none: everything support ever touched.

Answers:

  • 200 Updates, and the time to ask from next: object
    • updates: array of Update
    • now: 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:

  • 200 The stream: string
  • otherwise an Error

Objects ​

Error ​

FieldType
errorstring

Identity ​

FieldType
idstringA UUID v7.; e.g. 01a1a2b3-9cdf-71e1-b2d5-91d78e28a35a
secretstringShown this once: keep it (only its hash is kept here).; pattern ^[0-9a-f]{64}$

Field ​

FieldType
namestring
label (optional)string
typetext, number, bool, geo, link, json
template (optional)stringA link's: {field} replaced by that field's value.

Product ​

FieldType
idstring
namestring
privacy_url (optional)string
branding (optional)object
fieldsarray of FieldWhat a report's context may carry; the rest is dropped.
contactoff, optional
contact_kindsarray of email, other
keepingobject

Me ​

FieldType
idstring
created_atstring (date-time)
devicesintegerDevices holding a secret for this id.
contact (optional)Contact or null

Contact ​

FieldType
kindemail, other
valuestring
given_atstring (date-time)

ContactState ​

FieldType
contactContact or null
policy (optional)off, optional
kinds (optional)array of string

Report ​

FieldType
notestringup to 4000 characters
screenshot (optional)stringA JPEG, up to 3 MB.
context (optional)objectThe product's fields (GET /v1/product).
app_version (optional)stringup to 40 characters
telemetry (optional)objectFree JSON up to the product's size, matching its schema if it has one (else 400, saying where).

Reply ​

FieldType
bodystringup to 4000 characters
screenshot (optional)string
context (optional)object
telemetry (optional)object

Entry ​

FieldType
idinteger (int64)
authoruser, support
name (optional)stringA support person's name.
kindcomment, statusstatus: body is the new status.
bodystring
created_atstring (date-time)
context (optional)object
has_screenshot (optional)boolean

Status ​

open, in_progress, waiting, resolved, closed

Ticket ​

FieldType
idinteger (int64)
productstring
statusStatus
notestring
context (optional)object
app_versionstring
has_screenshotboolean
created_atstring (date-time)
updated_atstring (date-time)
support_at (optional)string (date-time)Support's last answer or status change.
thread (optional)array of Entry

Update ​

FieldType
kindanswer
ticketinteger (int64)
statusStatus
atstring (date-time)

Transfer ​

FieldType
codestringTyped 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_atstring (date-time)