---
# @generated by sylphx-gen. Do not edit.
title: "Qualify an owner pool"
description: "`agents.owner_pools.qualify` (POST /v1/{name}:qualify): Records an admission suite result for an Agent version."
type: reference
product: agents
summary: "Records an admission suite result for an Agent version."
updated: 2026-09-28
nav: false
---

Records an admission suite result for an Agent version. The caller holds `agents:qualify` and is not the principal whose create or update minted the version (`PERMISSION_DENIED`). Every minimum met: the member is `QUALIFIED`. Any score missing or below its minimum: the member is recorded `REFUSED` with the reason. Each qualification is recorded with its suite, suite version, result and caller; a `result` already recorded for the member is refused with `INVALID_FIELD`, so a demoted member returns only with a new suite result. A read-only version is refused with `PERMISSION_DENIED`; a suite or suite version other than the pool's with `INVALID_FIELD`. Re-qualifying keeps the member's baseline: the baseline belongs to the version and its pinned model.

- **Path** `POST https://api.sylphx.com/v1/orgs/acme/projects/shop/envs/production/owner_pools/owner-pool:qualify`
- **Scope** `agents:qualify`
- **Effect** `write` — a successful call changes state.
- **Collection** [owner_pools](/docs/api/owner_pools)

## Request

| Field | Type | What it is |
| --- | --- | --- |
| `name` | `string` | The owner pool. Required. |
| `agent_version` | `string` | The Agent version that ran the suite, in the pool's environment. Required. |
| `suite` | `string` | The suite that ran; must equal the pool's `admission.suite`. Required. |
| `scores` | `map<string, double>` | The score per suite metric; at most 64. Required. |
| `suite_version` | `string` | The suite version that ran; must equal the pool's `admission.suite_version`. Required. |
| `result` | `string` | The grader's id of this suite run, for example its evidence record; 1 to 200 characters. Each result is recorded once per member. Required. |

## Response

| Field | Type | What it is |
| --- | --- | --- |
| `agent_version` | `string` | The member version. Output only. |
| `model` | `string` | The model the version pins. Output only. |
| `state` | `OwnerPoolMemberState` | Qualified, refused or demoted. Output only. One of `qualified`, `refused`, `demoted`. |
| `suite` | `string` | The suite of the latest `:qualify`. Output only. |
| `scores` | `map<string, double>` | The scores of the latest `:qualify`. Output only. |
| `baseline` | `map<string, double>` | The baseline per demotion metric, computed by the platform from counted observations; a re-qualify keeps it. Output only. |
| `observed` | `map<string, double>` | The latest observation per metric. Output only. |
| `qualify_time` | `timestamp` | When it last qualified. Output only. |
| `demote_time` | `timestamp` | When it was last demoted. Output only. |
| `reason` | `string` | Why it was refused or demoted. Output only. |
| `update_time` | `timestamp` | When the state last changed. Output only. |
| `suite_version` | `string` | The suite version of the latest `:qualify`. Output only. |
| `result` | `string` | The suite result of the latest `:qualify`. Output only. |
| `qualifier` | `string` | The principal that recorded the latest `:qualify`. Output only. |

## Errors

- [`UNAUTHENTICATED`](/docs/api/errors/UNAUTHENTICATED) — No valid key or token was presented.
- [`PERMISSION_DENIED`](/docs/api/errors/PERMISSION_DENIED) — The key lacks the method's permission.
- [`RESOURCE_NOT_FOUND`](/docs/api/errors/RESOURCE_NOT_FOUND) — The named Resource does not exist or is not visible.
- [`INVALID_FIELD`](/docs/api/errors/INVALID_FIELD) — A field failed validation.
- [`IDEMPOTENCY_KEY_REUSED`](/docs/api/errors/IDEMPOTENCY_KEY_REUSED) — An Idempotency-Key was reused with another body.
- [`IDEMPOTENCY_IN_PROGRESS`](/docs/api/errors/IDEMPOTENCY_IN_PROGRESS) — The first call with this Idempotency-Key is still running.

Every error arrives in the body [Errors](/docs/platform/errors) describes.

## Examples

**cURL**

```curl
curl -X POST "https://api.sylphx.com/v1/orgs/acme/projects/shop/envs/production/owner_pools/owner-pool:qualify" \
  -H "Authorization: Bearer $SYLPHX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_version":"…","result":"…","scores":{},"suite":"…","suite_version":"…"}'
```

**TypeScript**

```ts
const response = await sylphx.agents.ownerPools.qualify({ agentVersion: '…', name: 'orgs/acme/projects/shop/envs/production/owner_pools/owner-pool', result: '…', scores: {}, suite: '…', suiteVersion: '…' })
```

**Rust**

```rust
let mut req = sylphx::agents::QualifyOwnerPoolMemberRequest::default();
req.agent_version = "…".to_string();
req.name = "orgs/acme/projects/shop/envs/production/owner_pools/owner-pool".to_string();
req.result = "…".to_string();
req.scores = Some(Default::default());
req.suite = "…".to_string();
req.suite_version = "…".to_string();
let response = sx.agents().owner_pools().qualify(req).await?;
```

**CLI**

```bash
sylphx agents owner-pools qualify orgs/acme/projects/shop/envs/production/owner_pools/owner-pool
```

**MCP**

```json
{ "method_id": "agents.owner_pools.qualify", "args": {"agent_version":"…","name":"orgs/acme/projects/shop/envs/production/owner_pools/owner-pool","result":"…","scores":{},"suite":"…","suite_version":"…"} }
```
