API kuulub Agency-paketti. Võtme saab luua konto omanik: Minu konto -> API-võtmed. Täisvõtit näidatakse ainult ÜHEL korral - salvesta see kohe.
Alusta
1. Loo võti
Minu konto -> API-võtmed -> Uus võti. Anna talle nimi, mille järgi hiljem ära tunned.
2. Vali õigused
Märgi ainult need moodulid, mida see võti vajab. Kirjutamisõigus võtab lugemise kaasa.
3. Tee esimene päring
Saada võti Authorization-päises. Alusta /api/v1/me pealt - see ütleb, mida su võti tohib.
4. Ehita
Iga endpoint tagastab JSON-i kujul { data: ... }. Vead on { error: "kood" }.
Autentimine
Iga päring kannab API-võtit. Kaks vormi töötavad ühtemoodi - vali see, mida sinu tööriist toetab. Võti algab alati eesliitega hsly_live_. Ilma võtmeta või tühistatud võtmega päring saab 401.
Ära pane võtit brauseris jooksvasse koodi ega avalikku repositooriumi - see annab ligipääsu kogu kontole. Hoia seda serveri keskkonnamuutujas. Lekkinud võtme saab kohe tühistada ja uue luua.
Õigused (scope'id)
Võti kannab täpselt neid õigusi, mille sa loomisel märkisid. Puuduv õigus annab 403 insufficient_scope. Anna igale võtmele ainult see, mida ta päriselt vajab: Zapieri võti, mis loeb vormivastuseid, ei pea saama saite kustutada.
| Scope | Allows |
|---|---|
| sites:read | List the account's sites and read one site's details |
| sites:write | Create a new site (counts against the plan's site quota) |
| pages:read | List pages, read a page including its block tree |
| pages:write | Create, update and delete pages; publish and unpublish |
| blog:read | List and read blog posts, categories and tags |
| blog:write | Create, update and delete posts and terms |
| media:read | List the media library |
| media:write | Import an image by URL, retitle it, move it, trash it |
| forms:read | List forms and their submissions |
| forms:write | Mark a submission read, delete a submission |
| redirects:read | List the site's URL redirects |
| redirects:write | Create, update and delete redirects |
| navigation:read | Read the header and footer menu trees |
| navigation:write | Replace a menu's items |
| analytics:read | Read daily traffic totals and dimension breakdowns |
| webhooks:read | List webhooks and their delivery attempts |
| webhooks:write | Create, update and delete webhooks |
Endpointid
Kõik teed algavad https://api.husly.app pealt. :siteId on saidi id, mille saad GET /api/v1/sites vastusest. Sait peab kuuluma sinu kontole - võõra saidi id vastab 404, mitte 403, sest võti ei tohi teada teiste kontode olemasolust.
Konto
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/me | any valid key |
| GET | /api/v1/webhook-events | webhooks:read |
Saidid
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites | sites:read |
| GET | /api/v1/sites/:siteId | sites:read |
| POST | /api/v1/sites | sites:write |
Lehed
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/pages | pages:read |
| GET | /api/v1/sites/:siteId/pages/:pageId | pages:read |
| POST | /api/v1/sites/:siteId/pages | pages:write |
| PUT | /api/v1/sites/:siteId/pages/:pageId | pages:write |
| DELETE | /api/v1/sites/:siteId/pages/:pageId | pages:write |
Blogi
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/posts | blog:read |
| GET | /api/v1/sites/:siteId/posts/:postId | blog:read |
| POST | /api/v1/sites/:siteId/posts | blog:write |
| PUT | /api/v1/sites/:siteId/posts/:postId | blog:write |
| DELETE | /api/v1/sites/:siteId/posts/:postId | blog:write |
| GET | /api/v1/sites/:siteId/terms | blog:read |
| POST | /api/v1/sites/:siteId/terms | blog:write |
| PUT | /api/v1/sites/:siteId/terms/:termId | blog:write |
| DELETE | /api/v1/sites/:siteId/terms/:termId | blog:write |
Meedia
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/media | media:read |
| POST | /api/v1/sites/:siteId/media | media:write |
| PATCH | /api/v1/sites/:siteId/media/:mediaId | media:write |
| DELETE | /api/v1/sites/:siteId/media/:mediaId | media:write |
Vormid
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/forms | forms:read |
| GET | /api/v1/sites/:siteId/form-submissions | forms:read |
| GET | /api/v1/forms/submissions?siteId= | forms:read |
| PATCH | /api/v1/sites/:siteId/form-submissions/:id | forms:write |
| DELETE | /api/v1/sites/:siteId/form-submissions/:id | forms:write |
Suunamised
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/redirects | redirects:read |
| POST | /api/v1/sites/:siteId/redirects | redirects:write |
| PUT | /api/v1/sites/:siteId/redirects/:id | redirects:write |
| DELETE | /api/v1/sites/:siteId/redirects/:id | redirects:write |
Menüüd
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/menus | navigation:read |
| GET | /api/v1/sites/:siteId/menus/:key | navigation:read |
| PUT | /api/v1/sites/:siteId/menus/:key | navigation:write |
Statistika
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/analytics | analytics:read |
| GET | /api/v1/sites/:siteId/analytics/breakdown | analytics:read |
Veebihaagid
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/sites/:siteId/webhooks | webhooks:read |
| GET | /api/v1/sites/:siteId/webhooks/:id/deliveries | webhooks:read |
| POST | /api/v1/sites/:siteId/webhooks | webhooks:write |
| PUT | /api/v1/sites/:siteId/webhooks/:id | webhooks:write |
| DELETE | /api/v1/sites/:siteId/webhooks/:id | webhooks:write |
Näide: avalda blogipostitus
Postituse sisu on plokipuu - sama kuju, mida builder salvestab. Lihtsaim algus on üks richtext-plokk. Kui jätad layoutJson andmata, tekib tühi postitus, mille sisu saad builderis edasi toimetada.
Vead
Viga tuleb alati JSON-ina kujul { "error": "kood" }, vahel koos lisaväljadega (nt required, limit). Kood on masinloetav ja püsiv - kirjuta oma loogika koodi, mitte teksti järgi.
| HTTP | error | What it means |
|---|---|---|
| 400 | invalid_input | The body failed validation; the details field lists what failed |
| 401 | unauthorized | No key was sent |
| 401 | invalid_key | Unknown or revoked key |
| 401 | key_expired | The key passed its expiry date |
| 402 | plan_required | The plan does not include this feature; the feature field names it |
| 402 | site_quota_exceeded | The plan's site limit is reached |
| 402 | storage_quota_exceeded | The media upload would exceed the storage quota |
| 403 | api_not_entitled | The account's plan has no API access |
| 403 | insufficient_scope | The key lacks the scope named in the required field |
| 403 | forbidden_widget | The block tree uses a widget this account may not place |
| 404 | site_not_found | No such site, or it belongs to another account |
| 409 | slug_taken | That slug already exists on this site |
| 413 | file_too_large | The imported file is over the size limit |
| 415 | unsupported_type | The imported file is not an allowed image type |
| 429 | rate_limited | Too many requests; retry after the Retry-After header |
Piirangud
Päringute arv on piiratud võtme kohta minutis. Üle piiri minek annab 429 koos Retry-After päisega ja vastuses on limit-väli, mis ütleb, milline piir kehtis. Paketi kvoodid - saitide arv, lehtede arv, meediamaht - kehtivad ka API kaudu: neid ei saa skriptiga mööda hiilida.
Praegune versioon on v1. Me ei muuda v1 vastuste kuju viisil, mis su integratsiooni katki teeb - uued väljad võivad lisanduda, olemasolevad ei kao. Murrav muudatus tähendaks uut teed (/api/v2/).
Rendi partneri API
Eraldi API reisibüroodele, kanalihalduritele ja tehisintellekti agentidele, kes müüvad ühe Husly rendiettevõtte autosid, rattaid, paate, varustust või majutust. Võtme loob saidi omanik Rendi vahekaardil „Integratsioonid“ (Partneri API) ja annab selle partnerile. Võti avab ainult selle saidi: avaldatud kataloogi ja need broneeringud, mille partner ise tegi. Agency-paketti pole vaja, see kuulub rendi lisamooduli juurde.
Partneri võti algab eesliitega hsly_partner_ ja töötab ainult aadressil /api/partner/v1/rentals. Konto API võti (hsly_live_) siin ei tööta, ja partneri võti ei tööta konto API-s.
Partneri API endpointid
| Method | Path | Needs |
|---|---|---|
| GET | /api/partner/v1/rentals/me | any partner key |
| GET | /api/partner/v1/rentals/listings | any partner key |
| GET | /api/partner/v1/rentals/listings/:slug | any partner key |
| GET | /api/partner/v1/rentals/listings/:slug/calendar | any partner key |
| GET | /api/partner/v1/rentals/listings/:slug/quote | any partner key |
| GET | /api/partner/v1/rentals/bookings | any partner key |
| POST | /api/partner/v1/rentals/bookings | a key that may book |
| GET | /api/partner/v1/rentals/bookings/:id | any partner key |
| POST | /api/partner/v1/rentals/bookings/:id/confirm | a key that may book |
| POST | /api/partner/v1/rentals/bookings/:id/cancel | a key that may book |
| GET | /api/partner/v1/rentals/webhook | any partner key |
| PUT | /api/partner/v1/rentals/webhook | any partner key |
| DELETE | /api/partner/v1/rentals/webhook | any partner key |
| POST | /api/partner/v1/rentals/webhook/test | any partner key |
| POST | /api/partner/v1/rentals/mcp | any partner key |
| GET | /api/partner/v1/rentals/openapi.json | no key |
| GET | /api/partner/v1/rentals/docs | no key |
"hold": true hoiab kuupäevi 20 minutit (kuni 60) ega kirjuta kellelegi. POST /bookings/:id/confirm teeb sellest broneeringu; kinnitamata hoidmine vabastab kuupäevad ise. Sama "reference" uuesti saates saad sama broneeringu, mitte teist. Hind ja vabad päevad on samad mis rendiettevõtte enda lehel. Partneri broneeringut Huslys ei maksta: raha arveldab partner rentijaga.
Tehisintellekti agendid (MCP)
Sama API on ka MCP-server aadressil POST /api/partner/v1/rentals/mcp, sama võtmega. See räägib MCP versioone 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26. Tööriistad: rentals_site_info, search_rentals, get_rental, get_rental_calendar, quote_rental, book_rental, confirm_booking, cancel_booking, get_booking, list_bookings. Ainult lugemiseks mõeldud võti broneerimise tööriistu ei saa. book_rental hoiab kuupäevad vaikimisi kinni ja palub agendil enne confirm_booking'ut reisija nõusolekut küsida.
Partneri veebihaak
Partner määrab oma aadressi päringuga PUT /api/partner/v1/rentals/webhook; allkirjastamise saladust näidatakse ühe korra. Sündmused: rental.booking.created, rental.booking.confirmed, rental.booking.cancelled, ainult partneri enda broneeringute kohta. Allkiri on sama mis konto veebihaagil: X-Husly-Signature: sha256=<hex>, HMAC-SHA256 väärtusest <timestamp>.<body>.
| HTTP | error | What it means |
|---|---|---|
| 401 | unauthorized / invalid_key / key_revoked | No partner key, an unknown one, or one the owner revoked |
| 403 | read_only_key | This key may read but not book |
| 403 | rentals_off | The site's Rentals add-on or module is off |
| 404 | listing_not_found / booking_not_found | No such listing, or not a booking this key made |
| 409 | unavailable | The dates are taken; the detail says why |
| 409 | hold_expired / already_started | The hold ran out, or the rental has begun |
| 422 | invalid_guest / not_bookable | Guest details are missing, or the range cannot be priced |
| 429 | rate_limited / too_many_bookings | 120 requests a minute or 60 new bookings an hour per key |
Kõik väljad ja vastuste kujud on partneri API oma juhendis ja OpenAPI 3.1 failis, mille saab tõmmata Postmani või kliendi genereerimiseks.
Korduma kippuvad küsimused
Konto omanik. Võti kuulub kontole, mitte üksikule saidile, ja ulatub kõigi selle konto saitideni.
Ei. Me hoiame ainult võtme räsi, mitte võtit ennast. Loendis on näha vaid eesliide (nt hsly_live_ab12cd34). Kadunud võtme asemel loo uus ja tühista vana.
Ta lakkab kohe töötamast - järgmine päring saab 401. Rida jääb loendisse alles, et jääks jälg, millal ja kust seda kasutati.
Jah - loo veebihaak. Sinu server saab POST-i kohe, kui vorm täidetakse või postitus avaldatakse, ja sa ei pea API-t taimeriga küsitlema.
Jah. Aegunud võti annab 401 key_expired. See on hea mõte lühiajalise töö jaoks, nt ühekordse migratsiooni-skripti puhul.
Jah, rendi partneri API kaudu. Võtme annab partnerile rendiettevõte ise ja võti avab ainult selle ühe saidi. Konto API võti selleks ei sobi.