Invite someone onto the team
Owner only. Creates the invitation and emails the link, in the organization’s name. Valid for 7 days, one pending invite per address per customer.
The answer says nothing about whether that address already has an account here. The one conflict it does report — already_member — is membership of the caller’s own team, which they can already read off GET /v1/contact/customer/members. Every other case takes the identical path.
Each request mails somebody else’s inbox, so this route is limited strictly: per contact session and per client IP.
Authorizations
A contact session token, uk_ct_…. Belongs to one of the developer's own users, and reads only that user's data.
Headers
The customer this call is acting inside — the same arrangement as X-Organization-Id, one plane down. Switching customers is navigation, not a mutation: nothing is stored, you send a different header, and the membership JOIN behind it decides what you may do there. An id you are not a member of matches no row and answers 404. Absent, the contact's oldest membership answers.
Body
Response
Invited.
A seat offered to an address. It is a credential, so only its id and address are ever readable — the token exists once, in the email.