Skip to content

Instructors in the professional directory

Teaching is a mode of a profession, not a profession of its own. A grooming instructor is a GROOMER row that teaches. Every specialization on a profile therefore carries a practice mode and, when it teaches, the audiences it teaches.

FieldTypeMeaning
practiceModeCodePRACTICES | TEACHES | BOTHPRACTICES: does the work (every row before 2026-10-06). TEACHES: teaches it and no longer does the work. BOTH: does both.
teachingAudienceCodesstring[]Whom a teaching row teaches. Any of PROFESSIONALS (the trade: students, apprentices, other pros), PET_OWNERS (classes, workshops) and PUBLIC (schools, kids, community). Empty for PRACTICES, at least one otherwise.
instructorVerifiedbooleanThe profile holds an instructor credential that an administrator reviewed. Only true on a teaching row. A self-declared teacher is false.

The fields appear on directory rows (GET /api/profile/v1/{locale}/Profile/professionals) and on a profile’s specializations (GET …/Profile/profiles/{id}/specializations, PascalCase there). A response from an older host omits them, so read a missing practiceModeCode as PRACTICES.

QueryLists
?kind=GROOMERGroomers who do the work: PRACTICES and BOTH rows. A teach-only row is not listed. This changed on 2026-10-06.
?kind=GROOMER&teaches=trueGrooming instructors: TEACHES and BOTH rows.
?kind=GROOMER&teaches=true&audience=PET_OWNERSGrooming instructors who teach pet owners. An unknown audience returns no rows.
?teaches=true (no kind)Instructors of every profession; each row’s professionalKindCode is the profession it teaches.

teaches accepts true or 1. Without teaches, kind stays required and audience is ignored. Species, breed, location and q filters combine as before, and GET …/Profile/professionals/locations accepts the same teaches and audience parameters, so its counts match the list.

{
"id": "0199b2c4-…", "handle": "mariesgroomingacademy", "displayName": "Marie's Grooming Academy",
"city": "Laval", "countryCode": "CA", "subdivisionCode": "QC",
"speciesId": 1, "speciesName": "Dog",
"professionalKindCode": "GROOMER",
"practiceModeCode": "BOTH",
"teachingAudienceCodes": ["PROFESSIONALS", "PET_OWNERS"],
"instructorVerified": true
}

POST …/Profile/profiles/{profileId}/specializations accepts optional practiceModeCode and teachingAudienceCodes. PUT …/Profile/profiles/{profileId}/specializations/{specializationId}/teaching with { "practiceModeCode": "BOTH", "teachingAudienceCodes": ["PUBLIC"] } changes them on an active row. To change the animals or the primary flag at the same time, use PUT …/Profile/profiles/{profileId}/specializations/{specializationId} with the row’s full new state (speciesId, breedId, isPrimary, practiceModeCode, teachingAudienceCodes). A new species or breed replaces the row, so read Id from the response: it is the id of the row now active. Both are acting-profile writes: 401 without a signed-in caller, 403 for a caller who may not act for {profileId}, and Write.Failed for a teaching mode without an audience or a PRACTICES row with one.