# Models: U

> API models starting with U.

## `UnmatchedItem`

- `id: uuid.UUID`
- `reason: Union[Literal['no-keyed-hash', 'unknown-key'], str]`

## `UnpinBody`

- `scope: kindgi.client.LiveScopeTenant | kindgi.client.LiveScopeOrg | kindgi.client.LiveScopeProject | kindgi.client.LiveScopeSegment | kindgi.client.LiveScopeUnrecognized`
- `reason: str | None` (optional)

## `UnregisterAgentResult`

- `agent_id: str` (`agentId` on the wire)
- `version: str`
- `unregistered: Literal[True]`

## `UnregisterBlockResult`

- `block_id: str` (`blockId` on the wire)
- `version: str`
- `unregistered: Literal[True]`

## `UnregisterEvalSuiteResult`

- `suite_id: str` (`suiteId` on the wire)
- `version: str`
- `unregistered: Literal[True]`

## `UnregisterFlowResult`

- `flow_id: str` (`flowId` on the wire)
- `version: str`
- `unregistered: Literal[True]`

## `UnregisterGuardrailResult`

- `guardrail_id: str` (`guardrailId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterIdentityProviderResult`

- `provider_id: str` (`providerId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterJudgeClassResult`

- `judge_class_id: str` (`judgeClassId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterJudgmentResult`

- `judgment_id: str` (`judgmentId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterMCPEndpointResult`

- `endpoint_id: str` (`endpointId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterPolicyResult`

- `policy_id: str` (`policyId` on the wire)
- `version: str`
- `unregistered: Literal[True]`

## `UnregisterProviderResult`

- `provider_id: str` (`providerId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterReviewerResult`

- `reviewer_id: uuid.UUID` (`reviewerId` on the wire)
- `unregistered: Literal[True]`

## `UnregisterToolResult`

- `tool_id: str` (`toolId` on the wire)
- `version: str`
- `unregistered: Literal[True]`

## `UnregisterUserResult`

A removed person, and what removing them took away (each 0 when they were already removed).

- `user: kindgi.client.UserRecord`
- `keys_revoked: int` (`keysRevoked` on the wire)
- `sessions_revoked: int` (`sessionsRevoked` on the wire)
- `grants_removed: int` (`grantsRemoved` on the wire)

## `UpdateIdentityProviderBody`

Changes to a registered identity provider: a field given replaces the stored one, `null` removes an optional one, and anything not given stays. The result must still be a whole provider of its `kind` (the fields `IdentityProviderConfig` requires for it), checked as a registration is. `providerId` and `kind` can't change; `signIn` is the deployment's and is ignored. A new `issuer` drops the endpoints discovered from the old one.

- `provider_id: str | None` (`providerId` on the wire) (optional)
- `kind: Optional[Annotated[Union[Literal['oidc', 'saml'], str], <kindgi.client._open.OpenEnum object at 0x10700bbd0>]]` (optional)
- `display_name: str | None` (`displayName` on the wire) (optional)
- `domains: list[kindgi.client.Domain] | None` (optional)
- `join: Optional[Literal['invite', 'domain']]` (optional)
- `metadata: dict[str, Any] | None` (optional)
- `issuer: AnyUrl | None` (optional)
- `client_id: str | None` (`clientId` on the wire) (optional)
- `client_secret_ref: str | None` (`clientSecretRef` on the wire) (optional)
- `scopes: list[str] | None` (optional)
- `authorization_endpoint: AnyUrl | None` (`authorizationEndpoint` on the wire) (optional)
- `token_endpoint: AnyUrl | None` (`tokenEndpoint` on the wire) (optional)
- `userinfo_endpoint: AnyUrl | None` (`userinfoEndpoint` on the wire) (optional)
- `jwks_endpoint: AnyUrl | None` (`jwksEndpoint` on the wire) (optional)
- `claim_mapping: kindgi.client.ClaimMappingSpec | None` (`claimMapping` on the wire) (optional)
- `idp_metadata_xml: str | None` (`idpMetadataXml` on the wire) (optional)
- `idp_entity_id: str | None` (`idpEntityId` on the wire) (optional)
- `idp_sso_url: AnyUrl | None` (`idpSsoUrl` on the wire) (optional)
- `idp_certificates: list[kindgi.client.IdpCertificate] | None` (`idpCertificates` on the wire) (optional)
- `sp_signing_key_ref: str | None` (`spSigningKeyRef` on the wire) (optional)
- `sp_decryption_key_ref: str | None` (`spDecryptionKeyRef` on the wire) (optional)
- `want_assertions_signed: bool | None` (`wantAssertionsSigned` on the wire) (optional)
- `attribute_mapping: kindgi.client.AttributeMapping1 | None` (`attributeMapping` on the wire) (optional)

## `UpdateIdentityProviderResult`

- `provider_id: str` (`providerId` on the wire)
- `provider: kindgi.client.OidcIdentityProviderConfig | kindgi.client.SamlIdentityProviderConfig | kindgi.client.IdentityProviderConfigUnrecognized`

## `UpdateJudgeClassBody`

- `weight: float | None` (optional)
- `description: str | None` (optional)
- `assertable_by: kindgi.client.JudgeClassAssertableBy | None` (`assertableBy` on the wire) (optional)

## `UpdateProjectMembershipBody`

- `role: Literal['viewer', 'editor', 'owner', 'admin']`

## `UpdateSiteBody`

The settings to change; the rest stay as they are.

- `display_name: str | None` (`displayName` on the wire) (optional)
- `origin: str | None` (optional)
- `approvals_url: str | None` (`approvalsUrl` on the wire) (optional)
- `allowed_roles: list[kindgi.client.AllowedRole] | None` (`allowedRoles` on the wire) (optional)
- `role_map: dict[str, kindgi.client.SiteRoleGrant] | None` (`roleMap` on the wire) (optional)
- `reviewer_ceiling: Optional[Literal['standard', 'senior']]` (`reviewerCeiling` on the wire) (optional)
- `vouching: bool | None` (optional)
- `people_cap: int | None` (`peopleCap` on the wire) (optional)
- `new_people_per_day: int | None` (`newPeoplePerDay` on the wire) (optional)

## `UpdateTeamMembershipBody`

- `role: Union[Literal['admin', 'member'], str]`

## `UpdateTeamProjectGrantBody`

- `role: Union[Literal['viewer', 'editor', 'admin'], str]`

## `UploadArtifactBody`

Multipart form. `file` is the byte stream (required). Other fields are optional metadata: `name` (defaults to file part filename), `contentType` (defaults to file part MIME), `tags` (JSON-encoded object), `ownerRunId` (RunId string), `expectedHash` (sha256 hex, framework rejects on mismatch).

- `file: bytes`
- `name: str | None` (optional)
- `content_type: str | None` (`contentType` on the wire) (optional)
- `tags: str | None` (optional)
- `owner_run_id: uuid.UUID | None` (`ownerRunId` on the wire) (optional)
- `project_id: str | None` (`projectId` on the wire) (optional)
- `expected_hash: str | None` (`expectedHash` on the wire) (optional)

## `UpsertTenantConfigBody`

- `kind: Union[Literal['env', 'config', 'secret'], str]`
- `key: str`
- `value: str`
- `sensitive: bool | None` (optional)
- `if_revision: int | None` (`ifRevision` on the wire) (optional)

## `UpsertTenantConfigResult`

- `entry: kindgi.client.TenantConfigEntry`

## `UsageGroup`

One group: the dimensions it's grouped by (only those), then its count, the sum of its quantities, and its first and last times.

- `tenant_id: uuid.UUID | None` (`tenantId` on the wire) (optional)
- `project_id: str | None` (`projectId` on the wire) (optional)
- `agent_id: str | None` (`agentId` on the wire) (optional)
- `kind: str | None` (optional)
- `class_: str | None` (`class` on the wire) (optional)
- `state: str | None` (optional)
- `day: str | None` (optional)
- `count: int`
- `quantity: float`
- `first_at: AwareDatetime` (`firstAt` on the wire)
- `last_at: AwareDatetime` (`lastAt` on the wire)

## `UsagePage`

- `data: list[kindgi.client.UsageGroup]`
- `watermark: AwareDatetime`
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `UserCollectionPage`

- `data: list[kindgi.client.UserRecord]`
- `has_more: bool` (`hasMore` on the wire)
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `UserCreated`

The person just added, and whether their invitation was emailed (`inviteEmail`: absent from a runtime that sends no invitations).

- `user_id: str` (`userId` on the wire)
- `tenant_id: uuid.UUID` (`tenantId` on the wire)
- `primary_email: str | None` (`primaryEmail` on the wire) (optional)
- `display_name: str | None` (`displayName` on the wire) (optional)
- `created_at: AwareDatetime` (`createdAt` on the wire)
- `last_active_at: AwareDatetime | None` (`lastActiveAt` on the wire) (optional)
- `unregistered_at: AwareDatetime | None` (`unregisteredAt` on the wire) (optional)
- `invite: kindgi.client.UserInvite | None` (optional)
- `first_signed_in_at: AwareDatetime | None` (`firstSignedInAt` on the wire) (optional)
- `metadata: dict[str, Any] | None` (optional)
- `invite_email: kindgi.client.InviteEmail | None` (`inviteEmail` on the wire) (optional)

## `UserInvite`

An open invitation. `pending` signs in. `expired` (past `expiresAt`, 7 days after it was made or last renewed) is refused at every way of signing in until a tenant admin renews it (`POST /v1/identity/users/{userId}/invite`).

- `state: Union[Literal['pending', 'expired'], str]`
- `expires_at: AwareDatetime` (`expiresAt` on the wire)
- `sent_at: AwareDatetime | None` (`sentAt` on the wire) (optional)

## `UserRecord`

Tenant-scoped user record (admin plane). `primaryEmail` may be redacted on the wire based on tenant policy (the routes treat it as opaque). `metadata` is free-form JSON — deployments carry IdP claims / provisioning source / roles here.

- `user_id: str` (`userId` on the wire)
- `tenant_id: uuid.UUID` (`tenantId` on the wire)
- `primary_email: str | None` (`primaryEmail` on the wire) (optional)
- `display_name: str | None` (`displayName` on the wire) (optional)
- `created_at: AwareDatetime` (`createdAt` on the wire)
- `last_active_at: AwareDatetime | None` (`lastActiveAt` on the wire) (optional)
- `unregistered_at: AwareDatetime | None` (`unregisteredAt` on the wire) (optional)
- `invite: kindgi.client.UserInvite | None` (optional)
- `first_signed_in_at: AwareDatetime | None` (`firstSignedInAt` on the wire) (optional)
- `metadata: dict[str, Any] | None` (optional)
- `grants: kindgi.client.PersonGrants | None` (optional)
