Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Routines and triggers

Make a trigger

Makes a trigger. Without event, it is a webhook: each request to its URL is an event, and the teammate gets a task with its instructions and the event. With event, something in a product of Troopy starts it, and each event names the record to read: send no sender, secret or fields then. An event is material for the teammate, never instructions. Events that come before the teammate starts go on one task. Every run uses the organization's AI plan, so this needs an owner or admin. Get the URL of a webhook trigger in the app, on the page of its routine (Routines).

post/api/v1/triggers

Authorization

HeaderAuthorization: Bearer <API key>
Or the headerX-API-Key: <API key>
API keyMake one in Troopy under Settings > API keys. It acts as you, in its workspace.

Other ways to call it

CLItroopy triggers create
MCP tooltroopy_create_trigger
Rate limit20 calls in 60 seconds, for each key
RetriesSend an Idempotency-Key header. A retry with the same key gets the first answer back, and the operation runs one time.

Body

application/json
agent*string

The teammate's handle, like chief

At most 40 characters

name*string

At least 1 characters · At most 80 characters

task*string

What the teammate does with each event, as you'd tell the teammate

At least 1 characters · At most 2000 characters

eventenum<string>

Something in a product of Troopy that starts the trigger, in the place of a webhook. customer.*: a customer signed up, started a trial, started to pay, had a failed payment, asked to cancel, left, came back or became at risk. feedback.added: a customer said something. dispute.opened, dispute.closed. outreach.reply: a reply to a campaign email. mailbox.mail: new mail in a mailbox with Read all. ticket.released: an engineering ticket went live. The teammate must hold the tool that reads the record

customer.signed_upcustomer.trial_startedcustomer.subscribedcustomer.payment_failedcustomer.cancel_requestedcustomer.churnedcustomer.came_backcustomer.risk_raisedfeedback.addeddispute.openeddispute.closedoutreach.replymailbox.mailticket.releasedanalytics.spikeanalytics.drop

optionstring

For mailbox.mail: the id of the one mailbox whose mail starts the trigger. Without it, every mailbox with Read all. For customer.signed_up: work_email, so that only a user whose email names a company starts the trigger

senderenum<string>

Who sends the requests of a webhook. url when you send none

urlgithubstripeshopifystandardhmac

secretstring

The signing secret that the sender made (stripe, shopify, standard). It goes in and never comes out

At least 1 characters · At most 500 characters

fieldsarray<string>

Only these paths of an event reach the teammate. Empty for the whole event

Default [] · At most 20 items

maxPerDayinteger

The most tasks that it starts in a UTC day

Default 20 · At least 1 · At most 200

eventsPerTaskinteger

The most events that one task holds. Give 1 when a run can do the work of one event only, as the research of a lead

Default 10 · At least 1 · At most 10

Response

201 · application/json
data*object
17 properties
id*string

A 24-character id

agent*string

The handle of the teammate that it starts

name*string
task*string

What the teammate does with each event

source*enum<string>

webhook: a request to its URL starts it. event: something in a product of Troopy starts it

webhookevent

event*enum<string> | null

What starts it in Troopy, like customer.cancel_requested. Null for a webhook

customer.signed_upcustomer.trial_startedcustomer.subscribedcustomer.payment_failedcustomer.cancel_requestedcustomer.churnedcustomer.came_backcustomer.risk_raisedfeedback.addeddispute.openeddispute.closedoutreach.replymailbox.mailticket.releasedanalytics.spikeanalytics.drop

option*string | null

What narrows its event: for mailbox.mail, the id of one mailbox. For customer.signed_up, work_email. Null for every one

sender*enum<string>

Who sends the requests of a webhook. It says how Troopy checks each one

urlgithubstripeshopifystandardhmac

needsSecret*boolean

Its sender makes the signing secret, and Troopy does not have it yet. Troopy refuses each request until then

fields*array<string>

The paths of an event that reach the teammate, like issue.title. Empty: the whole event

maxPerDay*integer

The most tasks that it starts in a UTC day. Later events of the day are held

eventsPerTask*integer

The most events that one task holds

paused*boolean
pausedWhy*string | null

Why Troopy paused it. Null when a person paused it, or it is on

lastEventAt*string | null
today*object

Its events, and the tasks that it started, in this UTC day

2 properties
events*integer
tasks*integer
createdAt*string

ISO 8601 date and time

Errors

400 invalid_inputFix the field named in detail. Each operation's schema is in /api/v1/openapi.json.
401 unauthorizedSend an API key as `Authorization: Bearer tr_live_...`. Create one in Troopy under Settings.
403 forbiddenThe key lacks a scope this operation needs, or its owner lacks the role. detail says which; create a key with the scope, or ask an organization owner or admin.
409 conflictThis Idempotency-Key was used for a different request, or that request is still running. Use a new key for a new request.
429 rate_limitedWait the number of seconds in Retry-After, then retry.