agents
An agent is an AI agent registered as an account of its own: an identity of kind agent that a person answers for.
An agent is an AI agent registered as an account of its own: an identity of kind agent that a person answers for.
Like a service account it holds API keys (credentials.create) and never
signs in, and roles, groups, and policies apply to it as to anyone. Two things set it apart: its credentials work only
while its sponsor is an active person of the same tenant, and its boundary policy caps everything it does, whatever
its roles say and whoever it acts for. People let an agent act on their behalf with
delegations. The repository guide is docs/agents.md.
Sponsors and standing
Every agent has a sponsor (agent.sponsorId): an active, unexpired person of the agent's tenant, accountable for it.
create makes the caller the sponsor when the caller is a person in their own session of the tenant; otherwise name
one with sponsorId. An agent's standing says whether it may act right now:
ok: it may act.suspended: the agent is disabled, assuspenddoes.expired: itsexpiresAthas passed.deleted: it was deleted.sponsor-missing: no person of the tenant matchessponsorId.sponsor-inactive: the sponsor is disabled, deleted, or past their ownexpiresAt.
Anything but ok refuses every credential of the agent with UNAUTHENTICATED: its API keys, its session tokens, and
the delegated sessions in which it acts for people. credentials.create refuses new keys meanwhile
(INVALID_IDENTITY). Offboarding a sponsor with a successor (identities.offboard)
hands their agents to the successor, audited as agent:sponsor-change; without a successor the agents stay with the
leaver and are refused until an administrator names a new sponsor with update.
Profile and ceiling
The profile fields create and update accept (in update, null clears an optional one):
| Field | Meaning |
|---|---|
model, provider | What the agent runs on. The model is 1 to 128 letters, digits, or ._:/@+-; the provider 1 to 64 letters, digits, or ._-, stored in lowercase. |
purpose, url | Shown to people deciding whether to delegate to the agent: up to 1024 characters, and an http(s) URL. |
protocols | An informational list such as mcp and a2a: at most 16 short lowercase names, deduplicated and sorted. |
boundary | A policy document that caps everything the agent does, with its own keys and in delegated sessions. Changes apply to live sessions at once. |
delegable | false refuses new delegations and the use of existing ones until it is turned back on. |
maxDelegatedSessionSeconds | The longest delegated session the agent may open, 60 to 43200 seconds (3600 when unset). |
tokenAudiences | Services outside Better IAM the agent may present a person's delegation to with a delegation token: at most 16 http(s) URLs or other absolute URIs (urn:example:api), without user info, query, or fragment. In a URL, * may start the host (https://*.example.com, any subdomain) or appear in the path (https://api.example.com/v1/*); a URL without a path matches only the root. Without it the agent gets no delegation tokens. |
Decisions for an agent's own key, and for sessions in which it acts for someone, carry principal.agentId,
principal.agentSponsorId, and, when set, principal.agentModel and principal.agentProvider; principal.kind is
agent for the agent's own key. See principal keys.
Who may call what
Administrators use iam:agents:create, iam:agents:read, iam:agents:update, and iam:agents:delete, checked on
iam/{agentId} (on the tenant for create and list). A sponsor manages their own agents from their own signed-in
session of the tenant without any permission: listMine, get, standing, activity, signCard, suspend, and
resume of a suspension they made themselves. An agent may call signCard for itself with its own unscoped key. When
the caller is the agent's sponsor, these sponsor rules apply even if they also hold the administrative permission. Every person of the tenant may browse delegable agents with catalog. A "person's own
session" excludes API keys, role sessions, session tokens, delegated sessions, and impersonation.
| Method | What it does | Access |
|---|---|---|
activity | Returns what an agent did, newest first: the audit events of its own credentials and of the sessions in which it acted for people. | Credential |
catalog | Lists the agents people of the tenant may delegate to, with what a person needs to decide. | Credential |
create | Registers an AI agent with a sponsor and an optional profile. | Credential |
delete | Deletes an agent, ending its keys and sessions and revoking every delegation to it. | Credential |
directory | Lists the tenant's agents that hold a current attested A2A card, for finding an agent to work with or hand work to. | Credential |
get | Returns one agent with its standing, its live API keys, and counts of its delegations. | Credential |
list | Lists the tenant's agents, newest first, optionally only one sponsor's or those in one standing. | Credential |
listMine | Returns the agents you sponsor, newest first, with the same detail as get. | Credential |
resume | Lifts an agent's suspension, so its kept API keys work again. | Credential |
signCard | Signs an agent's A2A (Agent2Agent) agent card, so other agents can check that it is a registered agent in good standing of your organization. | Credential |
standing | Tells whether an agent may act right now and, if not, why. | Credential |
suspend | Stops an agent at once (the kill switch) and keeps its API keys for resume. | Credential |
suspendAll | The organization-wide emergency stop: suspends every active agent of the tenant at once. | Credential |
update | Changes an agent's name, description, expiry, attributes, profile, or sponsor. | Credential |
activity
Returns what an agent did, newest first: the audit events of its own credentials and of the sessions in which it acted for people.
- Permission:
iam:agents:readon the agent, or none for its sponsor in their own session. - Audited as:
iam:agents:readfor administrators; not audited for the sponsor. - Errors:
NOT_FOUNDwhen the id is not an agent of this tenant;INVALID_INPUTfor alimitoutside 1 to 500 or a malformedoffset,from, orto.
An event belongs to the agent when the agent is its actor (its API keys and session tokens) or when its
sessionContext.agentId names the agent (a delegated session, where the actor is the person it acted for). Both
allowed and denied events are included, so a sponsor sees what the agent tried as well as what it did. Page with
limit (100 by default) and offset, and bound the time with from and to (epoch milliseconds).
const recent = await iam.api.agents.activity(sponsorSession, { tenantId, agentId, limit: 50 });
const refused = recent.filter((event) => event.outcome === 'deny');Prop
Type
An array of AuditEvent.
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/activity" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.activity(
credential: CredentialInput,
input: ActivityQuery & { tenantId: string; agentId: string },
): Promise<AuditEvent[]>catalog
Lists the agents people of the tenant may delegate to, with what a person needs to decide.
- Permission: None beyond a person's own session of the tenant.
- Audited as: Not audited; it only reads.
- Errors:
ACCESS_DENIEDfor any other credential, including a session of another tenant.
Only active, delegable agents in good standing (ok) are listed, sorted by name. Each entry has id and name, the
description, purpose, model, provider, url, protocols, and tokenAudiences when set, and sponsorName, so
a consent screen can show who answers for the agent and which outside services it may carry a delegation to. Keys, the boundary, and sponsor ids are not included. Use it for a "connect an
agent" page that ends in delegations.grant.
Prop
Type
An array of AgentListing.
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/catalog" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>"
}'iam.api.agents.catalog(
credential: CredentialInput,
input: { tenantId: string },
): Promise<AgentListing[]>create
Registers an AI agent with a sponsor and an optional profile.
Used inAI agents
- Permission:
iam:agents:createon the tenant. - Audited as:
iam:agents:create, plusagent:createwith the sponsor, model, and provider. - Errors:
INVALID_SPONSORwhensponsorIdis not an active, unexpired person of the tenant, or when it is left out and the caller is not a person in their own session (an API key, for example);LIMIT_EXCEEDED(409) past the tenant'sagentslimit;INVALID_INPUTfor a malformed profile field, adescriptionover 512 characters, or anexpiresAtthat is not in the next ten years;INVALID_POLICYorINVALID_ACTIONfor a malformedboundary.
The agent starts active with no keys: issue them with credentials.create as for a service account, and give it
access with roles and bindings. expiresAt (epoch milliseconds) schedules its deactivation. Deleted agents do not
count toward the limit. The result carries the agent's standing and a sponsor summary (id, name, email, status).
const agent = await iam.api.agents.create(credential, {
tenantId,
name: 'Support triage',
purpose: 'Labels and routes incoming support tickets',
model: 'claude-sonnet-5',
provider: 'anthropic',
protocols: ['mcp'],
sponsorId: aliceId,
boundary: {
version: 1,
statements: [{ effect: 'allow', actions: ['tickets:*'], resources: ['ticket/*'] }],
},
});
const { token } = await iam.api.credentials.create(credential, {
tenantId,
identityId: agent.id,
name: 'production',
});A CreateAgentInput object:
Prop
Type
A AgentSummary object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/create" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"name": "<name>"
}'iam.api.agents.create(
credential: CredentialInput,
input: CreateAgentInput,
): Promise<AgentSummary>delete
Deletes an agent, ending its keys and sessions and revoking every delegation to it.
- Permission:
iam:agents:deleteon the agent, and a recent sign-in. - Audited as:
iam:agents:delete, plusidentity:deletewithkind: 'agent'anddelegationsRevoked. - Errors:
RECENT_AUTH_REQUIREDwithout a recent sign-in (temporary credentials never have one);NOT_FOUNDwhen the id is not an agent of this tenant;CONFLICTwhen it is already deleted.
Pending requests and active delegations involving the agent become revoked, and their delegated sessions end at once.
Like any deleted identity, the agent leaves a tombstone (status deleted) so audit records keep resolving it, and its
bindings, group memberships, and relationships are removed. The result is the tombstone. To stop an agent for a while
and keep its keys, use suspend.
Prop
Type
A PublicIdentity object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/delete" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.delete(
credential: CredentialInput,
input: { tenantId: string; agentId: string },
): Promise<PublicIdentity>directory
Lists the tenant's agents that hold a current attested A2A card, for finding an agent to work with or hand work to.
Used inAI agents
- Permission: None beyond a credential of the tenant: a person's session, an agent's or service account's key, or a delegated session.
- Audited as: Not audited; it only reads.
- Errors:
ACCESS_DENIEDfor a credential of another tenant.
Every signCard stores the agent's latest signed card as its directory entry. Entries are listed while
their attestation is valid and the agent is in good standing, sorted by name: { agentId, name, card, attestation, expiresAt }, where card is the signed card itself, ready for verifyAgentCard from @better-iam/a2a. skill
keeps agents whose card offers a skill with that id or tag, and protocol agents whose attestation lists that
protocol. Suspending or deleting an agent removes it; an expired entry is swept away.
const [translator] = await iam.api.agents.directory(credential, { tenantId, skill: 'translate' });Prop
Type
An array of AgentDirectoryEntry.
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/directory" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>"
}'iam.api.agents.directory(
credential: CredentialInput,
input: { tenantId: string; skill?: string; protocol?: string },
): Promise<AgentDirectoryEntry[]>get
Returns one agent with its standing, its live API keys, and counts of its delegations.
- Permission:
iam:agents:readon the agent, or none for the agent's sponsor in their own session. - Audited as:
iam:agents:readfor administrators; not audited for the sponsor. - Errors:
NOT_FOUNDwhen the id is not an agent of this tenant.
keys lists unexpired API keys by label only (id, name, creation and expiry times, and lastUsedAt once used), never
token material. delegations counts the active and pending ones that have not lapsed, and
liveDelegatedSessions the unexpired delegated sessions. A deleted agent is still returned, with standing deleted.
Prop
Type
A AgentDetail object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/get" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.get(
credential: CredentialInput,
input: { tenantId: string; agentId: string },
): Promise<AgentDetail>list
Lists the tenant's agents, newest first, optionally only one sponsor's or those in one standing.
- Permission:
iam:agents:readon the tenant. - Audited as:
iam:agents:read.
Deleted agents are left out unless includeDeleted: true. standing: 'sponsor-inactive' finds the agents that
stopped because their sponsor left, the ones to hand to someone else with update.
Prop
Type
An array of AgentSummary.
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/list" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>"
}'iam.api.agents.list(
credential: CredentialInput,
input: {
tenantId: string;
sponsorId?: string;
standing?: AgentSummary['standing'];
includeDeleted?: boolean;
},
): Promise<AgentSummary[]>listMine
Returns the agents you sponsor, newest first, with the same detail as get.
- Permission: None beyond a person's own session of the tenant.
- Audited as: Not audited; it only reads.
- Errors:
ACCESS_DENIEDfor any other credential, including a session of another tenant.
Deleted agents are left out. It backs a "my agents" page where sponsors see keys and delegations and reach the kill switch.
Prop
Type
An array of AgentDetail.
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/listMine" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>"
}'iam.api.agents.listMine(
credential: CredentialInput,
input: { tenantId: string },
): Promise<AgentDetail[]>resume
Lifts an agent's suspension, so its kept API keys work again.
- Permission:
iam:agents:updateon the agent and a recent sign-in, or none for the sponsor when they made the suspension themselves. - Audited as:
agent:resume; an administrator's call also asiam:agents:update. - Errors:
ACCESS_DENIEDwhen the sponsor tries to lift someone else's suspension;RECENT_AUTH_REQUIREDfor an administrator without a recent sign-in;CONFLICT(409) when the agent is not suspended;INVALID_TRANSITION(409) when it has expired (extend or clearexpiresAtwithupdatefirst);NOT_FOUNDfor a deleted agent.
The agent returns to active with its keys, roles, and delegations as they were. Delegated sessions and session
tokens ended by the suspension do not come back; the agent opens new ones. Its standing stays other than ok while its
sponsor is inactive.
Prop
Type
A AgentSummary object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/resume" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.resume(
credential: CredentialInput,
input: { tenantId: string; agentId: string },
): Promise<AgentSummary>signCard
Signs an agent's A2A (Agent2Agent) agent card, so other agents can check that it is a registered agent in good standing of your organization.
Used inAI agents
- Permission: None for the agent itself with its own unscoped API key (not a key with
scopes, and not a session token, role or delegated session); none for its sponsor in their own session; otherwiseiam:agents:updateon the agent. - Audited as:
agent:card-sign, with the card'surland the attestation's expiry; an administrator's call also asiam:agents:update. - Errors:
FEATURE_DISABLED(403) without thea2aoption;INVALID_INPUTwhen the agent has no registeredurl, when the card'surl, anadditionalInterfaces[].urlor asupportedInterfaces[].urlis not on that URL's origin, or when the card is not a JSON object with anameof 1 to 256 characters (or is larger than 64 KiB);INVALID_IDENTITY(409) when the agent is not in good standing;NOT_FOUNDwhen the id is not an agent of this tenant;ACCESS_DENIEDfor anyone else, including another agent's key or a scoped key of the agent itself.
Pass the card as card. IAM drops any signatures and any attestation already in the card and sets provider to the
tenant's name at the agent's registered origin, whatever the card said. It then adds the extension
urn:better-iam:a2a:attestation:v1 to capabilities.extensions. Its params are issuer,
tenantId, organization, agentId, agentName, sponsored: true, delegable, model, provider, protocols,
and issuedAt/expiresAt (ISO 8601, a2a.cardLifetimeSeconds apart, one hour by default). IAM signs the RFC 8785
canonical form of the card (without signatures) as a detached JWS: alg EdDSA or ES256, the key's kid, typ
JOSE, and jku when a2a.jwksUrl is set. The result is { card, attestation, expiresAt }. card carries one
entry in signatures, and expiresAt is in epoch milliseconds.
Verifiers check the card against the deployment's public card keys (iam.a2a.jwks(), served at a2a.jwksUrl) with
verifyAgentCard or discoverAgent from @better-iam/a2a. Suspending, deleting, or un-sponsoring the agent stops new
signatures at once, and signed cards stop verifying when their attestation expires. An agent's A2A server usually
re-signs its own card with createCardAttestor.
const { card } = await iam.api.agents.signCard(
{ token: agentKey },
{ tenantId, agentId, card: { name: 'Triage', url: 'https://triage.acme.test/a2a', skills: [] } },
);Prop
Type
A SignedAgentCard object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/signCard" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>",
"card": {}
}'iam.api.agents.signCard(
credential: CredentialInput,
input: { tenantId: string; agentId: string; card: Record<string, unknown> },
): Promise<SignedAgentCard>standing
Tells whether an agent may act right now and, if not, why.
- Permission:
iam:agents:readon the agent, or none for its sponsor in their own session. - Audited as:
iam:agents:readfor administrators; not audited for the sponsor. - Errors:
NOT_FOUNDwhen the id is not an agent of this tenant.
The result is { agentId, standing } with one of the values under Sponsors and standing, a
lighter call than get when only the answer matters.
Prop
Type
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/standing" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.standing(
credential: CredentialInput,
input: { tenantId: string; agentId: string },
): Promise<{ agentId: string; standing: AgentStanding }>suspend
Stops an agent at once (the kill switch) and keeps its API keys for resume.
Used inAI agents
- Permission:
iam:agents:updateon the agent, or none for its sponsor in their own session. - Audited as:
agent:suspend, with thereasonand how many delegated sessions and session tokens ended; an administrator's call also asiam:agents:update. - Errors:
CONFLICT(409) when it is already suspended;NOT_FOUNDfor a deleted agent or an id that is not an agent of this tenant;ACCESS_DENIEDfor anyone else.
The agent becomes disabled, and agent.suspended records who suspended it, when, and why (reason, up to 512
characters). Its API keys are refused while it is suspended, and its live delegated sessions and session tokens are
deleted now, so an agent working for people stops mid-task. Delegations stay in place for after resume. No recent
sign-in is needed, so a sponsor can react immediately.
await iam.api.agents.suspend(aliceSession, { tenantId, agentId, reason: 'Looping on the wiki' });Prop
Type
A AgentSummary object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/suspend" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.suspend(
credential: CredentialInput,
input: { tenantId: string; agentId: string; reason?: string },
): Promise<AgentSummary>suspendAll
The organization-wide emergency stop: suspends every active agent of the tenant at once.
Used inAI agents
- Permission:
iam:agents:updateon the tenant; no recent sign-in, so it works during an incident. - Audited as:
agent:suspend-allwith thereason, the filters, and how many agents stopped;agent:suspendfor each agent; andiam:agents:update. - Errors:
INVALID_INPUTwithout areason(up to 512 characters);ACCESS_DENIEDwithout the permission.
Each active agent is suspended exactly as suspend does: its credentials are refused and its live
delegated sessions and session tokens end now. sponsorId, provider, and model narrow the stop to one sponsor's
agents or those running on one provider or model. Agents already suspended are left as they are. The result is
{ suspended, agentIds }; agents come back one at a time with resume.
await iam.api.agents.suspendAll(admin, { tenantId, reason: 'Prompt injection incident' });Prop
Type
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/suspendAll" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"reason": "<reason>"
}'iam.api.agents.suspendAll(
credential: CredentialInput,
input: {
tenantId: string;
reason: string;
sponsorId?: string;
provider?: string;
model?: string;
},
): Promise<{ suspended: number; agentIds: string[] }>update
Changes an agent's name, description, expiry, attributes, profile, or sponsor.
- Permission:
iam:agents:updateon the agent. - Audited as:
iam:agents:update, plusagent:sponsor-change(withfromandto) when the sponsor changes. - Errors:
INVALID_SPONSORwhen the newsponsorIdis not an active person of the tenant;NOT_FOUNDfor a deleted agent or an id that is not an agent of this tenant;INVALID_INPUT,INVALID_POLICY, orINVALID_ACTIONas forcreate.
Fields you leave out keep their values; null clears description, expiresAt, and the optional profile fields, and
attributes replaces the whole set. A new boundary and delegable: false apply to live sessions at once, because
both are read on every decision. Naming a new sponsor is how you bring back an agent whose sponsor left.
// The sponsor left without a successor: hand the agent to someone else.
await iam.api.agents.update(credential, { tenantId, agentId, sponsorId: bobId });A UpdateAgentInput object:
Prop
Type
A AgentSummary object:
Prop
Type
Example HTTP request
Only the required fields are shown; replace each <placeholder>. The response is { "data": … } on success or { "error": { "code", "message" } }.
curl -X POST "$IAM_URL/api/iam/agents/update" \
-H "Authorization: Bearer $BETTER_IAM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Better-IAM: 1" \
-d '{
"tenantId": "<tenantId>",
"agentId": "<agentId>"
}'iam.api.agents.update(
credential: CredentialInput,
input: UpdateAgentInput,
): Promise<AgentSummary>Better IAM is created by Sean Filimon
Last updated