
Pylon Issues
CertifiedTasks and a trigger for creating, listing, updating, and replying to Pylon support issues (tickets).
Create, fetch, list, and update Pylon issues; post customer-facing replies or internal notes; and react to new or updated issues with a polling trigger.
Pylon Issues
Tasks and a trigger for creating, listing, updating, and replying to Pylon support issues (tickets).
Create, fetch, list, and update Pylon issues; post customer-facing replies or internal notes; and react to new or updated issues with a polling trigger.
tasks
How to use the Pylon plugin
Manage Pylon support issues (tickets) from a Kestra flow, backed by the Pylon REST API.
Authentication
Every task and the trigger authenticate with a Pylon API token:
apiToken(required, secret) — an API token created by a Pylon Admin user (Pylon Settings > API), sent asAuthorization: Bearer <token>on every request.baseUrl(optional) — defaults to the US region (https://api.usepylon.com); override withhttps://api.eu.usepylon.comfor the EU region.
Store the token as a Kestra secret and reference it with {{ secret('PYLON_API_TOKEN') }}, or set it once via
plugin defaults so every task and the trigger inherit
it without repeating it in each flow.
Gotchas
GET /issuesrequires a bounded time range.startTime/endTime(RFC3339) must not span more than 365 days;issue.Listdefaults to the last 24 hours if left unset.- Replying requires an existing message ID.
issue.Reply'smessageIdmust be the top-levelidof an existing customer-visible message on the issue (from Pylon'sGET /issues/{id}/messagesendpoint, not implemented by this plugin) — it selects which conversation/thread the reply is delivered on and, for email, the reply-chain headers.issue.AddNotehas no such requirement: with nothreadId/messageIdset, it posts to the most recently created internal thread (or creates one). - Custom fields are a map in this plugin, an array on the wire. Pylon's API expects
custom_fieldsas an array of{slug, value}(or{slug, values}for multi-valued fields like multiselect);issue.Createandissue.Updateaccept a simplerMap<String, Object>(slug to value, or slug to a list of values) and convert it. - Rate limits. Roughly: list 30/min, get 300/min, create 30/min, update/delete 120/min, reply/note 30/min. On a
429response, tasks and the trigger automatically retry a bounded number of times honoringRetry-After; a persistent429fails the task with a message suggesting to reduce call frequency or the trigger's polling interval. issue.Updaterejects an empty request. If none of its optional fields are set, the task fails fast instead of silently sending an emptyPATCH.
Tasks
Issues (io.kestra.plugin.pylon.issue)
List— lists issues in a time range (startTime/endTime, defaults to the last 24 hours) with cursor pagination andfetchTypesupport (FETCH,FETCH_ONE,STORE,NONE; defaults toSTORE).Get— fetches a single issue by ID or issue number.Create— creates an issue and its first message;titleandbodyHtmlare required, and eitheraccountIdorrequesterEmailmust identify the customer.Update— updates an issue; only the fields you set are sent (PATCHsemantics).Reply— posts a customer-facing reply on an existing message thread.AddNote— posts an internal note, not visible to the requester.
Triggers
issue.Trigger polls GET /issues at the configured interval and fires one execution per poll carrying every
issue whose updated_at is newer than the last delivered watermark (persisted in the flow's namespace KV store, so
issues are never re-delivered even across worker restarts). On the first poll, only the baseline is recorded — no
execution fires — seeded to now - lookbackPeriod (default PT0S) so enabling the trigger does not replay the
entire backlog. Output includes issues (the matched issue objects, oldest first) and count.
Each execution carries at most maxIssuesPerExecution issues (default 1000): a burst of updates — a long trigger
downtime, or a bulk edit in Pylon — delivers the oldest issues first and leaves the rest behind the watermark for the
following poll(s), rather than building one oversized execution payload.
Assumption worth flagging: Pylon's GET /issues time-range filter is not documented as filtering on a specific
timestamp field. This trigger assumes it is (or includes) updated_at, since that is the only interpretation
useful for detecting updates and not just new issues — verify against your own data if you rely on this trigger for
update detection specifically.