POST /api/v1/closer-invitations
Invite a closer. All access is scoped to the school bound to the credential.
Authenticate with Authorization: Bearer YOUR_API_KEY. Owner, admin or Head of Sales. A platform role alone grants no access; other school members are refused. A Head of Sales invites closers only — the invitation carries no role choice, and a setter, an admin or another Head of Sales cannot be invited. Agent credentials have the same business rules.
Idempotency-Key is required. Reuse it only for an identical intention. A changed payload returns 409.
{
"email": "sales@example.com"
}Unknown properties are refused. Organization, actor and role are never supplied in the body.
curl -X POST 'https://www.cohorte.io/api/v1/closer-invitations' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Idempotency-Key: closer-request-1' \
-H 'Content-Type: application/json' \
--data '{"email": "sales@example.com"}'200 on success. 400 invalid input, 401 invalid credential, 403 unavailable scope, 409 conflicting intention or invitation state. A response never grants access by itself.
The envelope contains success, data and correlationId. id identifies the invitation; email is the invited address. status is pending, accepted, cancelled or rejected; a pending invitation past expiresAt is expired and cannot be accepted. deliveryStatus reports actual sent, pending, skipped or failed delivery. Accepted entries in the list include setup readiness; revoked closer access is not ready. The list returns at most 100 invitations, newest first.
{
"success": true,
"data": {
"id": "00000000-0000-4000-8000-000000000003",
"organizationId": "00000000-0000-4000-8000-000000000001",
"email": "sales@example.com",
"inviterId": "00000000-0000-4000-8000-000000000002",
"status": "pending",
"expiresAt": "2030-01-08T12:00:00.000Z",
"acceptedUserId": null,
"acceptedAt": null,
"deliveryStatus": "sent",
"deliveryVersion": 1,
"createdAt": "2030-01-01T12:00:00.000Z"
},
"correlationId": "00000000-0000-4000-8000-000000000003"
}Use MCP invite_closer with the same business input. Mutations require explicit operator intent. Invitation acceptance is human-only and has no MCP tool.
A sent email is distinct from an accepted invitation and from a ready closer. Disabled or failed email delivery is reported honestly; resend is explicit. New contacts are assigned to the closer of their first booking only when unassigned. If A owns a contact and B receives its call, A remains responsible and B sees only the call. Only an owner, an admin or a Head of Sales transfers responsibility, and a transfer never changes the closer of existing bookings. Historical ambiguous contacts remain unassigned and require an owner decision. Removing membership removes its commercial assignments, preserving contact history.
Personal draft hours do not activate a closer or enroll them in booking links. Owner/admin explicitly adopts prepared hours and selects booking links. Your personal IANA time zone defines your hours and exception dates, including after school configuration. Changing it preserves the entered wall-clock hours and never moves existing bookings. Travelling or changing the school time zone does not change it. Owner/admin adoption copies both the hours and their time zone. Calendar connection is optional.