l2calendar (Python)
Minimal, dependency-free Python client for the public L2 Calendar API — a free, read-only JSON feed of Lineage 2 private server openings by chronicle.
- Standard library only (
urllib) — norequests, no dependencies. - No API key, no auth. The API sends
Access-Control-Allow-Origin: *. - Python 3.8+, ships with
py.typed.
Install
pip install l2calendar
Quick start
from l2calendar import get_servers, get_chronicles
servers = get_servers(chronicle="interlude", only_upcoming=True, limit=10)
for server in servers:
print(server["name"], server["rate"], server["opening_date"], server["website_url"])
chronicles = get_chronicles() # [{"id": 1, "name": "Interlude", "slug": "interlude", ...}, ...]
API
| Function | Returns | Notes |
|---|---|---|
get_servers(chronicle=None, *, only_upcoming, new_only, min_rate, max_rate, limit, base_url, timeout) |
list[dict] |
VIP first, then soonest opening. |
get_chronicles(*, base_url, timeout) |
list[dict] |
The chronicle catalog (14 entries). |
get_server(name, **kwargs) |
dict | None |
Exact name, case-insensitive. |
search_servers(query, **kwargs) |
list[dict] |
Matches name, website, rate, chronicle, description, labels. |
parse_rate(rate) |
float | None |
"x5" → 5.0, "x0.5" → 0.5, "GvE" → None. |
select_servers(servers, *, ...) |
list[dict] |
Apply the filters to your own page. |
Errors raise L2CalendarError with an optional .status.
Server shape
{
"name": str,
"website_url": str,
"rate": str, # "x5", "x1000", "GvE"
"opening_date": str, # "2026-02-28"
"opening_time": str | None,
"opening_datetime_utc": str | None,
"description": str | None,
"is_vip": bool,
"vip_level": int,
"multiproff": bool,
"multicraft": bool,
"is_new": bool,
"chronicle": {"name": str, "slug": str} | None,
"labels": [{"name": str, "slug": str, "color": str}],
}
Note: the public API returns a single page of up to 50 servers (VIP first, then soonest opening).
limit, rate and upcoming filters run client-side over that page — narrow withchroniclefor precision.
Data source
GET https://l2calendar.com/api/servers— optional?chronicle=<slug>.GET https://l2calendar.com/api/chronicles.
About L2 Calendar
A multilingual (EN/ES/PT/RU) calendar and tracker of Lineage 2 private server openings by chronicle — l2calendar.com.
License
MIT © Dreiev
Metadata
Release files for l2calendar 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| l2calendar-1.0.0.tar.gz | 6.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| l2calendar-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.8 kB
Release files / l2calendar-1.0.0.tar.gz
| Download URL | l2calendar-1.0.0.tar.gz |
|---|---|
| Size | 6.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a6d88b0e1c123fde5d95cd235bc47eecfeb9e94b77c500325b52e3963bcbf46d
|
|
BLAKE2b-256 checksum How to use checksums |
3688d5bbe6b620ee3ce2664d7b546634266328d1867aec8d4d4630d7b2cb1904
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / l2calendar-1.0.0-py3-none-any.whl
| Download URL | l2calendar-1.0.0-py3-none-any.whl |
|---|---|
| Size | 5.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc2eea96b7660f34be6b35e7fcc457085dac34771d367f68b80ba887412002a5
|
|
BLAKE2b-256 checksum How to use checksums |
313e2d26298663b3e109825ac9e39cdbcda37ac5e0de9bb9e2bcc5c6a822fe9d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|