Service Accounts API

Manage service accounts and their API keys: create, list, update, rotate, and revoke.

GET/api/v0/service-accounts

List service accounts

Returns all service accounts in the authenticated organization. Requires human authentication with a Manager role or higher; service account credentials are rejected.

cURL
curl 'https://api.factory.ai/api/v0/service-accounts' \
  -H 'Authorization: Bearer $FACTORY_API_KEY'

Responses

200Response for status 200
serviceAccountsobject[]required
idstringrequired
namestringrequired
descriptionstring
statusstringrequired

Allowed values

activeinactivedeleted
createdBystringrequired
teamIdsstring[]
createdAtnumberrequired

Unix epoch milliseconds when the service account was created

updatedAtnumber

Unix epoch milliseconds when the service account was last updated

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

402Response for status 402
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

POST/api/v0/service-accounts

Create a service account

Creates a new service account in the authenticated organization. Requires human authentication with a Manager role or higher; service account credentials are rejected.

cURL
curl -X POST 'https://api.factory.ai/api/v0/service-accounts' \
  -H 'Authorization: Bearer $FACTORY_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ ... }'

Request body

namestringrequired
descriptionstring
statusstringrequired

Allowed values

activeinactive

Responses

201Response for status 201
serviceAccountobjectrequired
idstringrequired
namestringrequired
descriptionstring
statusstringrequired

Allowed values

activeinactivedeleted
createdBystringrequired
teamIdsstring[]
createdAtnumberrequired

Unix epoch milliseconds when the service account was created

updatedAtnumber

Unix epoch milliseconds when the service account was last updated

400Response for status 400
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

402Response for status 402
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

409Response for status 409
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

GET/api/v0/service-accounts/{serviceAccountId}

Get a service account

Returns a single service account by ID. Requires human authentication with a Manager role or higher; service account credentials are rejected.

cURL
curl 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}' \
  -H 'Authorization: Bearer $FACTORY_API_KEY'

Parameters

serviceAccountIdstringpathrequired

Service account ID

Responses

200Response for status 200
serviceAccountobjectrequired
idstringrequired
namestringrequired
descriptionstring
statusstringrequired

Allowed values

activeinactivedeleted
createdBystringrequired
teamIdsstring[]
createdAtnumberrequired

Unix epoch milliseconds when the service account was created

updatedAtnumber

Unix epoch milliseconds when the service account was last updated

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

402Response for status 402
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

PATCH/api/v0/service-accounts/{serviceAccountId}

Update a service account

Updates a service account description or status. Name is immutable. Requires human authentication with a Manager role or higher; service account credentials are rejected.

cURL
curl -X PATCH 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}' \
  -H 'Authorization: Bearer $FACTORY_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ ... }'

Parameters

serviceAccountIdstringpathrequired

Service account ID

Request body

descriptionstring
statusstring

Allowed values

activeinactive

Responses

200Response for status 200
serviceAccountobjectrequired
idstringrequired
namestringrequired
descriptionstring
statusstringrequired

Allowed values

activeinactivedeleted
createdBystringrequired
teamIdsstring[]
createdAtnumberrequired

Unix epoch milliseconds when the service account was created

updatedAtnumber

Unix epoch milliseconds when the service account was last updated

400Response for status 400
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

402Response for status 402
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

DELETE/api/v0/service-accounts/{serviceAccountId}

Delete a service account

Soft-deletes a service account. Tears down all computers owned by the SA and purges stored git credentials (best-effort). Requires human authentication with a Manager role or higher; service account credentials are rejected.

cURL
curl -X DELETE 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}' \
  -H 'Authorization: Bearer $FACTORY_API_KEY'

Parameters

serviceAccountIdstringpathrequired

Service account ID

Responses

200Response for status 200
idstringrequired

Service account ID that was deleted

deletedbooleanrequired

Always true; present so clients can distinguish a 200 delete from a 200 get

Allowed values

true
401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

GET/api/v0/service-accounts/{serviceAccountId}/api-keys

