For developers & AI assistants
Let your assistant file the ticket
Your team already tells an AI what’s broken. With a personal token, that AI drops the ticket straight onto the Presly board — drafted, routed, and credited to you — instead of being re-typed into another tool.
How it works
Get your key
Run /presly-token in Slack or Discord.
Give it to your AI
Paste the token + the agent brief below. One-time setup.
Describe the bug
Your AI drafts and posts it; you get a ticket key back.
1. Get a token
Any mapped user can mint one — no admin needed. Run the command on Slack or Discord:
/presly-token new zapier
Presly replies once, privately with a plaintext token. Copy it immediately — it is never shown again (only a hash is stored):
presly_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Manage your tokens any time:
/presly-token list— your active tokens (name, id, created, last used). Never the secret./presly-token revoke <name|id>— kill a token.
You can hold up to 5 active tokens; revoke one to mint another. If the command can’t find your account, sign in to the portal once to link your Slack/Discord id, then try again.
Treat your token like a password. It acts as you and can file tickets under your name. Lost it? /presly-token revoke and mint a new one.
2. The agent brief
Paste this into your assistant’s instructions once, with your token in place of the placeholder. It’s written for an AI to follow exactly.
# Filing Presly tickets
When I describe a bug, task, or request and ask you to file it, call the Presly API.
## Endpoint
POST https://abersoft.id/api/tickets
Header: Authorization: Bearer presly_pat_REPLACE_WITH_MY_TOKEN
Header: Content-Type: application/json
Header: Idempotency-Key: <a unique id per ticket you send>
## Body — send the ticket you already drafted (do NOT ask Presly to re-write it)
{
"project": "INFL", # optional. Omit it and Presly routes the ticket itself.
"tickets": [{
"title": "Short, specific summary (max 200 chars)",
"description": "Full markdown. Fold Summary, Actual behavior, Repro steps, Notes, Missing info, and Suggested attachments in as sections here.",
"priority": "medium", # EXACTLY one of: low | medium | high | urgent
"labels": ["Bug"], # up to 5 short strings
"acceptance_criteria": ["What 'done' looks like"],
"assignee": null # optional display-name hint, or null
}]
}
## Rules
- One object in "tickets" per distinct problem. Several unrelated issues = several objects.
- "priority" MUST be one of the four enum values — never "Md", "P1", numbers, or free text.
- Put everything you'd show me (missing info, suggested attachments, stack traces as text)
inside "description" — there are no separate fields for them.
- Set a fresh "Idempotency-Key" per ticket; reuse the SAME key on a retry so a retry never
creates a duplicate.
- On success you get 201 with {status, key, url}. Report the key and url back to me, e.g.
"Filed INFL-42 → https://abersoft.id/projects/ticket/INFL-42".
- 401 = my token is missing/revoked. 422 = fix the body. 429 = rate limited, wait and retry.
# Draft the ticket well FIRST, then send it verbatim. Presly does not rewrite it.
3. API reference
One endpoint, bearer auth. Send a ticket your AI already drafted (recommended), or a raw story for Presly to draft.
Endpoint & auth
POST https://abersoft.id/api/tickets
Authorization: Bearer <your token>
Content-Type: application/json
Draft mode (recommended)
Presly files your exact fields — no AI rewrite, no OpenAI tokens spent on drafting — and only does project routing, sprint placement, and assignee resolution.
curl -X POST https://abersoft.id/api/tickets \
-H "Authorization: Bearer $PRESLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"project": "INFL",
"title": "Fix crash: NullReferenceException in DressUpUI.RefreshItems on SetTab",
"description": "Summary: … Actual behavior: … Reproduction steps: … Notes: …",
"priority": "high",
"labels": ["Bug"],
"acceptance_criteria": ["Tab switch on the DressUp UI no longer throws"]
}'
| Field | Req | Notes |
|---|---|---|
| title | yes | ≤ 200 chars (capped). |
| description | — | Multi-part text, verbatim. Fold “missing info” / “attachments” in here as markdown — not separate fields. |
| priority | — | low · medium · high · urgent. Anything else → medium. |
| labels | — | Array of strings, max 5. |
| acceptance_criteria | — | Array of strings, max 6. |
| assignee | — | Display-name hint; resolved to a member or dropped. |
| project | — | Key/name hint. Omit to auto-route. |
Several tickets at once
Send a tickets array instead of a single object — one entry per distinct problem:
{
"project": "INFL",
"tickets": [
{ "title": "Card 1 …", "priority": "high", "labels": ["Bug"] },
{ "title": "Card 2 …", "priority": "medium" }
]
}
Story mode (fallback)
For a caller with no structure — send a plain story and Presly’s AI drafts the ticket for you (spends AI tokens). Exactly one of tickets, title, or story must be present.
curl -X POST https://abersoft.id/api/tickets \
-H "Authorization: Bearer $PRESLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "story": "The login button does nothing on iOS after the last release.", "project": "INFL" }'
Idempotency
Send an Idempotency-Key header with a unique id per logical request. A retry with the same key files each ticket exactly once — a replay returns 200 with status: duplicate. A multi-ticket body derives a stable per-ticket key from the header + index. Without it, retries are not deduplicated.
Idempotency-Key: 2026-07-16-crash-report-42
Responses
| Outcome | HTTP | Body |
|---|---|---|
| one created | 201 | { status, key, url, project } |
| several created | 201 | { status, tickets: [ … ] } |
| duplicate replay | 200 | { status: "duplicate", key } |
| rate limited | 429 | { status, message } |
| bad / revoked token | 401 | { status: "unauthorized", message } |
| invalid body | 422 | { message, errors } |
| failed | 502 | { status: "failed", message } |
Limits & attribution
- Every ticket is attributed to the token owner — it lands in the admin intake log with
platform = apiand writes an audit row, just like a Slack/Discord ticket. - Two throttles apply: a per-IP transport limit in front of auth, and your normal per-user intake rate limit + daily AI-token budget after auth.
- Tokens are hashed at rest and never logged. No file uploads in v1 — reference stack traces as text inside
description.
Questions
No. When you send a drafted ticket (title, description, priority, labels), Presly files it exactly as written. It only picks the right project and drops it into that project’s active sprint.
Leave the project field out. Presly reads the title and description and routes it for you. Include a key only when you want to force a specific project.
Anyone whose Slack or Discord account is linked to Presly — it isn’t limited to admins. If your account isn’t linked yet, /presly-token will tell you to link it first.
Yes — put multiple objects in the tickets array, one per distinct problem. The response comes back as a list of the keys and links created.
Your ticket still gets created — Presly never depends on AI to file it. AI is only involved when you send a raw story for Presly to draft.
Tokens are stored only as a hash, so a database leak exposes nothing usable. Each token only creates tickets — it can’t read data or change settings — is revocable any time, and is rate-limited per person.
Looking for the full command list? See Commands.