---
title: "Slipstream deploy record"
method: POST
path: "/webhooks/slipstream/deploy"
tags: ["Webhooks"]
---

# Slipstream deploy record

`POST /webhooks/slipstream/deploy`

## Request

- Base URL: `https://api.apphandoff.com/api`
- URL: `https://api.apphandoff.com/api/webhooks/slipstream/deploy`
- Auth: none required

Called by the `record-deploy` stage of the Slipstream deploy recipe (HO-15721) once the
promoted commit is live. Stamps `deployed_at` (status `success`) or `deploy_failed_at`
(status `failed`) on tickets whose `merge_sha` is `sha`, in the projects wired to `repo`,
saves that `repo` reported a deploy (HO-16279: the hourly sweep keeps its merged tickets
waiting for their deploy), then closes the closing-line tickets parked on that sha. Only `environment: production`
stamps; any other environment is acknowledged and ignored. Idempotent: a repeat stamps
nothing and re-runs the close. Protected by CRON_SECRET via the x-cron-secret header.

## Request body

- object
  - `repo` string, required: GitHub `owner/name`
  - `sha` string, required: Promoted commit, 40 hex characters
  - `run_id` union: Slipstream run id, logged only
    - string
    - number
  - `environment` string, required
  - `status` 'success' | 'failed', required

## Response `200`

Recorded, or acknowledged and ignored (unknown repo, non-production environment)

- object
  - `stamped` integer
  - `closed` integer
  - `ignored` boolean
  - `reason` string

## Other responses

- `400`: Body is not JSON or fails validation
- `401`: Missing or invalid CRON_SECRET
- `413`: Body too large
- `500`: The stamp, the deploy report (`report_failed`) or the close failed; send the call again

---

[API](https://skmtc.dev/apphandoff/apis/apphandoff-api.md) · [All operations](https://skmtc.dev/apphandoff/apis/apphandoff-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apphandoff/apis/apphandoff-api/revisions/9f138fe46d56?raw)
