openapi: 3.1.0
info:
title: Cendyn CRM (PUSHTech) REST API
version: v2
description: 'Token-authenticated REST API for the Cendyn CRM (formerly PUSHTech) hospitality CRM /
CDP platform. Manage account balance, contacts and contact custom fields, companies, products, coupon
lists, purchases, hotel data, audience lists and campaigns, and send email, SMS and push deliveries.
This document was DERIVED by API Evangelist from the provider''s own published, server-rendered API
reference at https://developers.cendyncrm.com/api/docs (Apitome / rspec_api_documentation). Cendyn
CRM does not publish an OpenAPI document; every path, HTTP method, parameter name, parameter description
and example payload here is copied verbatim from that reference. Nothing was invented.'
contact:
name: Cendyn
url: https://www.cendyn.com/contact-us/
termsOfService: https://www.cendyn.com/terms-of-use/
x-provenance:
publisher: API Evangelist
method: derived
derived_from: https://developers.cendyncrm.com/api/docs
provider_published_openapi: false
note: NOT published by Cendyn. Derived from the provider's public HTML API reference; verify against
the live docs before production use.
externalDocs:
description: Cendyn CRM Developers Central
url: https://developers.cendyncrm.com/api
servers:
- url: https://api.eu.cendyncrm.com
description: EU data center
- url: https://api.us.cendyncrm.com
description: US data center
tags:
- name: Account
- name: Sync Data
- name: Contact
- name: Contact Custom fields
- name: Company
- name: Company custom fields
- name: Campaigns
- name: Product
- name: Product custom fields
- name: Coupon lists
- name: Purchase
- name: Hotel Data
- name: Hotel Data custom fields
- name: Deliveries
- name: Audience List
security:
- accountToken: []
components:
securitySchemes:
accountToken:
type: apiKey
in: header
name: Authorization
description: 'Account token authentication. Send `Authorization: Token token={account.secret}`.
Some operations require the account master secret (`Token token={account.master_secret}`).'
paths:
/v2/account/{account_id}/balance/current:
get:
operationId: currentBalanceAccount
summary: Current Balance — Account
tags:
- Account
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/account/current_balance
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: id of the account
responses:
'200':
description: Successful response
content:
application/json:
example:
balance: '582.84660'
currency: eur5
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
/account/{account_id}/sync_data:
post:
operationId: createSyncData
summary: Create — Sync Data
tags:
- Sync Data
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/sync_data/create
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
origin:
description: 'String field to indicate the origin of the Contact(s) and Purchase. Example:
“PMS”'
options:
description: Options to validate contacts email and receive webhook response information
when the request has been processed
contacts:
description: Array of contact data. Maximum 1000 contacts per request.
purchase:
description: Booking and Stay information for the contacts that are in the same request.
options[email_validation[validate]]:
type: boolean
description: 'If true, validate all contact´s emails of the bulk. This service has an
extra cost and will use credits from your Cendyn CRM account. If not enough credits
the import will be processed without email validation. By default: false'
options[email_validation[create_if_invalid]]:
type: boolean
description: 'If true, the contact will be created unless the email is invalid. By default:
false'
options[email_validation[create_if_no_credit]]:
description: 'If not enough credits the import will be processed without email validation.
By default: false'
options[webhook[url]]:
description: URL where the webhook will send information
options[webhook[contacts_extra_fields]]:
description: 'Array that contain extra fields needed to be sent by the webhook.By default
it will be sent by the webhook the following fields: _id, user_id, email, phone_countrycode,
phone_number'
options[webhook[purchase_extra_fields]]:
description: 'Array that contain extra fields need to be sent by the webhook. By default
it will be sent by the webhook the following fields: transaction_code, _id'
contacts[name_first]:
description: Name of the contact
contacts[name_last]:
description: Last name of the contact
contacts[email]:
description: Email of the contact
contacts[user_id]:
description: Unique identifier of contact in your backend
contacts[phone_countrycode]:
description: 'Country code of the contact phone. Example: “+34”'
contacts[phone_number]:
description: Phone number without country code of the contact
contacts[phone]:
description: Full phone number with country code of the contact
contacts[city]:
description: City of the contact
contacts[country]:
description: Country of the contact
contacts[region]:
description: Region of the contact
contacts[zip]:
description: Zip code of the contact
contacts[full_address]:
description: Address of the contact
contacts[born_date]:
type: string
format: date-time
description: 'The date of the birthday in ISO_8601 format, Example: 1990-01-01T00:00:00Z'
contacts[gender]:
description: Gender of the contact (MALE or FEMALE)
contacts[language]:
description: 'Language of the contact in ISO-2 format, Example: ES'
contacts[facebook_id]:
description: Facebook id of the contact
contacts[facebook_friends]:
type: number
description: Number of the friends in facebook of the contact
contacts[twitter_id]:
description: Twitter id of the contact
contacts[twitter_followers]:
type: number
description: Number of the followers in twitter of the contact
contacts[tags]:
description: Array containing tags for this contact
contacts[list_subscriptions[list_id]]:
description: Id of audience list
contacts[list_subscriptions[subscribed]]:
type: boolean
description: If true, subscribe from this list
contacts[channel_subscriptions[channel]]:
description: 'Name of channel. Options: [email, sms, push]'
contacts[channel_subscriptions[blacklisted]]:
type: boolean
description: If true, blacklist this channel
contacts[gdpr_accept_terms]:
type: boolean
description: 'Boolean type: If true, the contact accepted your terms'
contacts[gdpr_marketing_consent]:
type: boolean
description: 'Boolean type: If true, the contact accepted marketing consent'
contacts[gdpr_date]:
type: string
format: date-time
description: 'Date for GDPR changes in ISO_8601 format, Example: 1990-01-01T00:00:00Z'
contacts[gdpr_remote_ip]:
description: 'String type: Contact IP when accepted GDPR'
contacts[[custom field]]:
description: You can create a custom field and use in every contact, only add parameter
in the json with the name of custom (no label)
purchase[campaign_id]:
description: Id of the campaign
purchase[UUID]:
description: Universally unique identifier (UUID) of the product
purchase[transaction_code]:
description: Transaction code of the product purchase of your backend (unique)
purchase[price]:
description: Price of the purchase transaction
purchase[currency]:
description: Currency of the purchase transaction in ISO 4217 format. For example USD,
EUR
purchase[status]:
description: 'Status of purchases of the product, please use only the following status:
add_cart, purchase, remove_cart, product_view, product_refund, purchase_failed, canceled,
no_show, no_paid, check_in, check_out, reserved, confirmed'
purchase[redeem_coupon_code]:
description: Coupon code used in the purchase
purchase[name]:
description: Name of the purchase transaction
purchase[description]:
description: Description of the purchase transaction
purchase[Purchase custom field]:
description: 'You can create Purchase custom field with a specific type and use it within
your API request: ''https://www.cendyncrm.com/settings/product_custom_fields'''
required:
- origin
- purchase[UUID]
- purchase[transaction_code]
- purchase[price]
- purchase[currency]
example:
origin: PMS
options:
email_validation:
validate: true
create_if_invalid: true
create_if_no_credit: true
webhook:
url: https://xxxxxx.xxx
contacts_extra_fields:
- name_first
purchase_extra_fields:
- price
contacts:
- email: '[email protected]'
name_first: Jhon
name_last: Doe
user_id: '[email protected]'
born_date: '1990-01-01T00:00:00Z'
language: EN
country: Germany
city: Berlin
gender: male
purchase:
transaction_code: transaction_code_xxxx
currency: USD
price: 340
product_uuid: uuid_product_xxxxx
status: check_in
responses:
'201':
description: Successful response
content:
application/json:
example:
_id: xxxxxxxxxxxxxxxxxxxxxxxx
number_of_contacts: 1
number_of_purchase: 1
validate_emails: true
contacts_extra_fields:
- name_first
purchase_extra_fields:
- price
webhook_url: https://xxxxxx.xxx
status: queued
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
/account/{account_id}/sync_data/{id}:
get:
operationId: showSyncData
summary: Show — Sync Data
tags:
- Sync Data
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/sync_data/show
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
- name: id
in: path
required: true
schema:
type: string
description: SyncData ID
responses:
'200':
description: Successful response
content:
application/json:
example:
_id: xxxxxxxxxxxxxxxxxxxxxxxx
number_of_contacts: 1
number_of_purchase: 1
validate_emails: true
contacts_extra_fields:
- name_first
purchase_extra_fields:
- price
webhook_url: https://xxxxxx.xxx
status: queued
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
/v2/account/{account_id}/contact:
post:
operationId: createContact
summary: Create — Contact
tags:
- Contact
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/contact/create
x-source-path: /v2/account/{account_id}/contact/
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
device_id:
description: Contact associated device_id
name_first:
description: Name of the contact
name_last:
description: Last name of the contact
email:
description: Email of the contact
phone_countrycode:
description: Country code of the contact phone
phone_number:
description: Phone number without country code of the contact
phone:
description: Full phone number with country code of the contact
city:
description: City of the contact
country:
description: Country of the contact
region:
description: Region of the contact
zip:
description: Zip code of the contact
full_address:
description: Address of the contact
born_date:
type: string
format: date-time
description: 'The date of the birthday in ISO_8601 format, Example: 1990-01-01T00:00:00Z'
gender:
description: Gender of the contact (MALE or FEMALE)
language:
description: 'Language of the contact in ISO-2 format, Example: ES'
user_id:
description: Unique identifier of contact in your backend
facebook_id:
description: Facebook id of the contact
facebook_friends:
type: number
description: Number of the friends in facebook of the contact
google_id:
description: Google+ id of the contact
twitter_id:
description: Twitter id of the contact
twitter_followers:
type: number
description: Number of the followers in twitter of the contact
gdpr_date:
type: string
format: date-time
description: 'Date for GDPR changes in ISO_8601 format, Example: 1990-01-01T00:00:00Z'
last_latitude:
type: number
description: 'Last GPS latitude, Number, example: 27.994401'
last_longitude:
type: number
description: 'Last GPS longitude, Number, example: -81.726896'
'[custom field]':
description: You can create a custom field and use in every contact, only add parameter
in the json with the name of custom ( no label)
list_subscriptions[list_id]:
description: Id of audience list
list_subscriptions[subscribed]:
type: boolean
description: If true, subscribe in this list
gdpr_marketing_consent:
type: boolean
description: 'Boolean type: If true, the contact accepted marketing consent'
gdpr_accept_terms:
type: boolean
description: 'Boolean type: If true, the contact accepted your terms'
gdpr_remote_ip:
description: 'String type: Contact IP when accepted GDPR'
email_validation:
description: Json with email_validation parameters
email_validation[validate]:
type: boolean
description: 'Boolean, if true, validate contact Email, Default: false'
email_validation[create_if_invalid]:
type: boolean
description: 'Boolean: If true, the contact contact will be created if Email is not
valid, Default: false'
email_validation[create_if_no_credit]:
type: boolean
description: 'Boolean: If true, create contact if the account hasn''t credit for validation,
Default: false'
example:
name_first: John
name_last: Doe
email: '[email protected]'
phone_countrycode: '44'
phone_number: '7712345678'
tags:
- tag1
- tag2
responses:
'201':
description: Successful response
content:
application/json:
example:
id: 550aac3da096734ce5000001
name_first: John
name_last: Doe
phone_countrycode: '44'
phone_number: '7712345678'
email: '[email protected]'
tags:
- tag1
- tag2
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
get:
operationId: listContact
summary: List — Contact
tags:
- Contact
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/contact/list
x-source-path: /v2/account/{account_id}/contact/
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
- name: user_id
in: query
required: false
schema:
type: string
description: 'Search by: Contact user_id'
- name: device_id
in: query
required: false
schema:
type: string
description: 'Search by: Contact associated device_id'
- name: name_first
in: query
required: false
schema:
type: string
description: 'Search by: Name of the contact'
- name: name_last
in: query
required: false
schema:
type: string
description: 'Search by: Last name of the contact'
- name: email
in: query
required: false
schema:
type: string
description: 'Search by: Email fo the contact'
- name: phone_countrycode
in: query
required: false
schema:
type: string
description: 'Search by: Country code of the contact phone'
- name: phone_number
in: query
required: false
schema:
type: string
description: 'Search by: Phone number without country code of the contact'
- name: limit
in: query
required: false
schema:
type: string
description: 'limit of number contacts returns, default: 200'
- name: contact_id_from
in: query
required: false
schema:
type: string
description: Contact id to start the list
- name: order
in: query
required: false
schema:
type: string
description: 'creation_date order asc or desc, default: asc'
responses:
'200':
description: Successful response
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
/v2/account/{account_id}/contact/bulk:
post:
operationId: createBulkContact
summary: Create Bulk — Contact
tags:
- Contact
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/contact/create_bulk
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
contacts:
description: Array of contact data. Maximum of 5000 contacts per request.
match_contact_user_id:
type: boolean
description: 'If true, update the contact who have this user_id on the Cendyn CRM platform,
else create a new one. By default: false'
webhook_url:
description: A URL designated to receive notifications or data via webhook transmissions.
validate_emails:
type: boolean
description: 'If true, validate all contact´s emails of the bulk. This service has an
extra cost and will use credits of your Pushtech account. If not enought credits the
import will be processed without emails validation. By default: false'
contacts_webhook_extra_fields:
description: 'Array that contain extra fields needed to be sent by the webhook. By default
it is sent by the webhook the following fields: _id, user_id, email, phone_countrycode,
phone_number'
contacts[device_id]:
description: Contact associated device_id
contacts[name_first]:
description: Name of the contact
contacts[name_last]:
description: Last name of the contact
contacts[email]:
description: Email of the contact
contacts[phone_countrycode]:
description: Country code of the contact phone
contacts[phone_number]:
description: Phone number without country code of the contact
contacts[phone]:
description: Full phone number with country code of the contact
contacts[city]:
description: City of the contact
contacts[country]:
description: Country of the contact
contacts[region]:
description: Region of the contact
contacts[zip]:
description: Zip code of the contact
contacts[full_address]:
description: Address of the contact
contacts[born_date]:
type: string
format: date-time
description: 'The date of the birthday in ISO_8601 format, Example: 1990-01-01T00:00:00Z'
contacts[gender]:
description: Gender of the contact (MALE or FEMALE)
contacts[language]:
description: 'Language of the contact in ISO-2 format, Example: ES'
contacts[user_id]:
description: Unique identifier of contact in your backend
contacts[facebook_id]:
description: Facebook id of the contact
contacts[facebook_friends]:
type: number
description: Number of the friends in facebook of the contact
contacts[google_id]:
description: Google+ id of the contact
contacts[twitter_id]:
description: Twitter id of the contact
contacts[twitter_followers]:
type: number
description: Number of the followers in twitter of the contact
contacts[tags]:
description: Array containing tags for this contact
contacts[list_subscriptions[list_id]]:
description: Id of audience list
contacts[list_subscriptions[subscribed]]:
type: boolean
description: If true, subscribe from this list
contacts[channel_subscriptions[channel]]:
description: 'Name of channel. Options: [email, sms, push]'
contacts[channel_subscriptions[blacklisted]]:
type: boolean
description: If true, blacklist this channel
contacts[gdpr_accept_terms]:
type: boolean
description: 'Boolean type: If true, the contact accepted your terms'
contacts[gdpr_marketing_consent]:
type: boolean
description: 'Boolean type: If true, the contact accepted marketing consent'
contacts[gdpr_date]:
type: string
format: date-time
description: 'Date for GDPR changes in ISO_8601 format, Example: 1990-01-01T00:00:00Z'
contacts[gdpr_remote_ip]:
description: 'String type: Contact IP when accepted GDPR'
contacts[[custom field]]:
description: You can create a custom field and use in every contact, only add parameter
in the json with the name of custom (no label)
required:
- contacts
example:
webhook_url: https://requestb.in/qxvaw0qx
match_contact_user_id: false
validate_emails: false
contacts_webhook_extra_fields:
- name_first
contacts:
- name_first: John
name_last: Doe
email: '[email protected]'
phone_countrycode: '44'
phone_number: '7712345678'
- name_first: John
name_last: Doe
email: '[email protected]'
phone_countrycode: '44'
phone_number: '7712345678'
responses:
'201':
description: Successful response
content:
application/json:
example:
bulk:
_id: 550aac3da096734ce5000001
number_of_contacts: 2
match_contact_user_id: false
validate_emails: false
contacts_webhook_extra_fields:
- name_first
webhook_url: https://requestb.in/qxvaw0qx
status: queue
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
/v2/account/{account_id}/contact/bulk/{bulk_id}:
get:
operationId: getBulkContact
summary: Get Bulk — Contact
tags:
- Contact
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/contact/get_bulk
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
- name: bulk_id
in: path
required: true
schema:
type: string
description: Bulk id
responses:
'200':
description: Successful response
content:
application/json:
example:
bulk:
_id: 550aac3da096734ce5000001
number_of_contacts: 2
match_contact_user_id: false
validate_emails: false
contacts_webhook_extra_fields:
- name_first
webhook_url: https://requestb.in/qxvaw0qx
status: queue
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
/v2/account/{account_id}/contact/{contact_id}:
get:
operationId: showContact
summary: Show — Contact
tags:
- Contact
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/contact/show
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
- name: contact_id
in: path
required: true
schema:
type: string
description: Id of the contact to be showed
responses:
'200':
description: Successful response
content:
application/json:
example:
id: 550aac3da096734ce5000001
name_first: John
name_last: Doe
phone_countrycode: '44'
phone_number: '7712345678'
email: '[email protected]'
tags:
- tag1
- tag2
'401':
description: 'Unauthorized — missing or invalid `Authorization: Token token=...` header.'
put:
operationId: updateContact
summary: Update — Contact
tags:
- Contact
externalDocs:
description: Cendyn CRM API reference
url: https://developers.cendyncrm.com/api/docs/contact/update
parameters:
- name: account_id
in: path
required: true
schema:
type: string
description: Your account unique identifier to access API.
- name: contact_id
in: path
required: true
schema:
type: string
description: Id of the contact to be updated
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
device_id:
description: Contact associated device_id
name_first:
description: Name of the contact
name_last:
description: Last name of the contact
email:
description: Email fo the contact
phone_countrycode:
description: Country code of the contact phone
phone_number:
description: Phone number without country code of the contact
phone:
description: Full phone number with country code of the contact
# --- truncated at 32 KB (149 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/push/refs/heads/main/openapi/push-cendyn-crm-openapi.yml