---
title: "Pin a source's recipe"
method: POST
path: "/sources/{source}/pin"
tags: ["Catalog"]
---

# Pin a source's recipe

`POST /sources/{source}/pin`

## Request

- Base URL: `https://app.vern.so/api/v1`
- URL: `https://app.vern.so/api/v1/sources/{source}/pin`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/vern-so/apis/vern-api/docs/sources/:source/pin/post.ts> (a function with typed inputs; its response is checked against the schema)

Pin the recipe a source reuses as the starting point for future `generate` runs, so one customer's run can't drift the baseline others draw from. Pass `run_id: null` to unpin.

## Path parameters

- `source` string, required

## Request body

- object
  - `run_id` string, uuid, nullable, required: The run whose recipe to pin, or null to unpin.

## Response `200`

The updated pin.

- object
  - `source` string
  - `pinned_recipe_run_id` string, uuid, nullable

## Other responses

- `400`: Malformed request.
- `401`: API key missing, malformed, or revoked.
- `404`: The referenced resource isn't in your account.
- `409`: A uniqueness or state conflict.
- `429`: Rate limit hit. Counted per account, not per API key. Creating a migration and starting a `generate` run are limited to 30/hour each; answering a run is limited to 30/hour; reads allow 30/minute and writes 30/minute. `Retry-After` gives the seconds until the window resets, alongside `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`.

## Changes

- **2026-06-18** `c5a09eb23a64`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vern-so/apis/vern-api/changes/sources/:source/pin/post.md)

---

[API](https://skmtc.dev/vern-so/apis/vern-api.md) - [All operations](https://skmtc.dev/vern-so/apis/vern-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vern-so/apis/vern-api/revisions/6ae61af2db81?raw)
