Add (or update) a list of locations, services, or staff members from a CSV file. The endpoint accepts a directory_type path parameter that determines the type of directory to import. The CSV must use comma as the column separator. For pipe-separated multi-value fields, use pipe (|) as the list separator and colon (:) as the key-value separator. The CSV columns vary per type — see each section below.
locations — CSV columns
-
LOCATION_ID
- optional
- External identifier of the location. If omitted, a random UUID is generated. Used as the upsert key.
-
LOCATION_NAME
- required
- Name of the location.
-
LOCATION_ALTERNATIVE_NAMES
- optional
- Alternative names separated by |. Example: Store A|Store B
-
LOCATION_TYPE
- optional
- Type/category of the location. Free text.
-
ADDRESS_STREET
- required
- Street address of the location.
-
ADDRESS_POSTAL_CODE
- required
- Postal/zip code of the location.
-
ADDRESS_CITY
- optional
- City of the location.
-
ADDRESS_REGION
- optional
- Region or state (country subdivision).
-
COUNTRY_NAME
- required
- Country name.
-
LOCATION_PICTURE_URL
- optional
- Public image URL. Must start with http:// or https:// and end in .jpg, .jpeg, .png, or .webp. Max 1MB, 550x220px.
-
PHONE_NUMBER
- optional
- Phone numbers. Format per entry: number:label. Multiple entries separated by |. Example: +12029182132:Main|+12029182133:Fax
-
TIMEZONE
- required
- IANA timezone ID. Example: America/Los_Angeles, Europe/Lisbon.
-
BUSINESS_MON / BUSINESS_TUE / BUSINESS_WED / BUSINESS_THU / BUSINESS_FRI / BUSINESS_SAT / BUSINESS_SUN
- optional
- Business hours per weekday. Format per slot: hh:mmAM-hh:mmPM. Multiple slots separated by |. Example: 09:00AM-01:00PM|02:00PM-05:00PM
-
SPECIAL_DATES
- optional
- JSON array of special dates/holidays. Each element has the fields name, date (yyyy-MM-dd), repeat_rule (DOES_NOT_REPEATS, MONTHLY, or YEARLY), business_hours (array of open_at/close_at in HH:mm:ss), and notes.
staffs — CSV columns
-
STAFF_ID
- optional
- External identifier of the staff member. If omitted, a random UUID is generated.
-
NAME
- required
- Full name of the staff member.
-
DESCRIPTION
- optional
- Bio or description of the staff member.
-
SPECIALTIES
- optional
- Specialties separated by |. Example: cardiology|pediatrics
-
PRONOUNS
- optional
- Pronouns. Example: she/her, he/his, they/them
-
MANAGER
- optional
- Name of the direct manager/supervisor.
-
JOB_TITLE
- optional
- Professional title. Example: Senior Cardiologist
-
CONTACT
- optional
- Contact entries separated by |. Format per entry: type:value or type:value:description. Example: phone:+12029182132:Work|email:[email protected]:Work Email
-
PHOTO_URL
- optional
- Public photo URL. Must start with http:// or https:// and end in .jpg, .jpeg, .png, or .webp.
-
GENDER
- optional
- Gender of the staff member. Free text.
-
LANGUAGES
- optional
- Languages spoken, separated by |. Example: English|Spanish
-
DATE_OF_BIRTH
- optional
- Date of birth. Format: yyyy-MM-dd or yyyy/MM/dd. Example: 1980-05-15
-
EMPLOYMENT_START_DATE
- optional
- Date of hire. Format: yyyy-MM-dd or yyyy/MM/dd. Example: 2018-03-01
-
LOCATION_AND_SERVICE_NAMES
- optional
- Location/service relationships separated by |. Format per entry: locationExternalId:serviceExternalId. Either part may be empty (e.g. :serviceId or locationId:). Both IDs must exist for the account, and the service must belong to the referenced location. Example: loc-id-1:svc-id-1|loc-id-2:
-
VISIT_TYPES
- optional
- Visit types separated by |. Format per entry: id:name. Example: in-person:In-Person|virtual:Virtual
-
TAGS
- optional
- JSON array of tag objects. Each element has the fields tag_name, background_color, and text_color (hex). Example: [{"tag_name":"VIP","background_color":"#EFDBFF","text_color":"#391085"}]
services — CSV columns
-
SERVICE_ID
- optional
- External identifier of the service. If omitted, a random UUID is generated.
-
SERVICE_NAME
- required
- Name of the service.
-
DESCRIPTION
- required
- Description of the service.
-
SERVICE_TYPE
- optional
- Type/category of the service. Free text.
-
DURATION
- optional
- Duration of the service. Free text. Example: 30-45 minutes
-
VIRTUAL_LOCATION_URL
- optional
- URL for virtual/online appointments.
-
PRICE
- optional
- Price of the service. Free text. Example: 50$, Free
-
PHONE_NUMBER
- optional
- Phone numbers. Format per entry: number:label. Multiple entries separated by |. Example: +12029182132:Appointments
-
TIMEZONE
- optional — required when any BUSINESS* column or SPECIAL_DATES is provided_
- IANA timezone ID. Example: Europe/Lisbon.
-
BUSINESS_MON / BUSINESS_TUE / BUSINESS_WED / BUSINESS_THU / BUSINESS_FRI / BUSINESS_SAT / BUSINESS_SUN
- optional
- Business hours per weekday. Format per slot: hh:mmAM-hh:mmPM. Multiple slots separated by |. Example: 09:00AM-01:00PM|02:00PM-05:00PM
-
LOCATIONS
- optional
- External IDs of associated locations separated by |. Each ID must exist for the account. Example: loc-ext-id-1|loc-ext-id-2
-
SPECIAL_DATES
- optional
- JSON array of special dates/holidays. Each element has the fields name, date (yyyy-MM-dd), repeat_rule (DOES_NOT_REPEATS, MONTHLY, or YEARLY), business_hours (array of open_at/close_at in HH:mm:ss), and notes.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
202The file has been accepted and will be processed asynchronously.