---
title: "Set which credentials one need uses for your instance of a trigger (cron job, subscription, or webhook), but only to ..."
method: PUT
path: "/v1/credential-trigger-picks"
tags: ["secrets"]
---

# Set which credentials one need uses for your instance of a trigger (cron job, subscription, or webhook), but only to ...

`PUT /v1/credential-trigger-picks`

## Request

- Base URL: `https://api.kody.codes`
- URL: `https://api.kody.codes/v1/credential-trigger-picks`
- Auth: HTTP bearer

Set which credentials one need uses for your instance of a trigger (cron job, subscription, or webhook), but only to a value you already proposed with credentialMappingPropose and the person approved from that link, for example to switch back after the pick changed. The pick is resolved and written the same way Approve writes it. Anything else is refused: propose it instead. Never turns a trigger on; a trigger that is off needs approval. Needs package:execute on the package and an agent credential (MCP OAuth client, CLI, or API token); the person's own approval page and Credentials tab do not use this.

Org permission: none (touches no org data).

## Request body

- object
  - `packageId` string: Saved-package UUID. Use when the scoped name is not known, or for a stable ref.
  - `kodyId` string: Package name (`@owner/leaf` or the name leaf). Prefer this when you know the name.
  - `trigger` object, required
    - `kind` 'cron' | 'subscription' | 'webhook', required
    - `name` string, required: Job name, subscription topic, or webhook name.
  - `needKey` string, required: The credential need key.
  - `credentials` union, required: The pick to set, as you proposed it: a credential by { name } (optionally with scope) or { id }, or an array of them. [] is "none on purpose".
    - object
      - `id` string, required
    - object
      - `name` string, required
      - `scope` 'org' | 'personal'
    - union[]
      - union
        - object
          - `id` string, required
        - object
          - `name` string, required
          - `scope` 'org' | 'personal'

## Response `200`

Success.

- object
  - `trigger` object, required
    - `kind` 'cron' | 'subscription' | 'webhook', required
    - `name` string, required
  - `needKey` string, required
  - `credentials` object[], required
    - `id` string, required
    - `name` string, required
    - `scope` 'org' | 'personal', required
    - `kind` 'secret' | 'oauth' | 'mcp' | 'url' | 'login' | 'signing', required
  - `message` string, required

## Other responses

- `400`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `401`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `403`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `404`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `409`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `413`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `429`: Too many requests (edge IP/token limit) or an entitlement / plan-cap limit. Wait at least `Retry-After` seconds before retrying.
- `500`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `503`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `default`: Error envelope `{ "error": { "code", "message", "details"? } }`.

---

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