Duve API

Duve API as documented publicly: 17 operations. Contract generated from the documentation by API Evangelist (2026-10-24); not the provider's own document.

Operations 17

GET /api/openapi/v1/accounts GET /api/openapi/v1/accounts #
GET /api/openapi/v1/accounts/{accountexternalid}/token Account Token #
GET /api/openapi/v1/oauth2/token GET /api/openapi/v1/oauth2/token #
POST /api/openapi/v1/oauth2/token Use this request to create a bearer token which will be used after for authenticating the rest of the requests in the OpenApi. #
GET /api/openapi/v1/webhooks GET /api/openapi/v1/webhooks #
POST /api/openapi/v1/webhooks Create an outgoing Duve Connect webhook configuration for your company. #
DELETE /api/openapi/v1/webhooks/{id} Delete webhook #
GET /api/openapi/v1/webhooks/{id} Get webhook by id #
PUT /api/openapi/v1/webhooks/{id} Update webhook #
GET /api/v1/hooks/accommodation/connect GET /api/v1/hooks/accommodation/connect #
POST /api/v1/hooks/accommodation/connect Create or update an accommodation in Duve #
GET /api/v1/hooks/reservation/connect GET /api/v1/hooks/reservation/connect #
POST /api/v1/hooks/reservation/connect Create or update an reservation in Duve #
GET /openapi/v1/accounts Multi-Account Management #
POST /openapi/v1/oauth2/token Secure Authentication and Token Management #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/duve:duve-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

duve-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Duve API
  version: '2026-10-24'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-10-24: 17 operation(s) read from 13 public documentation page(s) (each
    operation names its page in x-source). This is not the provider''s published contract; Duve has published no machine-readable contract that
    the pipeline could find. Engine: local.'
  x-evidence-tiers:
    code-example: 8
    documentation: 9
    pages-with-code: 11
    pages-read: 13
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-10-24'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://developers.duve.com/api-references/open-api/introduction.md
  - https://developers.duve.com/api-references/open-api/best-practices.md
  - https://developers.duve.com/api-references/open-api/open-api/accounts.md
  - https://developers.duve.com/api-references/open-api/open-api/authorization/token.md
  - https://developers.duve.com/api-references/open-api/open-api/accounts/account-token.md
  - https://developers.duve.com/api-references/open-api/open-api/reservations/guest-link.md
  - https://developers.duve.com/api-references/pms-api/pms/reservation/connect-reservation.md
  - https://developers.duve.com/api-references/pms-api/pms/accommodation/connect-accommodation.md
  - https://developers.duve.com/api-references/open-api/open-api/webhooks-management/get-company-webhook.md
  - https://developers.duve.com/api-references/open-api/open-api/webhooks-management/get-company-webhooks.md
  - https://developers.duve.com/api-references/open-api/open-api/webhooks-management/create-company-webhook.md
  - https://developers.duve.com/api-references/open-api/open-api/webhooks-management/delete-company-webhook.md
  - https://developers.duve.com/api-references/open-api/open-api/webhooks-management/update-company-webhook.md
