Holidays
Public API

Bulk Create Company Holidays

Changed on

Creates multiple company holidays in one synchronous call. Each record follows the single-create semantics: it may be fully-specified or carry a globalHolidayUuid that seeds name, dates, and countries from the global catalog entry (mix-and-match within the same request). Records are processed in request order.

OAuth Scopes: holidays.write

post/api/v1/holidays/bulk-insert

Request

Query parameters

atomicboolean

When true, the entire batch is committed in a single transaction and any per-record failure aborts the whole request with a 422 (no records are created). When false, each record commits independently and failures are reported per record in a 207 response. Accepted values: true/false, 1/0, yes/no, on/off.

returnRecordsboolean

When true, each entry in the response records array also includes the full created company holiday under the record key. Accepted values: true/false, 1/0, yes/no, on/off.

Request body

globalHolidayUuidstring uuid nullable

UUID of a global catalog entry. When supplied, the server seeds name, startDate, endDate, and countryCodes from the catalog entry; partner-supplied values override the catalog defaults.

namestring nullable

The name of the holiday. Required when globalHolidayUuid is not supplied. 1-255 characters.

startDatestring date nullable

The start date of the holiday. Required when globalHolidayUuid is not supplied.

endDatestring date nullable

The end date of the holiday. Null means a single-day holiday. Must be greater than or equal to startDate.

isPublicboolean

Whether the holiday is visible to all employees on calendars, independent of audience. Defaults to true.

countryCodesstring[] nullable

Country filter as ISO 3166-1 alpha-2 codes. An empty array means no country filter. When omitted on a catalog-referenced create, the catalog entry's country is used.

Example request

[
  {
    "name": "Independence Day",
    "startDate": "2026-07-04",
    "endDate": "2026-07-05",
    "countryCodes": [
      "US",
      "CA"
    ],
    "holidayPay": {
      "defaultHours": "8.00",
      "hoursByEmploymentStatus": [
        {
          "employmentStatusListValueId": 17946,
          "hours": "5.00"
        }
      ],
      "multiplier": "1.50"
    }
  }
]

Response

All records were created successfully.

status'success' | 'partial_success' | 'failed'

Overall batch outcome

operationstring

Operation type for this bulk request

totalRequestedinteger

Total number of records in the request

totalProcessedinteger

Total number of records created successfully

failedinteger

Total number of records that failed

Example response

{
  "status": "success",
  "operation": "insert",
  "totalRequested": 3,
  "totalProcessed": 2,
  "failed": 1,
  "errors": [
    {
      "recordIndex": 1,
      "type": "https://api.bamboohr.com/problems/conflict",
      "title": "Catalog holiday already imported.",
      "status": 409,
      "detail": "The supplied globalHolidayUuid already exists on an active company holiday.",
      "code": "catalog_holiday_already_imported"
    }
  ],
  "records": [
    {
      "id": 101,
      "status": "inserted",
      "httpStatus": 201,
      "record": {
        "id": 42,
        "name": "Independence Day",
        "startDate": "2026-07-04",
        "endDate": "2026-07-05",
        "countryCodes": [
          "US",
          "CA"
        ],
        "holidayPay": {
          "defaultHours": "8.00",
          "hoursByEmploymentStatus": [
            {
              "employmentStatusListValueId": 17946,
              "hours": "5.00"
            }
          ],
          "multiplier": "1.50"
        },
        "createdAt": "2026-04-30T18:00:00Z",
        "updatedAt": "2026-04-30T18:00:00Z"
      }
    }
  ]
}

Changes