A machine client signs in as itself with the client credentials grant, and your API authorizes it with the same checks it uses for people.
POST /oauth/token
grant_type=client_credentials
client_id=…
client_secret=…
audience=https://api.example.comA machine client is a principal of its own, not a shared key with broad access.
Assigned like a person's roles, and held to the same limit on what can be granted.
A client can act inside a single customer, and hold roles nowhere else.
Each token names the API it is for, from the audiences the client may ask for.
With token exchange, a machine client swaps a signed-in person's token for a delegated one. It names the person and the client, so your API always knows who asked and what acted.
POST /oauth/token
grant_type=urn:ietf:params:oauth:grant-type:token-exchange
subject_token=<the person's access token>
subject_token_type=urn:ietf:params:oauth:token-type:access_tokenA delegated token carries only the permissions both hold, and a check can name the acting client so both are asked.
What a machine can do follows what you set, and every use of it leaves a record.
Rotate a secret while the old one keeps working for a window, so nothing breaks mid-deploy.
Deactivating a client or removing a role applies at its next token request.
Every exchange, issued or refused, is in the audit log under the client, naming the person.
When you allow it, an organization creates credentials for its own systems from the hosted portal.
In the hosted portal, beside the organization's other settings.
By the list you set, and by what the person giving the role holds.