servers:
- url: https://sandbox.duve.com
paths:
  /api/openapi/v1/accounts:
    get:
      operationId: get_api_openapi_v1_accounts
      tags:
      - Api
      summary: GET /api/openapi/v1/accounts
      x-source: https://developers.duve.com/api-references/open-api/open-api/accounts.md
      parameters:
      - name: externalId
        in: query
        required: false
        schema:
          type: string
      - name: page
        in: query
        required: false
        schema:
          type: string
      - name: pageSize
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiOpenapiV1AccountsResponse'
      x-evidence:
        kind: code-example
        language: ruby
        snippet: URI("https://sandbox.duve.com/api/openapi/v1/accounts?page=1&pageSize=2&externalId=HotelA"
  /api/openapi/v1/accounts/{accountexternalid}/token:
    get:
      operationId: get_api_openapi_v1_accounts_accountexternalid_token
      tags:
      - Api
      summary: Account Token
      description: Fetch connected accounts to an open API connection associated with multi accounts scope in the same connection. Returns a token
        and its expiry.
      x-source: https://developers.duve.com/api-references/open-api/open-api/accounts/account-token.md
      parameters:
      - name: accountexternalid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiOpenapiV1AccountsAccountexternalidTokenResponse'
      x-evidence:
        kind: documentation
  /api/openapi/v1/oauth2/token:
    get:
      operationId: get_api_openapi_v1_oauth2_token
      tags:
      - Api
      summary: GET /api/openapi/v1/oauth2/token
      x-source: https://developers.duve.com/api-references/open-api/open-api/authorization/token.md
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiOpenapiV1Oauth2TokenResponse'
      x-evidence:
        kind: code-example
        language: ruby
        snippet: URI("https://sandbox.duve.com/api/openapi/v1/oauth2/token"
    post:
      operationId: post_api_openapi_v1_oauth2_token
      tags:
      - Api
      summary: Use this request to create a bearer token which will be used after for authenticating the rest of the requests in the OpenApi.
      description: Token Success response returns expires_in and access_token. Errors may return an error field.
      x-source: https://developers.duve.com/api-references/open-api/open-api/authorization/token.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiOpenapiV1Oauth2TokenRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiOpenapiV1Oauth2TokenResponse'
      x-evidence:
        kind: documentation
  /api/openapi/v1/reservations/links:
    get:
      operationId: get_api_openapi_v1_reservations_links
      tags:
      - Api
      summary: GET /api/openapi/v1/reservations/links
      x-source: https://developers.duve.com/api-references/open-api/open-api/reservations/guest-link.md
      parameters:
      - name: crsExternalId
        in: query
        required: false
        schema:
          type: string
      - name: includeLastMessage
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: ruby
        snippet: URI("https://sandbox.duve.com/api/openapi/v1/reservations/links?crsExternalId=%7B%7BcrsExternalId%7D%7D&includeLastMessage=1"
  /api/openapi/v1/webhooks:
    get:
      operationId: get_api_openapi_v1_webhooks
      tags:
      - Api
      summary: GET /api/openapi/v1/webhooks
      x-source: https://developers.duve.com/api-references/open-api/open-api/webhooks-management/get-company-webhooks.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: ruby
        snippet: URI("https://sandbox.duve.com/api/openapi/v1/webhooks"
    post:
      operationId: post_api_openapi_v1_webhooks
      tags:
      - Api
      summary: Create an outgoing Duve Connect webhook configuration for your company.
      x-source: https://developers.duve.com/api-references/open-api/open-api/webhooks-management/create-company-webhook.md
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
        description: Bearer access token.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiOpenapiV1WebhooksRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiOpenapiV1WebhooksResponse'
      x-evidence:
        kind: documentation
  /api/openapi/v1/webhooks/{id}:
    delete:
      operationId: delete_api_openapi_v1_webhooks_id
      tags:
      - Api
      summary: Delete webhook
      x-source: https://developers.duve.com/api-references/open-api/open-api/webhooks-management/delete-company-webhook.md
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
        description: Bearer access token
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    get:
      operationId: get_api_openapi_v1_webhooks_id
      tags:
      - Api
      summary: Get webhook by id
      x-source: https://developers.duve.com/api-references/open-api/open-api/webhooks-management/get-company-webhook.md
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
        description: Bearer access token. See Authentication endpoint for details.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiOpenapiV1WebhooksIdResponse'
      x-evidence:
        kind: documentation
    put:
      operationId: put_api_openapi_v1_webhooks_id
      tags:
      - Api
      summary: Update webhook
      x-source: https://developers.duve.com/api-references/open-api/open-api/webhooks-management/update-company-webhook.md
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
        description: Bearer access token. See Authentication endpoint for details.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutApiOpenapiV1WebhooksIdRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutApiOpenapiV1WebhooksIdResponse'
      x-evidence:
        kind: documentation
  /api/v1/hooks/accommodation/connect:
    get:
      operationId: get_api_v1_hooks_accommodation_connect
      tags:
      - Api
      summary: GET /api/v1/hooks/accommodation/connect
      x-source: https://developers.duve.com/api-references/pms-api/pms/accommodation/connect-accommodation.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: ruby
        snippet: URI("https://sandbox.duve.com/api/v1/hooks/accommodation/connect"
    post:
      operationId: post_api_v1_hooks_accommodation_connect
      tags:
      - Api
      summary: Create or update an accommodation in Duve
      description: Create or update an accommodation in Duve
      x-source: https://developers.duve.com/api-references/pms-api/pms/accommodation/connect-accommodation.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiV1HooksAccommodationConnectRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiV1HooksAccommodationConnectResponse'
      x-evidence:
        kind: documentation
  /api/v1/hooks/reservation/connect:
    get:
      operationId: get_api_v1_hooks_reservation_connect
      tags:
      - Api
      summary: GET /api/v1/hooks/reservation/connect
      x-source: https://developers.duve.com/api-references/pms-api/pms/reservation/connect-reservation.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: ruby
        snippet: URI("https://sandbox.duve.com/api/v1/hooks/reservation/connect"
    post:
      operationId: post_api_v1_hooks_reservation_connect
      tags:
      - Api
      summary: Create or update an reservation in Duve
      x-source: https://developers.duve.com/api-references/pms-api/pms/reservation/connect-reservation.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiV1HooksReservationConnectRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiV1HooksReservationConnectResponse'
      x-evidence:
        kind: documentation
  /openapi/v1/accounts:
    get:
      operationId: get_openapi_v1_accounts
      tags:
      - Openapi
      summary: Multi-Account Management
      x-source: https://developers.duve.com/api-references/open-api/best-practices.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /openapi/v1/oauth2/token:
    post:
      operationId: post_openapi_v1_oauth2_token
      tags:
      - Openapi
      summary: Secure Authentication and Token Management
      x-source: https://developers.duve.com/api-references/open-api/best-practices.md
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /openapi/v1/reservations/links:
    get:
      operationId: get_openapi_v1_reservations_links
      tags:
      - Openapi
      summary: Get reservation links
      x-source: https://developers.duve.com/api-references/open-api/introduction.md
      parameters:
      - name: externalId
        in: query
        required: false
        schema:
          type: string
        description: Reservation external identifier
      - name: includeLastMessage
        in: query
        required: false
        schema:
          type: integer
        description: Flag to include the last chat message (1 to include)
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetOpenapiV1ReservationsLinksResponse'
      x-evidence:
        kind: documentation
components:
  schemas:
    GetApiOpenapiV1AccountsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              id:
                type: string
              externalId:
                type: string
              token:
                type: string
              expires_in:
                type: integer
        pagination:
          type: object
          properties:
            pageSize:
              type: integer
            total:
              type: integer
            pages:
              type: integer
            page:
              type: integer
            hasMore:
              type: boolean
    GetApiOpenapiV1AccountsAccountexternalidTokenResponse:
      type: object
      properties:
        token:
          type: string
        expires_in:
          type: integer
    GetApiOpenapiV1Oauth2TokenResponse:
      type: object
      properties:
        client_id:
          type: string
        client_secret:
          type: string
        grant_type:
          type: string
    PostApiOpenapiV1Oauth2TokenRequest:
      type: object
      properties:
        client_id:
          type: string
        client_secret:
          type: string
        grant_type:
          type: string
        scope:
          type: string
      required:
      - client_id
      - client_secret
      - grant_type
    PostApiOpenapiV1Oauth2TokenResponse:
      type: object
      properties:
        expires_in:
          type: integer
        access_token:
          type: string
    PostApiOpenapiV1WebhooksRequest:
      type: object
      properties:
        name:
          type: string
        event:
          type: string
        url:
          type: string
        conditions:
          type: array
          description: list of WebhookCondition
        dataPoints:
          type: array
          description: list of string
        isEnabled:
          type: boolean
          description: 'default: true'
        headers:
          type: array
          description: list of WebhookHeader
        brands:
          type: array
          description: list of string (Brand ids)
        valueNameToCompare:
          type: string
        notifyOnWebhookFailures:
          type: boolean
        failureNotificationEmails:
          type: array
          description: list of string
      required:
      - name
      - event
      - url
    PostApiOpenapiV1WebhooksResponse:
      type: object
      properties:
        _id:
          type: string
        name:
          type: string
        event:
          type: string
        url:
          type: string
        conditions:
          type: array
          description: list of WebhookCondition
        dataPoints:
          type: array
          description: list of string
        isEnabled:
          type: boolean
          description: 'default: true'
        headers:
          type: array
          description: list of WebhookHeader
        brands:
          type: array
          description: list of string (Brand ids)
        valueNameToCompare:
          type: string
        notifyOnWebhookFailures:
          type: boolean
        failureNotificationEmails:
          type: array
          description: list of string
    GetApiOpenapiV1WebhooksIdResponse:
      type: object
      properties:
        _id:
          type: string
        name:
          type: string
        event:
          type: string
          description: Event key. See Appendix - Webhook events.
        url:
          type: string
        conditions:
          type: array
          description: list of WebhookCondition
        dataPoints:
          type: array
          description: list of string – See Appendix - Webhook data points.
        isEnabled:
          type: boolean
          description: 'default: true'
        headers:
          type: array
          description: list of WebhookHeader
        brands:
          type: array
          description: list of string – Brand ids (ObjectId as string) to limit delivery
        valueNameToCompare:
          type: string
        notifyOnWebhookFailures:
          type: boolean
        failureNotificationEmails:
          type: array
          description: list of string – Email addresses to notify on webhook failures
    PutApiOpenapiV1WebhooksIdRequest:
      type: object
      properties:
        name:
          type: string
        event:
          type: string
          description: Event key.
        url:
          type: string
        conditions:
          type: array
          description: list of WebhookCondition
        dataPoints:
          type: array
          description: list of string
        isEnabled:
          type: boolean
          description: 'default: true'
        headers:
          type: array
          description: list of WebhookHeader
        brands:
          type: array
          description: list of string (Brand ids)
        valueNameToCompare:
          type: string
        notifyOnWebhookFailures:
          type: boolean
        failureNotificationEmails:
          type: array
          description: list of string
      required:
      - name
      - event
      - url
    PutApiOpenapiV1WebhooksIdResponse:
      type: object
      properties:
        _id:
          type: string
        name:
          type: string
        event:
          type: string
          description: Event key.
        url:
          type: string
        conditions:
          type: array
          description: list of WebhookCondition
        dataPoints:
          type: array
          description: list of string
        isEnabled:
          type: boolean
          description: 'default: true'
        headers:
          type: array
          description: list of WebhookHeader
        brands:
          type: array
          description: list of string (Brand ids)
        valueNameToCompare:
          type: string
        notifyOnWebhookFailures:
          type: boolean
        failureNotificationEmails:
          type: array
          description: list of string
    PostApiV1HooksAccommodationConnectRequest:
      type: object
      properties:
        accountId:
          type: string
          description: The source id that you recieved in Your Duve account.
        event:
          type: string
          description: 'Allowed values: create, update'
        entity:
          type: string
          description: 'Allowed values: accommodation'
        resource:
          type: object
          description: The entity payload body
        apiToken:
          type: object
          description: Authorization token object
      required:
      - accountId
      - event
      - entity
      - resource
    PostApiV1HooksAccommodationConnectResponse:
      type: object
      properties:
        savedProperties:
          type: integer
          description: Number of properties successfully saved during the sync.
        skippedProperties:
          type: integer
          description: Number of properties skipped during the sync.
        summary:
          type: string
          description: Summary of the synchronization process.
    PostApiV1HooksReservationConnectRequest:
      type: object
      properties:
        accountId:
          type: string
          description: The source id that you recieved in Your Duve account.
        event:
          type: string
          description: 'Allowed values: create, update'
        entity:
          type: string
          description: 'Allowed values: reservation'
        resource:
          type: object
          description: The entity payload body
      required:
      - accountId
      - event
      - entity
      - resource
    PostApiV1HooksReservationConnectResponse:
      type: object
      properties:
        newReservations:
          type: integer
          description: Number of new reservations synced.
        updatedReservations:
          type: integer
          description: Number of updated reservations synced.
        skippedReservations:
          type: integer
          description: Number of reservations skipped during the sync.
        summary:
          type: string
          description: Summary of the sync process.
        reservationIds:
          type: array
          description: List of reservation IDs processed in the sync.
    GetOpenapiV1ReservationsLinksResponse:
      type: object
      properties:
        guestApp:
          type: string
          description: URL to the guest app
        chatLink:
          type: string
          description: URL to the chat
        onlineCheckInLink:
          type: string
          description: URL to the online check‑in page
        chatLastMessage:
          type: object
          description: Details of the last chat message
        chatLastMessage.body:
          type: string
          description: Plain text of the message content
        chatLastMessage.author:
          type: string
          description: Name of the author of the message
        chatLastMessage.authorType:
          type: string
          description: Type of author (user for guest, admin for host)
        chatLastMessage.time:
          type: string
          description: Timestamp of the message
        chatLastMessage.sentVia:
          type: string
          description: Channel the message was sent via
        chatLastMessage.hasAttachment:
          type: boolean
          description: Whether the message has an attachment
        chatLastMessage.seen:
          type: boolean
          description: Seen status of the last message
  securitySchemes:
    client_credentials:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://sandbox.duve.com/api/openapi/v1/oauth2/token
          scopes: {}
      x-source: https://developers.duve.com/api-references/open-api/open-api/authorization/token.md
tags:
- name: Api
- name: Openapi
security:
- client_credentials: []