Voxbi Cockpit APIs
All endpoints

Build the interactive calendar for an employee (user)

Builds the interactive home-office and absence calendar for a single Tempus employee (ext_id) over a from/to month-year window within the given PBX tenant. The window must be valid (the to period must be greater than or equal to from) and may not exceed 24 months.

The authenticated user must belong to the same PBX tenant. Viewing another employee's calendar requires absence-validation or home-office-validation scope over that employee; otherwise a 403 is returned. The response is a JSON object whose data payload is assembled by the calendar builder and varies with the requested window.

HTTP: bearerAuth

User bearer token. Default authentication for customer-facing endpoints. Obtain a token by calling POST /login with your credentials, then send it on every subsequent request as Authorization: Bearer <token>. The token inherits the permissions and PBX scope of the authenticated user.

HTTP Authorization Scheme
bearer
Bearer format
Bearer <token>
pbx_id path · string · uuid *
UUID of the PBX tenant.
accept header · string
example: application/json

Request body · required

Request schema
ext_id*string · uuid
UUID of the target Tempus employee whose calendar is built.
example: 550e8400-e29b-41d4-a716-446655440001
from*object
Start of the month-year window (inclusive).
year*integer
≥ 1970≤ 2100
example: 2024
month*integer
≥ 1≤ 12
example: 3
to*object
End of the month-year window (inclusive).
year*integer
≥ 1970≤ 2100
example: 2024
month*integer
≥ 1≤ 12
example: 6

Responses

The assembled interactive calendar for the requested window.
Response schema
ext_idstring · uuid
The target employee id.
month_calendarsobject
Object keyed by `YYYY-MM`; each value is one month grid (days plus week rows).
Free-form object
dataobject
Aggregated calendar data: `public_holidays`, `home_office_module`, `absence_module`, `compiled_workshifts` (seconds of required work per day) and `active_company_id` (nullable).
Free-form object
Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example: Authorization Token is missing
The authenticated user is outside the tenant, or lacks validation scope over the requested employee's calendar.
Response schema
messagestring
example: You are not authorized to view this calendar.
Data Not Found. This error is returned when the requested data is not found.
Response schema
messagearray<string>
[]string
Unprocessable Parameters. This error is returned when a parameter is not valid.
Response schema
messagestring
example: The given data was invalid.
errorsobject
filterarray<string>
[]string
sortarray<string>
[]string
pagearray<string>
[]string
per_pagearray<string>
[]string
post https://cockpit.voxbi.com/api/v1/{pbx_id}/interactive-calendar
Base URL
Request sample
curl -X POST 'https://cockpit.voxbi.com/api/v1/{pbx_id}/interactive-calendar' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  --data '{"ext_id":"550e8400-e29b-41d4-a716-446655440001","from":{"year":2024,"month":3},"to":{"year":2024,"month":6}}'
const response = await fetch('https://cockpit.voxbi.com/api/v1/{pbx_id}/interactive-calendar', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${YOUR_TOKEN}`,
  },
  body: JSON.stringify({
    "ext_id": "550e8400-e29b-41d4-a716-446655440001",
    "from": {
        "year": 2024,
        "month": 3
    },
    "to": {
        "year": 2024,
        "month": 6
    }
}),
});

const data = await response.json();
console.log(data);
import requests

response = requests.post('https://cockpit.voxbi.com/api/v1/{pbx_id}/interactive-calendar',
    headers={'Authorization': f'Bearer {YOUR_TOKEN}'},
    json={
    "ext_id": "550e8400-e29b-41d4-a716-446655440001",
    "from": {
        "year": 2024,
        "month": 3
    },
    "to": {
        "year": 2024,
        "month": 6
    }
}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
        'content' => '{
    \"ext_id\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"from\": {
        \"year\": 2024,
        \"month\": 3
    },
    \"to\": {
        \"year\": 2024,
        \"month\": 6
    }
}',
    ],
]);

$response = file_get_contents('https://cockpit.voxbi.com/api/v1/{pbx_id}/interactive-calendar', false, $context);
$data = json_decode($response, true);
print_r($data);
Sample request
{}
"ext_id": "550e8400-e29b-41d4-a716-446655440001",
"from": {},
"year": 2024,
"month": 3
},
"to": {}
"year": 2024,
"month": 6
}
}
{}
"ext_id": "550e8400-e29b-41d4-a716-446655440002",
"month_calendars": {},
"2026-07": {}
"key": "2026-07",
"year": 2026,
"month_index": 7,
"month_name": "July",
"formatted_date": "2026-06-29 - 2026-08-02",
"data": {},
"2026-07-14": {}
"day": 14,
"day_of_week": 2,
"is_same_month": true,
"entry": {},
"type": "public-holiday",
"id": "550e8400-e29b-41d4-a716-446655440000",
"date": "2026-07-14"
},
"entries": []
{}
"type": "public-holiday",
"id": "550e8400-e29b-41d4-a716-446655440000",
"date": "2026-07-14"
}
]
}
},
"weeks": []
{}
"week_of_year": 28,
"dates": []
"2026-07-06",
"2026-07-07",
"2026-07-08",
"2026-07-09",
"2026-07-10",
"2026-07-11",
"2026-07-12"
]
}
]
}
},
"data": {}
"public_holidays": {},
"550e8400-e29b-41d4-a716-446655440000": {}
"id": "550e8400-e29b-41d4-a716-446655440000",
"date": "2026-07-14",
"name": "National Day"
}
},
"home_office_module": {},
"module_enabled": true,
"has_permission_to_validate": true,
"has_permission_to_request": true,
"calendar": {},
"approved_days": [],
"2026-07-20"
],
"requested_days": [],
"2026-07-27"
],
"removed_days": [],
"comment": ""
},
"summary": {},
"2026": {}
"used": 5,
"allowance": 40,
"remaining": 35
}
},
"validated_dates": []
},
"absence_module": {},
"module_enabled": true,
"has_permission_to_validate": true,
"has_permission_to_request": true,
"absences": [],
"absence_requests": [],
"absence_removals": [],
"summary": {}
"2026": {}
"possible": "25 days",
"taken": "5 days",
"remaining": "20 days"
}
}
},
"compiled_workshifts": {},
"2026-07-01": 28800,
"2026-07-14": 0
},
"active_company_id": "550e8400-e29b-41d4-a716-446655440030"
}
}
{}
"error": "Authorization Token is missing"
}
Cache-Control string
example: private, must-revalidate
Connection string
example: keep-alive
Content-Type string
example: application/json
Vary string
example: Origin
X-RateLimit-Limit integer
Max requests allowed in the current rate-limit window.
example: 60
X-RateLimit-Remaining integer
Requests remaining in the current rate-limit window.
example: 57
No example for this status.
{}
"message": []
"Data not found"
]
}
Cache-Control string
example: private, must-revalidate
Connection string
example: keep-alive
Content-Type string
example: application/json
Vary string
example: Origin
X-RateLimit-Limit integer
Max requests allowed in the current rate-limit window.
example: 60
X-RateLimit-Remaining integer
Requests remaining in the current rate-limit window.
example: 57
{}
"errors": {}
"filter": [],
"The filter field must be an array."
],
"sort": [],
"The sort field must be a string."
],
"page": [],
"The page field must be an integer."
],
"per_page": []
"The per page field must be an integer."
]
}
}
Cache-Control string
example: private, must-revalidate
Connection string
example: keep-alive
Content-Type string
example: application/json
Vary string
example: Origin
X-RateLimit-Limit integer
Max requests allowed in the current rate-limit window.
example: 60
X-RateLimit-Remaining integer
Requests remaining in the current rate-limit window.
example: 57