Account settings
Settings, form branding and the outgoing webhook: everything you configure in the panel, over the API too.
These endpoints exist so you can create and configure a whole account without going into the panel — useful if you run many accommodations or if you automate onboarding for your own customers.
General settings
/settings/settings| Field | Type | Description |
|---|---|---|
livemode | boolean · read-only | false when the key belongs to test mode, where nothing is filed with the Ministry or billed. Check it when your integration starts to know which environment it is talking to. See Test mode. |
ses.submitRequiresSignature | boolean | If true, a report does not go to SES until the whole party has signed the contract. |
notifications.locale | es | en | The language of the emails Kinapi sends TO YOU: a booking fully registered, SES submission problems, the warning that your trial is running out, and account suspension. It does not affect anything the guest sees. Absent = Spanish. In the panel it is Settings → Notifications. |
notifications.telegram | object | null | Alerts to a bot of your own: botToken, chatId and an optional topicId. null switches the alerts off. |
notifications.guestInvitations | object | The account guest emails: enabled (invitation), daysBefore (days before arrival, 1 to 30), reminder (two days before) and lastCall (last notice on arrival day). The three are independent: if you send the link yourself, switch the invitation off and keep the reminders. Whatever you leave out keeps its value. Each property can decide otherwise with its own notifications. |
notifications.guestReplyTo | string | null | Where guest replies to the invitation, the reminders and the signed contract go. null or an empty string returns to the account contact email. On reads, guestReplyToConfigured says whether it is your own address or the account contact. |
guestEmails | object | Your texts for the guest emails: invitation, reminder and lastCall, each by language (es, en, de, fr, nl, it, pt) with subject, headline and body. Whatever you leave empty goes out with the Kinapi text; null on a language removes it. Details below, under Email notifications. |
There are two languages and they do not overlap. This notifications.locale is yours — the alerts you receive as a manager — and it lives on the account because the cron sends them when nobody is at a screen. The guest's language — form, contract and their emails — is a different thing, decided by the booking or the accommodation. You can read your alerts in English and serve your guests in Dutch.
The PATCH is partial inside notifications too: sending only telegram does not touch the language, and sending only the language touches neither Telegram nor the guest emails. The same goes for guestEmails: only the languages you send change.
The Telegram botToken can be written but is never returned: on reads you will see configured: true/false. It is a third party’s credential and there is no reason for it to travel back.
curl -X PATCH https://api.kinapi.es/api/v1/settings \
-H "ocp-apim-subscription-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"ses":{"submitRequiresSignature":true}}'curl -X PATCH https://api.kinapi.es/api/v1/settings \
-H "ocp-apim-subscription-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"notifications":{"guestInvitations":{"enabled":false,"reminder":true,"lastCall":true},"guestReplyTo":"bookings@example.com"}}'The panel’s language and theme (dark or light) are per-browser preferences, not account settings: you change them from the account icon, top right, and they are not configurable over the API. Neither affects the guest form, which follows the booking’s language and the property’s branding.
Form branding (white-labelling)
/branding/branding/brandingCustomise what your guests see with your colour, your logo and your trading name: their registration page and the header of their emails. It never changes the panel or the contracts.
| Field | Type | Description |
|---|---|---|
commercialName | string | null | Trading name of your company, as your guests know it. It appears in the header of their emails, under the property name. Without it nothing appears (the account identifier used to). null or an empty string removes it. Up to 80 characters. |
primaryColor | string | null | Brand colour as #RRGGBB. The text colour is worked out from contrast on its own. null goes back to the default blue. |
backgroundColor | string | null | Background colour of the guest page in #RRGGBB format. Cards, borders and secondary text are derived from it, contrast-checked, so everything stays readable whether you pick a light or a dark background. null restores the default background. |
logo | string | null | Base64 image (a data: prefix is accepted). PNG, JPEG or WebP, 1 MB maximum. null removes the logo. SVG is not accepted. |
# colour and logo at once
curl -X PATCH https://api.kinapi.es/api/v1/branding \
-H "ocp-apim-subscription-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d "{\"primaryColor\":\"#0B6E4F\",\"logo\":\"$(base64 -i logo.png)\"}"The logo’s format is decided by reading its actual bytes, not the extension or whatever you declare. SVG is rejected on purpose: it is served from our domain and could carry code.
Outgoing webhook
/webhook/webhook/webhookConfigure which URL we notify and about which events. The GET also returns the list of available events and the secret we sign each delivery with — the same one you need to verify the x-kinapi-signature-sha256 header (how to verify it). Event labels come back in Spanish by default; add ?locale=en (or send an Accept-Language header) to get them in English. The id of each event never changes.
| Field | Type | Description |
|---|---|---|
url | string | A public https:// address. Internal addresses are rejected. |
events | string[] | guest.registered, checkin.completed, ses.submitted, ses.confirmed, ses.error, ses.blocked, ses.cancelled, ses.cancel_failed, export.ready, export.failed (see Webhooks) |
enabled | boolean | true by default. |
secret | string | Optional: omit it to keep the current one (or to have one generated the first time). |
curl -X PUT https://api.kinapi.es/api/v1/webhook \
-H "ocp-apim-subscription-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"url":"https://your-system.com/hooks/kinapi","events":["ses.confirmed","ses.error"]}'Testing and debugging the webhook
/webhook/test/webhook/deliveriesThe test sends a real delivery and returns the outcome of the attempt (HTTP code, duration and the body your server answered with), without waiting for an event to happen. The history keeps the attempts of the last 30 days.
curl -X POST https://api.kinapi.es/api/v1/webhook/test \ -H "ocp-apim-subscription-key: YOUR_API_KEY"
Billing portal
/billing/portalReturns a single-use URL to the Stripe portal, where your account can see invoices and change the payment method. It expires: request a new one each time, do not store it.
Email notifications
Kinapi can write to the guest so they complete their registration, and tell you when a booking is fully registered. Both are off by default, deliberately: if your PMS already sends the link in its welcome message, turning them on means the guest gets the same email twice from the same property. You enable them under Settings → Notifications, or through the API with notifications.guestInvitations.
| Campo | Tipo | Descripción |
|---|---|---|
Guest invitation | guest | A few days before arrival, configurable. And immediately if the booking arrives once that day has already passed — a booking made today for tomorrow would otherwise get nothing at all. |
Reminder | guest | Optional, two days before arrival, and only if it is still incomplete. It goes out even with the invitation switched off. |
Last notice | guest | The morning of arrival, if data is still missing. The report goes out that night, so it still arrives in time. It is also switched on and off on its own. |
Booking complete | manager | As soon as the last guest finishes registering. You can send it to an address other than the account contact. |
Reports needing attention | manager | A morning digest of reports the Ministry rejected or that never went out. Always on: it is what stops a rejection going unnoticed. Each booking is flagged twice for the same cause and then goes quiet — if the cause changes, it is flagged again; in the panel it stays visible for good. |
The guest email carries the property’s name, not Kinapi’s. The guest booked with you and has no idea who we are: the header shows the trading name of the property (or its name, if it has none) and your company name below it, and if they reply, the reply reaches your reply address — the account contact by default. The sender is still Kinapi (no-reply@kinapi.es), and Kinapi appears only in one line at the foot.
If you send the link yourself — from your PMS, with the url the API returns — switch the invitation off and keep the reminder and the last notice on. Kinapi only writes to guests who have not registered yet: whoever fills in with your link gets nothing from us, and whoever does not gets the reminder and the last notice.
Your texts in the guest emails
You can change the subject, the headline and the opening text of the invitation, the reminder and the last notice, in each language. Whatever you leave empty goes out with the Kinapi text. In the panel it is under Settings → Notifications → Email texts, with a preview and a test send; through the API, in guestEmails on PATCH /settings.
| Field | Type | Description |
|---|---|---|
{nombre} | variable | Lead guest name. If we do not know it, it disappears and the sentence is fixed: “{nombre}, we look forward to seeing you” becomes “We look forward to seeing you”. |
{alojamiento} | variable | Trading name of the property, or its name if it has none. |
{fecha_entrada} | variable | Arrival date of the booking. |
No links | rule | No links or web addresses: the only link in the email is the button. Naming the channel (Booking.com, Airbnb.com) is fine. |
Limits | rule | Subject, one line of up to 150 characters. Headline, one line of up to 120. Text, up to 2,000 characters and 8 paragraphs separated by a blank line. |
What never changes | rule | The button with the link, the documents needed, the arrival date and the RD 933/2021 legal notice always go out. |
curl -X PATCH https://api.kinapi.es/api/v1/settings \
-H "ocp-apim-subscription-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"guestEmails":{"reminder":{"en":{"subject":"{nombre}, we look forward to seeing you at {alojamiento}","body":"We are still missing your details.\n\nIt takes two minutes and you arrive with everything done."},"es":null}}}'If a text breaks the rules, the response is a 400 with code: guest_email_text and a list in details with the email, the language, the field and the reason (too_long, unknown_variable, link_not_allowed, single_line or too_many_paragraphs). Nothing from that call is saved: it goes in whole or not at all.
When the invitation goes out. You choose the lead time, but neither extreme works. Too early fails: someone who gets the email three weeks out does not have every traveller’s document to hand, parks it and never returns — and the booking can still change or be cancelled. The day itself fails too: the guest is travelling, never opens it, and that night the report goes out incomplete. The default leaves room for the reminder and for you to react if nobody answers.
At most three emails per booking go out, and they stop as soon as every guest has registered. If two of them would fall on the same day, only one is sent.