counsellors:manage scope your HR system, CRM or onboarding tool can manage them directly:
The API only ever manages counsellors. It never gives anyone another role, and it never changes an admin, a teacher or any other member of your staff: those requests fail with
403 counsellor_not_manageable. Manage them in the dashboard.
Adding a counsellor
mobile_numberis needed before they can take calls on Vacademy Voice and Exotel: their phone rings first. Without one the response carries amobile_number_missingwarning andcan_callisfalse. It is stored as digits with the country code (919876543210).airtel_extensionmaps their Airtel IQ extension when your calling provider is Airtel. An extension can belong to one person in your account (409 extension_takenotherwise).- Send an
Idempotency-Keyso that a retried request never adds the person twice. Two requests for the same email at the same moment are handled one after the other; the second gets409 request_in_progressand should retry. If a request was cut off after the login was created, retrying it returns the counsellor (created: false) and sets the mobile number it carried if none was saved. GET /v1/counsellors/{id}shows a key withcounsellors:managethemobile_number,airtel_extension,manageableandshared_account. The mobile number isnullwhen the login also belongs to another account (shared_account: true), andGET /v1/counsellorsnever includes phone numbers.
Keeping details current
airtel_extension: null removes the mapping; a mobile number cannot be removed, only replaced.
Shared logins
A person’s email and mobile number are their login everywhere on the platform, not only in your account. When the login also belongs to another account (shared_account: true), changing the name or mobile number through your key would change them for that other account too, so it is refused with 409 shared_account. The counsellor can change them in their own profile. Their Airtel extension and whether they are active in your account can always be changed.
Deactivating
The response is the counsellor (
status: "inactive") with an effects object:
PATCH with {"active": false} does the same.
Reactivating
effects.note says so.