API Program de funcționare
Preluați programul de funcționare rezolvat și sărbătorile legale următoare pentru un site web
Ultima actualizare la
Folosiți API-ul de program de funcționare rezolvat dacă afișați pe un site public programul sezonier (de exemplu Vară / Iarnă) sau sărbătorile legale următoare. Tillor aplică deja excepțiile, perioadele sezoniere și programul săptămânal obișnuit și adaugă sărbătorile legale din intervalul cerut. Nu trebuie să implementați din nou acest lucru.
Permisiune: organization:settings:read sau organization:settings:write
Cheia API rămâne pe server
Apelați Tillor doar de pe un server (Next.js Route Handler, Server Component sau backend). Puneți cheia în variabile de mediu. Nu o trimiteți niciodată către browser.
Autentificare: consultați API-ul HTTP. Încercați endpointul în Referința API sau prin OpenAPI (tag organization-settings).
Endpoint
GET https://tillor.eu/api/orgs/org_abc123/organization-settings/opening-hoursAntete:
x-api-key: tkn_xxxÎnlocuiți org_abc123 cu ID-ul organizației dumneavoastră.
Parametri de interogare
Folosiți fie date, fie from/to. Nu le combinați.
| Parametru | Semnificație |
|---|---|
| (niciunul) | Astăzi, în fusul orar al organizației |
date | O singură zi calendaristică (YYYY-MM-DD) |
from | Ziua de început (inclusiv). Fără to: doar acea zi |
to | Ziua de sfârșit (inclusiv). Necesită from. Maximum 366 de zile |
languageIsoCode | Limba pentru numele sărbătorilor (NL, FR, …). Implicit: limba organizației |
Răspuns
Fiecare element este o zi calendaristică, deja rezolvată:
| Câmp | Semnificație |
|---|---|
timeZone | Fusul orar IANA al organizației |
from / to | Intervalul cerut |
holidays | Sărbători legale care se suprapun cu from–to |
items[].date | Ziua calendaristică YYYY-MM-DD |
items[].weekday | monday … sunday |
items[].source | exception, period sau regular |
items[].periodLabel | Doar la source: "period": eticheta din Tillor, de exemplu "Zomer" sau "Winter" |
items[].holiday | Doar dacă acea zi este sărbătoare legală: { id, name, startDate, endDate } |
items[].blocks | Intervale orare în minute de la miezul nopții |
items[].closed | true dacă blocks este gol |
Prioritate: excepție (sărbătoare sau interval personalizat) → ultima perioadă sezonieră potrivită → programul săptămânal obișnuit.
Etichetele sezoniere provin din Setări > Program de funcționare. Perioadele pot trece peste schimbarea anului (de exemplu de la 1 noiembrie până la 31 martie). Zilele din afara oricărei perioade revin la programul săptămânal obișnuit (source: "regular", fără periodLabel).
Din minute în oră de ceas
startMinutes / endMinutes sunt minute de la 00:00.
| Minute | Ora |
|---|---|
| 540 | 09:00 |
| 600 | 10:00 |
| 720 | 12:00 |
| 780 | 13:00 |
| 1020 | 17:00 |
| 1140 | 19:00 |
function formatMinutes(minutes: number): string {
const hour = Math.floor(minutes / 60);
const minute = minutes % 60;
return `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
}Exemple
Zi dintr-o perioadă sezonieră
curl -X GET "https://tillor.eu/api/orgs/org_abc123/organization-settings/opening-hours?date=2026-07-15" \
-H "x-api-key: tkn_xxx"{
"timeZone": "Europe/Brussels",
"from": "2026-07-15",
"to": "2026-07-15",
"holidays": [],
"items": [
{
"date": "2026-07-15",
"weekday": "wednesday",
"source": "period",
"periodLabel": "Zomer",
"blocks": [{ "startMinutes": 540, "endMinutes": 720 }],
"closed": false
}
]
}09:00–12:00, program de vară.
Zi în afara perioadelor sezoniere
curl -X GET "https://tillor.eu/api/orgs/org_abc123/organization-settings/opening-hours?date=2026-01-15" \
-H "x-api-key: tkn_xxx"{
"timeZone": "Europe/Brussels",
"from": "2026-01-15",
"to": "2026-01-15",
"holidays": [],
"items": [
{
"date": "2026-01-15",
"weekday": "thursday",
"source": "regular",
"blocks": [
{ "startMinutes": 540, "endMinutes": 720 },
{ "startMinutes": 780, "endMinutes": 1020 }
],
"closed": false
}
]
}09:00–12:00 și 13:00–17:00.
Interval peste limita unei perioade
curl -X GET "https://tillor.eu/api/orgs/org_abc123/organization-settings/opening-hours?from=2026-03-30&to=2026-04-02" \
-H "x-api-key: tkn_xxx"| Data | source | periodLabel |
|---|---|---|
| 2026-03-30 | regular | - |
| 2026-03-31 | regular | - |
| 2026-04-01 | period | Zomer |
| 2026-04-02 | period | Zomer |
Sărbători legale următoare
Sărbătorile legale se află în același răspuns: holidays pentru o listă (nume + date), items[].holiday dacă acea zi calendaristică este o sărbătoare. Orele rămân programul rezolvat; o sărbătoare fără excepție completată în Tillor urmează programul sezonier sau săptămânal (source nu este atunci "exception").
curl -X GET "https://tillor.eu/api/orgs/org_abc123/organization-settings/opening-hours?from=2026-08-27&to=2026-12-31&languageIsoCode=NL" \
-H "x-api-key: tkn_xxx"{
"timeZone": "Europe/Brussels",
"from": "2026-08-27",
"to": "2026-12-31",
"holidays": [
{
"id": "0fad0035-6b77-404a-953d-c66dac014483",
"name": "Allerheiligen",
"startDate": "2026-11-01",
"endDate": "2026-11-01"
},
{
"id": "d90e5f53-bc92-4860-bdae-f7e75935848d",
"name": "Kerstmis",
"startDate": "2026-12-25",
"endDate": "2026-12-25"
}
],
"items": [
{
"date": "2026-11-01",
"weekday": "sunday",
"source": "regular",
"holiday": {
"id": "0fad0035-6b77-404a-953d-c66dac014483",
"name": "Allerheiligen",
"startDate": "2026-11-01",
"endDate": "2026-11-01"
},
"blocks": [],
"closed": true
}
]
}Exemplul items de mai sus este prescurtat; răspunsul real conține fiecare zi din interval. Vacanțele școlare nu sunt incluse în acest endpoint; ele rămân la GET /holidays?kind=school.
Next.js (server)
Pentru un widget săptămânal sau „deschis acum” pe un site public:
const TILLOR_API_URL = "https://tillor.eu";
const ORGANIZATION_ID = process.env.TILLOR_ORG_ID ?? "";
type OpeningHoursBlock = {
startMinutes: number;
endMinutes: number;
};
type OpeningHoursHoliday = {
id: string;
name: string;
startDate: string;
endDate: string;
};
type OpeningHoursItem = {
date: string;
weekday: string;
source: "exception" | "period" | "regular";
periodLabel?: string;
holiday?: OpeningHoursHoliday;
blocks: OpeningHoursBlock[];
closed: boolean;
};
type OpeningHoursResponse = {
timeZone: string;
from: string;
to: string;
holidays: OpeningHoursHoliday[];
items: OpeningHoursItem[];
};
export async function getOpeningHours(
from: string,
to: string,
): Promise<OpeningHoursResponse> {
const url = new URL(
`${TILLOR_API_URL}/api/orgs/${ORGANIZATION_ID}/organization-settings/opening-hours`,
);
url.searchParams.set("from", from);
url.searchParams.set("to", to);
url.searchParams.set("languageIsoCode", "NL");
const response = await fetch(url, {
headers: {
"x-api-key": process.env.TILLOR_API_KEY ?? "",
},
next: { tags: ["opening-hours"], revalidate: 3600 },
});
if (!response.ok) {
throw new Error(`Tillor opening hours ${response.status}`);
}
return response.json() as Promise<OpeningHoursResponse>;
}holidays este lista pentru un bloc „sărbători următoare”. items[].holiday este util într-un calendar săptămânal. items[].periodLabel este textul sezonier (de exemplu "Zomer" sau "Winter"). Un cache de 1 oră este de obicei suficient.
Invalidarea cache-ului (webhook)
La fiecare modificare a setărilor organizației, Tillor trimite organizationSettings:updated (webhook și SSE). Abonați-vă la el și preluați din nou programul de funcționare. Payloadul este intenționat mic (fără IP-uri de imprimantă sau programul complet):
{
"event": "organizationSettings:updated",
"data": {
"openingHoursChanged": true
},
"timestamp": 1787829600000
}openingHoursChanged este true dacă se schimbă programul de funcționare, fusul orar sau țara implicită - adică ceea ce influențează GET .../opening-hours. La false puteți păstra cache-ul programului de funcționare.
Exemplu de Route Handler Next.js:
import { revalidateTag } from "next/cache";
export async function POST(request: Request) {
const body = (await request.json()) as {
event?: string;
data?: { openingHoursChanged?: boolean };
};
if (body.event === "organizationSettings:updated" && body.data?.openingHoursChanged) {
await revalidateTag("opening-hours");
}
return new Response(null, { status: 204 });
}Crearea unui webhook: consultați Webhookuri. Cheia evenimentului: organizationSettings:updated (permisiune organization:settings:read sau organization:settings:write).
Programul complet (opțional)
Necesar doar dacă doriți să afișați singur calendarul sezonier (etichete + fromMonth/untilDay), fără rezolvare pe zile:
GET https://tillor.eu/api/orgs/org_abc123/organization-settingsCitiți openingHoursSchedule.periods (etichete precum "Zomer") și openingHoursSchedule.weekdays (program obișnuit). Pentru site-ul propriu-zis, GET .../opening-hours rămâne sursa cea mai simplă.
MCP
În Cursor sau Claude: endpointul organizationSettings_listOpeningHours (categoria organizationSettings), argumente organizationId, opțional date sau from/to, opțional languageIsoCode.
Legate de acest subiect
- API HTTP - autentificare și antete
- Exemple HTTP - exemple cURL generale
- Webhookuri -
organizationSettings:updatedpentru revalidarea cache-ului - Setările organizației - configurarea programului de funcționare în Tillor