Pitchfork
Pitchfork
Intro to PitchforkQuick Start Guide
Account ToolsAgent TUIConfiguration — Where Do My Args Go?Accounts Formatting ReferenceMCP ServerPublic APITriggers
GlossaryFAQ
Advanced Resources

Triggers

Automate Pitchfork actions based on account state, time, and group composition

Triggers are server-side rules that watch one or more accounts and run an action when a condition is met. Use them to stop bots when they hit a level target, swap accounts between groups when wealth crosses a threshold, alert you on bans, schedule batch launches, or kick off OAuth re-capture when sessions expire.

How they work

  • Triggers are evaluated server-side, not on the agent. You can leave your machine and they still fire.
  • Metadata triggers (level, skill, wealth, runtime, etc.) are checked on a polling loop — Pitchfork batches up to 100 accounts at a time every few minutes against accounts whose metadata recently changed.
  • Event triggers (account banned, connection failed, status changed) fire as soon as the underlying event is recorded.
  • Schedule triggers (scheduled, one_time) fire from a separate polling service that respects timezones and cron expressions.
  • Every trigger has one or more actions. Multiple actions on a single trigger run in order; if one fails, the others still execute.

Trigger catalog

Account state

TypeWatchesCommon condition
total_level_reachedTotal skill levelthreshold: 1500
quest_points_reachedQP countthreshold: 200
skill_level_reachedA specific skillskill: "Mining", level: 70
wealth_reachedBank + equipment value (gp)threshold: 50000000
runtime_reachedTime since the bot startedminutes: 480
script_completedScript reports completion(no extra condition)
account_bannedAccount flagged as banned(no extra condition)
connection_failedConnection to Jagex failedfailure_count: 3
account_status_changedStatus flippedfrom: "running", to: "stopped"
auth_capture_neededPitchfork detects expired session tokens(no extra condition)

Membership

TypeWatchesCommon condition
membership_expiredMembership end date passed(no extra condition)
membership_expiringMembership ends soondays_remaining: 7
membership_status_changedMember ↔ free flipis_member: true

Group composition

TypeWatchesCommon condition
group_account_countTotal accounts in a groupthreshold: 50 (operator chooses direction)
group_running_lowActive-account count drops below floorthreshold: 10
group_continuous_launchIdle accounts in a group, with cooldownFilter by min_total_level, max_runtime_today, exclude_banned, require_member
group_time_rotationAccounts last touched too long agotime_field: "last_closed_at", time_value: 2, time_unit: "hours"

Schedule

TypeWatchesCondition
scheduledCron scheduleschedule: "0 4 * * *", timezone: "America/New_York" (4 AM daily Eastern)
one_timeA specific instantexecute_at: "2026-06-01T08:00:00Z"

Advanced conditions

Any trigger can use multiple_conditions to combine multiple field checks with AND/OR logic instead of a single threshold. Each condition has a field (e.g. total_wealth, combat_level, quest_points), an operator (>, <, >=, <=, ==, !=), and a value.

Action catalog

ActionWhat it doesKey params
stop_botStops the running client(none)
pause_botPauses without killing the client(none)
start_scriptLaunches a scriptscript_name, optional agent_id, optional profile
start_account_toolQueues an account tooltool_type, optional parameters, priority, agent_id
move_to_groupReassigns account to another groupgroup_id
randomize_groupPicks a random target group, optionally weightedgroup_ids[], optional weights[]
auth_captureTriggers an OAuth graboptional agent_id, optional proxy_group_id
notifyIn-app notificationmessage, level: "info" | "warning" | "error"
webhookPOST or GET to an arbitrary URLurl, method, optional headers, custom_fields, include_account_data, include_trigger_data

Worked example: stop and rotate when an account hits 99 Slayer

Create a skill_level_reached trigger with conditions skill: "Slayer", level: 99 and these actions, in order:

  1. notify — message: "{{account.name}} hit 99 Slayer 🎉", level: "info"
  2. stop_bot
  3. move_to_group — group_id: <maxed_accounts_group_id>

Pitchfork picks up the metadata change within a few minutes of your script reporting it, fires all three actions, and your account ends up parked in the maxed-accounts group with a notification in your tray.

Worked example: keep a group running 24/7

Use a group_continuous_launch trigger on the group. Set:

  • cooldown_minutes: 30 — don't relaunch the same account inside 30 min of stopping
  • exclude_banned: true
  • require_member: true
  • max_runtime_today: 360 — don't relaunch an account that's already botted 6 hours today

Action: start_script with the script and agent you want.

REST API

Triggers can be created and managed via the Public API under the /api/triggers resource. The shape mirrors the UI form: name, trigger_type, conditions, actions[], optional account_ids[] or account_groups[] to scope.

Caveats

  • Polling latency. Metadata triggers can take up to a few minutes to fire after the underlying value changes. If you need real-time, use an event trigger or a webhook from your script.
  • No cross-account conditions. A trigger evaluates one account at a time (group triggers being the exception). You can't write "fire when accounts A and B are both running" — use webhooks + your own logic for that.
  • Action ordering matters when one mutates state another reads. Put stop_bot before move_to_group if your downstream logic cares about which group an account was in when it stopped.

Was this page helpful?

Public API

Programmatically manage your accounts, proxies, scripts, and triggers with the Pitchfork API

Glossary

Key terms and definitions used in Pitchfork documentation

On this page

How they workTrigger catalogAccount stateMembershipGroup compositionScheduleAdvanced conditionsAction catalogWorked example: stop and rotate when an account hits 99 SlayerWorked example: keep a group running 24/7REST APICaveats