---
title: "Evidence Policy"
method: PUT
path: "/evidence/policy/{task_id}"
tags: ["evidence"]
---

# Evidence Policy

`PUT /evidence/policy/{task_id}`

## Request

- Base URL: `https://app.tascan.io/api/v1`
- URL: `https://app.tascan.io/api/v1/evidence/policy/{task_id}`
- Auth: HTTP bearer

Read or author a task's evidence policy (protocol v0.2 V9b, GET|PUT /evidence/policy/:task_id — one route, two methods, so one tool). action=get evaluates the pinned policy against the evidence ledger so far: whether it is usable and satisfied, and its progress (read tier). action=set authors/updates a policy in your org's namespace when definition is given (definition.require is a non-empty array of requirement objects; definition.min_count, when set, must be an integer from 1 through definition.require.length) or, when definition is omitted, pins the task to an existing active policy_id (write tier).

## Path parameters

- `task_id` string, required

## Request body

- object
  - `action` 'get' | 'set', required: get = GET (evaluate, read tier). set = PUT (author/pin, write tier).
  - `policy_id` string: action=set only, required: lowercase letters/digits/underscore/dot, starting with a letter, up to 80 chars, e.g. loto_v1.
  - `version` integer: action=set only: optional version for a new/updated policy definition (default 1). Ignored when only pinning an existing policy.
  - `definition` object: action=set only, optional: policy definition to create or update — require (array, required), min_count, window, any_of, allow_fallback. Omit to pin the task to the existing active policy_id instead.

## Response `200`

Success. JSON body: { data: ... } or an error object { error, message }.

## Other responses

- `4XX`: Client error (validation, auth, scope, rate limit).

---

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