List service account API keys

Returns all API keys for a service account, active and inactive. Each item carries `isRevoked`, `expiresAt`, and `revokedAt` so clients can split them into active/inactive views.

cURL
curl 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}/api-keys' \
  -H 'Authorization: Bearer $FACTORY_API_KEY'

Parameters

serviceAccountIdstringpathrequired

Service account ID

Responses

200Response for status 200
apiKeysobject[]required
idstringrequired

API key ID

namestringrequired

Human-readable name for the key

fingerprintstringrequired

Non-reversible suffix for display

createdAtnumberrequired

Unix epoch milliseconds when the key was created

expiresAtnumber

Unix epoch milliseconds when the key expires, if set

isRevokedbooleanrequired

Whether the key has been revoked (soft-deleted)

revokedAtnumber

Unix epoch milliseconds when the key was revoked, if revoked

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

402Response for status 402
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

POST/api/v0/service-accounts/{serviceAccountId}/api-keys

Create a service account API key

Mints a new API key for a service account and returns the one-time key value. The value is shown only once and cannot be retrieved later.

cURL
curl -X POST 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}/api-keys' \
  -H 'Authorization: Bearer $FACTORY_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ ... }'

Parameters

serviceAccountIdstringpathrequired

Service account ID

Request body

namestringrequired
expiresAtinteger

Responses

201Response for status 201
apiKeyobjectrequired
idstringrequired

API key ID

valuestringrequired

One-time presentation key value, returned only on creation

fingerprintstringrequired

Non-reversible suffix for display

namestringrequired

Human-readable name for the key

expiresAtnumber

Unix epoch milliseconds when the key expires, if set

400Response for status 400
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

402Response for status 402
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

409Response for status 409
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

POST/api/v0/service-accounts/{serviceAccountId}/api-keys/{keyId}/revoke

Revoke a service account API key

Revokes an API key for a service account. Once revoked, the key can no longer authenticate. Idempotent.

cURL
curl -X POST 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}/api-keys/{keyId}/revoke' \
  -H 'Authorization: Bearer $FACTORY_API_KEY'

Parameters

serviceAccountIdstringpathrequired

Service account ID

keyIdstringpathrequired

API key ID

Responses

204Response for status 204
401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

POST/api/v0/service-accounts/{serviceAccountId}/api-keys/{keyId}/rotate

Rotate a service account API key

DESTRUCTIVE: atomically revokes the existing key and issues a replacement that inherits its name, returning the new one-time key value (shown only once). The previous key stops authenticating the instant this call succeeds, so any client still using it will immediately start failing with 401. Update every consumer with the new value before rotating, or set `gracePeriodMinutes` to keep the old key valid for a short overlap window.

cURL
curl -X POST 'https://api.factory.ai/api/v0/service-accounts/{serviceAccountId}/api-keys/{keyId}/rotate' \
  -H 'Authorization: Bearer $FACTORY_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ ... }'

Parameters

serviceAccountIdstringpathrequired

Service account ID

keyIdstringpathrequired

API key ID

Request body

expiresAtinteger
gracePeriodMinutesinteger

How long (0-10 minutes) the rotated-from key stays valid after rotation. Omit or 0 revokes it immediately. Rejected with a 400 if the key would expire before the grace window ends (the grace period never extends a key lifetime).

Responses

200Response for status 200
apiKeyobjectrequired
idstringrequired

API key ID

valuestringrequired

One-time presentation key value, returned only on creation

fingerprintstringrequired

Non-reversible suffix for display

namestringrequired

Human-readable name for the key

expiresAtnumber

Unix epoch milliseconds when the key expires, if set

400Response for status 400
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

401Response for status 401
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

403Response for status 403
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

404Response for status 404
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

409Response for status 409
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values

500Response for status 500
detailstringrequired

Human-readable error message

statusnumberrequired

HTTP status code

titlestringrequired

HTTP status title

metadataobject (map)

Additional error metadata

Values