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

GET/settings
PATCH/settings
FieldTypeDescription
livemodeboolean · read-onlyfalse 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.submitRequiresSignaturebooleanIf true, a report does not go to SES until the whole party has signed the contract.
notifications.localees | enThe 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.telegramobject | nullAlerts to a bot of your own: botToken, chatId and an optional topicId. null switches the alerts off.
notifications.guestInvitationsobjectThe 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.guestReplyTostring | nullWhere 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.
guestEmailsobjectYour 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
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 · you send the link, Kinapi only reminds
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)

GET/branding
PATCH/branding
DELETE/branding

Customise 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.

FieldTypeDescription
commercialNamestring | nullTrading 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.
primaryColorstring | nullBrand colour as #RRGGBB. The text colour is worked out from contrast on its own. null goes back to the default blue.
backgroundColorstring | nullBackground 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.
logostring | nullBase64 image (a data: prefix is accepted). PNG, JPEG or WebP, 1 MB maximum. null removes the logo. SVG is not accepted.
curl
# 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

GET/webhook
PUT/webhook
DELETE/webhook

Configure 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.

FieldTypeDescription
urlstringA public https:// address. Internal addresses are rejected.
eventsstring[]guest.registered, checkin.completed, ses.submitted, ses.confirmed, ses.error, ses.blocked, ses.cancelled, ses.cancel_failed, export.ready, export.failed (see Webhooks)
enabledbooleantrue by default.
secretstringOptional: omit it to keep the current one (or to have one generated the first time).
curl
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

POST/webhook/test
GET/webhook/deliveries

The 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
curl -X POST https://api.kinapi.es/api/v1/webhook/test \
  -H "ocp-apim-subscription-key: YOUR_API_KEY"

Billing portal

POST/billing/portal

Returns 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.

What is sent and when
CampoTipoDescripción
Guest invitationguestA 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.
ReminderguestOptional, two days before arrival, and only if it is still incomplete. It goes out even with the invitation switched off.
Last noticeguestThe 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 completemanagerAs soon as the last guest finishes registering. You can send it to an address other than the account contact.
Reports needing attentionmanagerA 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.

Rules
FieldTypeDescription
{nombre}variableLead 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}variableTrading name of the property, or its name if it has none.
{fecha_entrada}variableArrival date of the booking.
No linksruleNo links or web addresses: the only link in the email is the button. Naming the channel (Booking.com, Airbnb.com) is fine.
LimitsruleSubject, 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 changesruleThe button with the link, the documents needed, the arrival date and the RD 933/2021 legal notice always go out.
curl
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.