Clients API
Client API access follows the current Keito permissions of the user bound to the credential. A full-access key does not make that user an Administrator.
Permissions
| Identity | Read | Create and update | Archive, restore, delete |
|---|---|---|---|
| Owner or Administrator | All workspace clients | Yes | Yes |
| Manager with Edit clients and tasks | The same clients visible in Keito | Yes | No |
| Other active internal user | The same clients visible in Keito | No | No |
| Personal read-only sync key | List and item reads only | No | No |
Role, Manager-permission, membership, and key-binding changes are checked on every request. External Client members cannot use a general API credential.
List Clients
GET /api/v2/clients
Supported query parameters are is_active, updated_since, page, and per_page.
curl "https://app.keito.ai/api/v2/clients?is_active=true&per_page=100" \
-H "Authorization: Bearer $KEITO_API_KEY" \
-H "Keito-Account-Id: $KEITO_ACCOUNT_ID"
Get a Client
GET /api/v2/clients/{id}
A successful item read returns an ETag. Keep it if you may update or delete the client later.
Create a Client
POST /api/v2/clients
curl -X POST "https://app.keito.ai/api/v2/clients" \
-H "Authorization: Bearer $KEITO_API_KEY" \
-H "Keito-Account-Id: $KEITO_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: client-create-001" \
--data '{"name":"Example client","currency":"GBP","payment_terms":"net_30"}'
Create accepts name, address, currency, payment_terms, payment_days, tax, tax2, discount, and is_active. Custom payment terms require payment_days; other terms reject it. A successful create returns 201 Created, Location, and ETag.
Update, Archive, or Restore
PATCH /api/v2/clients/{id}
Send at least one writable property. Unknown and read-only properties are rejected. Use is_active: false to archive and is_active: true to restore; those status changes are Owner/Administrator-only.
curl -X PATCH "https://app.keito.ai/api/v2/clients/$CLIENT_ID" \
-H "Authorization: Bearer $KEITO_API_KEY" \
-H "Keito-Account-Id: $KEITO_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-H 'If-Match: "etag-from-the-latest-read"' \
-H "Idempotency-Key: client-update-001" \
--data '{"address":"1 Example Street"}'
If-Match is optional for PATCH but strongly recommended. A stale value returns 412 Precondition Failed. Archiving a client with active projects returns 409 Conflict.
Permanently Delete a Client
DELETE /api/v2/clients/{id}
Permanent deletion is Owner/Administrator-only. The client must already be archived, must have a current If-Match, and must have no blocking projects or financial documents. Otherwise Keito returns 409, 412, or 428 without deleting anything.
Use a disposable test client and archive it before testing deletion. Deletion cannot be undone.
Safe Retries and Request Rules
Mutation requests may include an Idempotency-Key containing 8–255 letters, numbers, dots, underscores, or hyphens. The same key, request, precondition, and authorization context replays the stored response for 24 hours. Reusing a key for different input, after a permission change, or while the original request is still running returns 409.
Bodies must be uncompressed UTF-8 application/json, are limited to 128 KiB, and use strict schemas. Responses are private, no-store.