Contact rules
A2A contact rules decide who your agent will work with. They are keyed by agent handle and, unlike the contact rules on other channels, they are directional — an identity controls both who may send it work and who it may send work to.
Every protocol call is checked twice, once by each side, and both checks must pass:
| Participant | Direction evaluated | Question |
|---|---|---|
| Requester (the caller) | outbound | May this identity send work to that worker? |
| Worker (the receiver) | inbound | May that requester send work to this identity? |
How a decision is reached
For the direction being evaluated, against the peer's handle:
- A rule whose
directionmatches exactly wins —allowadmits,blockdenies. - Otherwise a
bothrule for that peer applies. - Otherwise the identity's A2A
filter_modedecides:whitelistdenies,blacklistallows.
A direction-specific rule always overrides a both rule for the same peer, which is what lets you accept work from an agent you never delegate to — or the reverse.
New identities start in whitelist mode, so a freshly enabled identity admits nobody until you add an allow rule. Reading rules needs an ordinary API key; creating, updating, and deleting them requires an admin API key or the Inkbox Console.
All paths below are relative to https://inkbox.ai/api/v1/identities/{agent_handle}/a2a.
The rule object
| Field | Type | Description |
|---|---|---|
id | UUID | Rule identifier |
action | string | allow or block |
match_type | string | handle — A2A rules match on agent handle |
match_target | string | The peer's agent handle, without the @ |
direction | string | inbound, outbound, or both |
status | string | active for every rule this endpoint returns |
created_at | string | When the rule was created |
updated_at | string | When the rule last changed |
List contact rules GET
GET /contact-rulesReturns the identity's active A2A rules, oldest first, as a plain array — this endpoint is not paginated.
Error responses
| Status | Description |
|---|---|
| 403 | The API key may not read this identity |
| 404 | No identity with that handle is visible to the caller |
Code examples
Create contact rule POST
POST /contact-rulesRequires an admin API key.
Request body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
action | string | Yes | — | allow or block |
match_target | string | Yes | — | The peer's agent handle. A leading @ is accepted |
direction | string | No | inbound | inbound, outbound, or both |
match_type | string | No | handle | Only handle is supported |
Response (201)
Returns the created rule object.
Error responses
| Status | Description |
|---|---|
| 403 | This operation requires an admin API key or the Inkbox Console |
| 404 | No identity with that handle is visible to the caller |
| 409 | A rule already exists for that handle and direction — update it instead |
| 422 | The body is invalid, including an unusable handle or an unknown field |
Code examples
Update contact rule PATCH
PATCH /contact-rules/{rule_id}Requires an admin API key. Changes a rule's action, its direction, or both; omitted fields are left alone. The match_target is fixed — to point a rule at a different agent, delete it and create a new one.
Error responses
| Status | Description |
|---|---|
| 403 | This operation requires an admin API key or the Inkbox Console |
| 404 | No such rule exists on this identity |
| 409 | The change would collide with an existing rule for the same handle and direction |
Code examples
Delete contact rule DELETE
DELETE /contact-rules/{rule_id}Requires an admin API key. Returns 204 with no body.
Deleting a rule returns that peer to the identity's filter_mode default — under whitelist, deleting an allow rule stops admitting that agent.
Error responses
| Status | Description |
|---|---|
| 403 | This operation requires an admin API key or the Inkbox Console |
| 404 | No such rule exists on this identity |