REST API, MCP server, webhooks, and an AI agent. Build your own integrations, connect your AI agents to your properties, or build on top of the platform.
This is a courtesy translation. The Norwegian version prevails.
curl https://api.gjestfri.com/v1/properties \
-H "Authorization: Bearer gf_live_..."All endpoints under /v1/* use Bearer authentication. The auth layer checks the prefix:
gf_live_… / gf_test_… → API key (rate-limited per key, scope-enforced)properties:read properties:write
bookings:read bookings:write
messages:read messages:write
pricing:read pricing:write
availability:read availability:write
cleaning:read cleaning:write
analytics:read
webhooks:manage
agent:chat:write automatically implies :read.
60 requests per minute per key by default. Headers are returned on every response:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
Retry-After: 23 (only on 429)GET /v1/propertiesGET /v1/properties/:idPATCH /v1/properties/:idGET /v1/properties/:id/calendar?from&toGET /v1/bookings?propertyId&status&from&to&limitGET /v1/bookings/:idPOST /v1/bookings - manual direct bookingPATCH /v1/bookings/:idGET /v1/messages/unreadGET /v1/messages/by-booking/:idPOST /v1/messages/by-booking/:id - send to guestGET /v1/pricing/recommendations?propertyId&from&toPOST /v1/pricing/overridesDELETE /v1/pricing/overridesGET/PUT /v1/pricing/configPOST /v1/availability/blockPOST /v1/availability/unblockGET /v1/cleaning-tasks?statusPATCH /v1/cleaning-tasks/:idGET /v1/analytics/occupancy?from&to&propertyIdGET /v1/analytics/revenue?from&to&propertyIdGET/POST/DELETE /v1/webhooksGET/POST/DELETE /v1/api-keyscurl 'https://api.gjestfri.com/v1/bookings?from=2026-06-01&limit=20' \
-H "Authorization: Bearer gf_live_..."
# →
# {
# "data": [
# {
# "id": 408,
# "propertyId": 12,
# "status": "confirmed",
# "guest": { "name": "Anna M.", "country": "NO" },
# "checkin": "2026-06-15",
# "checkout": "2026-06-18",
# "pricing": { "totalPrice": "4200", ... }
# }
# ]
# }The agent has full access to the host's data and 60+ tools (CRUD on properties, bookings, cleaning, rates, quick replies, channels, ...). Talk to it naturally - the agent picks the right tool on its own.
POST /v1/agent/chat - send a messagePOST /v1/agent/confirm/:actionLogId - confirm a pending actionGET /v1/agent/conversationsGET /v1/agent/conversations/:id/messagesGET/PATCH /v1/agent/settingscurl https://api.gjestfri.com/v1/agent/chat \
-H "Authorization: Bearer gf_live_..." \
-H "Content-Type: application/json" \
-d '{
"message": "What needs my attention today?",
"channel": "ios"
}'
# →
# {
# "conversationId": 42,
# "reply": "3 things: Anna checks in at 4 PM - welcome message not sent. ...",
# "toolCalls": [
# { "name": "list_unread_messages", "result": { ... } }
# ]
# }Connect Claude Desktop, Cursor, or any other MCP-compatible agent directly to Gjestfri. The agent gets access to all your properties, bookings, and 60+ tools.
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"gjestfri": {
"command": "npx",
"args": ["-y", "@gjestfri/mcp-server"],
"env": {
"GJESTFRI_API_KEY": "gf_live_..."
}
}
}
}Same setup. Cursor keeps its MCP config under Settings → MCP. Point it to npx @gjestfri/mcp-server with the same env variable.
properties_list / get / update / calendarpropertiesbookings_list / get / create / updatebookingsmessages_unread / for_booking / sendmessagessuggest_repliesAI-suggested repliescreate_quick_reply / list / updatequick repliescreate_recurring_scheduleautomated messagesset_price_override / remove_overridepricingrecompute_pricing / explain_pricepricing engineblock_dates / unblock_datesavailabilityupdate_cleaning_task / completecleaninganalytics_occupancy / revenueanalyticsupdate_property / archive_propertyproperty CRUDrespond_to_guest_with_suggestionagent handoverget_stripe_statusintegrations60+ tools in total. The complete catalog shows up in your client once MCP is connected.
gjestfri://properties
gjestfri://properties/{id}
gjestfri://properties/{id}/calendar
gjestfri://bookings/{id}
gjestfri://bookings/{id}/messages
gjestfri://messages/unreadGet push notifications when something happens. HMAC-SHA256 signed payloads. Up to 3 retries with exponential backoff.
curl https://api.gjestfri.com/v1/webhooks \
-H "Authorization: Bearer gf_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["booking.created", "message.received"]
}'
# The response includes the secret only on creation:
# { "id": 12, "secret": "whsec_...", "events": [...] }booking.created, booking.updated, booking.cancelledmessage.received, message.sentcleaning.scheduled, cleaning.completedpricing.recommendation_changedagent.action_pending_confirmation// Header: X-Gjestfri-Signature: t=1234567890,v1=abc123...
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");You can talk to the agent over iMessage/RCS/SMS, Telegram, or WhatsApp. Endpoints for connecting and managing channels:
GET /v1/host-channelsPOST /v1/host-channels - body: {channel, phoneNumber?}DELETE /v1/host-channels/:idPOST returns a deep link (Telegram/WhatsApp) or sends an iMessage with a 6-character code. The host verifies by opening the deep link or replying with the code.
A separate MCP server for AI agents that book on behalf of travelers. No API key needed for search - auth via a per-booking access code after payment.
{
"mcpServers": {
"gjestfri-guest": {
"command": "npx",
"args": ["-y", "@gjestfri/mcp-guest"]
}
}
}Tools: search_properties, get_property_details, check_availability, start_booking, get_my_booking, send_message_to_host.