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

1

Get your key

Run /presly-token in Slack or Discord.

2

Give it to your AI

Paste the token + the agent brief below. One-time setup.

3

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:

slack / 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):

the reply
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.

paste into your AI assistant
# 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

http
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
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
titleyes≤ 200 chars (capped).
descriptionMulti-part text, verbatim. Fold “missing info” / “attachments” in here as markdown — not separate fields.
prioritylow · medium · high · urgent. Anything else → medium.
labelsArray of strings, max 5.
acceptance_criteriaArray of strings, max 6.
assigneeDisplay-name hint; resolved to a member or dropped.
projectKey/name hint. Omit to auto-route.

Several tickets at once

Send a tickets array instead of a single object — one entry per distinct problem:

json
{
  "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
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.

header
Idempotency-Key: 2026-07-16-crash-report-42

Responses

Outcome HTTP Body
one created201{ status, key, url, project }
several created201{ status, tickets: [ … ] }
duplicate replay200{ status: "duplicate", key }
rate limited429{ status, message }
bad / revoked token401{ status: "unauthorized", message }
invalid body422{ message, errors }
failed502{ status: "failed", message }

Limits & attribution

  • Every ticket is attributed to the token owner — it lands in the admin intake log with platform = api and 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.