Skip to content

Integrations

jann edited this page Sep 14, 2026 · 7 revisions

Integrations

AI agent & GitHub

Connecting an AI provider (Claude/OpenAI) and a GitHub token unlocks the AI Agent — investigate a failing report and open a pull request with a fix. Both live in Settings → Integrations, alongside Discord/Slack below.

Discord & Slack notifications

Settings → Integrations (owner, or an admin on the project) holds a webhook URL for each. Leave a field blank to disable that channel.

  • Discord Webhook URL — from a Discord channel's Integrations → Webhooks.
  • Slack Webhook URL — from a Slack Incoming Webhook app.

Each run can opt in to Discord and/or Slack from the run bar. The notification carries the project name, the pass/fail summary, the browser and the tag filter, and links back to the report when a public URL is set.

Scheduled runs

Scheduled in the top nav. A schedule is a cron job:

  • Task name, cron expression (a set of presets, or a custom expression), tag filter, browser, workers, and which runners to use.
  • The cron fires on the project's timezone (Settings → Project).
  • Toggle a job on/off, edit it, or Run now.
  • Scheduled runs land as normal reports, tagged with the task name as their trigger.

Triggering a run from CI

Every run is also a plain REST call. Mint a key in Settings → API & MCP (or set PLUM_MCP_KEY on the server for an owner-scoped CI key) and POST:

curl -X POST https://api.plum.example.com/trigger \
  -H "Authorization: ApiKey $PLUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "tag": "@smoke",
        "browser": "chromium",
        "workers": 2,
        "baseUrl": "https://your-pr-preview.example.com"
      }'
  • tag — the same tag expression you'd type into --grep / --tags. Omit to run everything.
  • baseUrl — overrides the app URL for this run only. Point each pull request at its own preview deployment. If your app is on localhost, use host.docker.internal so the Plum container can reach it.
  • testRunId — link results to a Test Repository run; its automated cases are marked pass/fail automatically.

The response returns a jobId; GET /trigger/:jobId polls status. A GitHub Actions step:

- name: Run Plum tests
  run: |
    curl -X POST ${{ vars.PLUM_URL }}/trigger \
      -H "Authorization: ApiKey ${{ secrets.PLUM_API_KEY }}" \
      -H "Content-Type: application/json" \
      -d '{"tag": "@smoke", "baseUrl": "${{ steps.deploy.outputs.url }}"}'

For a richer, conversational integration — an agent that authors cases, runs them and reads the report back — use MCP Integration.

Clone this wiki locally