Respond.io Tags and Custom Fields API
Manage workspace tags (create, update, delete) and add or remove them on contacts, plus list and create custom fields used to store structured contact metadata.
Manage workspace tags (create, update, delete) and add or remove them on contacts, plus list and create custom fields used to store structured contact metadata.
openapi: 3.0.1
info:
title: Respond.io Developer API
description: >-
REST API for the respond.io omnichannel customer-conversation management
platform. Manage contacts, send and read messages across connected channels,
open and close conversations, assign users, post internal comments, manage
tags and custom fields, and configure webhooks. Requests and responses are
JSON. Contacts are addressed by an identifier of the form `id:{id}`,
`email:{email}`, or `phone:{phone}`.
termsOfService: https://respond.io/terms-and-conditions
contact:
name: Respond.io Support
url: https://developers.respond.io/
version: '2.0'
servers:
- url: https://api.respond.io/v2
security:
- bearerAuth: []
tags:
- name: Contacts
description: Create, read, update, merge, list, and delete contacts.
- name: Messages
description: Send messages to contacts and read message history.
- name: Conversations
description: Open, close, status, and assign conversations.
- name: Comments
description: Internal collaboration comments on a contact.
- name: Tags
description: Workspace tags and contact tag assignment.
- name: Custom Fields
description: Structured contact metadata definitions.
paths:
/contact:
post:
operationId: createContact
tags:
- Contacts
summary: Create a contact
description: Creates a new contact in the workspace.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactCreate'
responses:
'200':
description: Contact created.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'429':
$ref: '#/components/responses/RateLimited'
/contact/create_or_update/{identifier}:
post:
operationId: createOrUpdateContact
tags:
- Contacts
summary: Create or update a contact
description: >-
Creates a contact if none matches the identifier, otherwise updates the
existing contact.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactCreate'
responses:
'200':
description: Contact created or updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'429':
$ref: '#/components/responses/RateLimited'
/contact/list:
get:
operationId: listContacts
tags:
- Contacts
summary: List contacts
description: Returns a paginated list of contacts in the workspace.
parameters:
- name: cursorId
in: query
description: Cursor id for pagination.
required: false
schema:
type: integer
- name: limit
in: query
description: Number of records to return (max 100).
required: false
schema:
type: integer
default: 10
responses:
'200':
description: A list of contacts.
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Contact'
pagination:
$ref: '#/components/schemas/Pagination'
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}:
get:
operationId: getContact
tags:
- Contacts
summary: Get a contact
description: Retrieves a single contact by identifier.
parameters:
- $ref: '#/components/parameters/Identifier'
responses:
'200':
description: The contact.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
put:
operationId: updateContact
tags:
- Contacts
summary: Update a contact
description: Updates the fields of an existing contact.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactCreate'
responses:
'200':
description: Contact updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
delete:
operationId: deleteContact
tags:
- Contacts
summary: Delete a contact
description: Permanently deletes a contact from the workspace.
parameters:
- $ref: '#/components/parameters/Identifier'
responses:
'200':
description: Contact deleted.
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
/contact/merge:
post:
operationId: mergeContacts
tags:
- Contacts
summary: Merge contacts
description: >-
Merges a secondary contact into a primary contact, consolidating
conversations, tags, and fields onto the primary.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- primaryContactId
- secondaryContactId
properties:
primaryContactId:
type: integer
description: Id of the contact to keep.
secondaryContactId:
type: integer
description: Id of the contact merged into the primary.
responses:
'200':
description: Contacts merged.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/tag:
post:
operationId: addContactTags
tags:
- Tags
summary: Add tags to a contact
description: Adds one or more tags to a contact.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
type: string
example:
- vip
- newsletter
responses:
'200':
description: Tags added.
'429':
$ref: '#/components/responses/RateLimited'
delete:
operationId: removeContactTags
tags:
- Tags
summary: Remove tags from a contact
description: Removes one or more tags from a contact.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
type: string
responses:
'200':
description: Tags removed.
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/channel:
get:
operationId: listContactChannels
tags:
- Contacts
summary: List a contact's channels
description: Lists the messaging channels a contact is reachable on.
parameters:
- $ref: '#/components/parameters/Identifier'
responses:
'200':
description: A list of channels.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Channel'
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/message:
post:
operationId: sendMessage
tags:
- Messages
summary: Send a message
description: >-
Sends a message to a contact through a specific channel. If channelId is
omitted, the message is sent through the last interacted channel.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MessageSend'
responses:
'200':
description: Message accepted for delivery.
content:
application/json:
schema:
$ref: '#/components/schemas/MessageResult'
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/message/{messageId}:
get:
operationId: getMessage
tags:
- Messages
summary: Get a message
description: Retrieves a single message from a contact's conversation by message id.
parameters:
- $ref: '#/components/parameters/Identifier'
- name: messageId
in: path
required: true
description: The message identifier.
schema:
type: integer
responses:
'200':
description: The message.
content:
application/json:
schema:
$ref: '#/components/schemas/Message'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/conversation:
post:
operationId: updateConversationStatus
tags:
- Conversations
summary: Open or close a conversation
description: Opens or closes the conversation for a contact.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- status
properties:
status:
type: string
enum:
- open
- close
closingNoteId:
type: integer
description: Optional closing note applied when closing.
responses:
'200':
description: Conversation status updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Conversation'
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/conversation/assignee:
post:
operationId: assignConversation
tags:
- Conversations
summary: Assign or unassign a conversation
description: >-
Assigns a user (human or AI agent) to the contact's conversation, or
unassigns when assignee is null.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
assignee:
type: string
nullable: true
description: User identifier (email) to assign, or null to unassign.
example: email:agent@example.com
responses:
'200':
description: Conversation assignment updated.
'429':
$ref: '#/components/responses/RateLimited'
/contact/{identifier}/comment:
post:
operationId: createComment
tags:
- Comments
summary: Create a comment
description: >-
Adds an internal comment to a contact's conversation. Comments support
mentioning users and are not delivered to the contact.
parameters:
- $ref: '#/components/parameters/Identifier'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- text
properties:
text:
type: string
description: Comment body. Use @[email] to mention a user.
example: Following up @[agent@example.com]
responses:
'200':
description: Comment created.
'429':
$ref: '#/components/responses/RateLimited'
/tag:
post:
operationId: createTag
tags:
- Tags
summary: Create a tag
description: Creates a new workspace tag.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Tag'
responses:
'200':
description: Tag created.
content:
application/json:
schema:
$ref: '#/components/schemas/Tag'
'429':
$ref: '#/components/responses/RateLimited'
/tag/{tagId}:
put:
operationId: updateTag
tags:
- Tags
summary: Update a tag
description: Updates an existing workspace tag.
parameters:
- name: tagId
in: path
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Tag'
responses:
'200':
description: Tag updated.
'429':
$ref: '#/components/responses/RateLimited'
delete:
operationId: deleteTag
tags:
- Tags
summary: Delete a tag
description: Deletes a workspace tag.
parameters:
- name: tagId
in: path
required: true
schema:
type: integer
responses:
'200':
description: Tag deleted.
'429':
$ref: '#/components/responses/RateLimited'
/custom_field:
get:
operationId: listCustomFields
tags:
- Custom Fields
summary: List custom fields
description: Lists all custom field definitions in the workspace.
responses:
'200':
description: A list of custom fields.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/CustomField'
'429':
$ref: '#/components/responses/RateLimited'
post:
operationId: createCustomField
tags:
- Custom Fields
summary: Create a custom field
description: Creates a new custom field definition.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CustomField'
responses:
'200':
description: Custom field created.
content:
application/json:
schema:
$ref: '#/components/schemas/CustomField'
'429':
$ref: '#/components/responses/RateLimited'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: >-
API Access Token from Settings > Integrations > Developer API, sent in
the Authorization header as `Bearer {token}`.
parameters:
Identifier:
name: identifier
in: path
required: true
description: >-
Contact identifier in the form id:{id}, email:{email}, or phone:{phone}.
schema:
type: string
example: phone:+60123456789
responses:
NotFound:
description: Resource not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: Too many requests. Limited to 5 requests per second per method.
headers:
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Contact:
type: object
properties:
id:
type: integer
description: System-assigned contact id.
firstName:
type: string
lastName:
type: string
email:
type: string
format: email
phone:
type: string
language:
type: string
profilePic:
type: string
format: uri
countryCode:
type: string
status:
type: string
description: Lifecycle stage of the contact.
assignee:
type: string
nullable: true
created:
type: integer
description: Unix timestamp when the contact was created.
tags:
type: array
items:
type: string
customFields:
type: array
items:
$ref: '#/components/schemas/CustomFieldValue'
ContactCreate:
type: object
properties:
firstName:
type: string
lastName:
type: string
email:
type: string
format: email
phone:
type: string
language:
type: string
profilePic:
type: string
format: uri
countryCode:
type: string
customFields:
type: array
items:
$ref: '#/components/schemas/CustomFieldValue'
CustomFieldValue:
type: object
properties:
name:
type: string
value:
type: string
CustomField:
type: object
properties:
id:
type: integer
name:
type: string
type:
type: string
enum:
- text
- number
- date
- list
- checkbox
- url
options:
type: array
items:
type: string
description: Allowed values when type is list.
Tag:
type: object
properties:
id:
type: integer
name:
type: string
required:
- name
Channel:
type: object
properties:
id:
type: integer
name:
type: string
source:
type: string
description: Channel source such as whatsapp, messenger, telegram, email, sms.
meta:
type: object
additionalProperties: true
MessageSend:
type: object
required:
- message
properties:
channelId:
type: integer
description: Target channel id. Omit to use the last interacted channel.
message:
$ref: '#/components/schemas/MessageContent'
MessageContent:
type: object
required:
- type
properties:
type:
type: string
enum:
- text
- attachment
- quick_reply
- whatsapp_template
text:
type: string
description: Body text for type text or quick_reply.
attachment:
type: object
properties:
type:
type: string
enum:
- image
- video
- audio
- file
url:
type: string
format: uri
quickReplies:
type: array
items:
type: object
properties:
title:
type: string
payload:
type: string
template:
type: object
description: WhatsApp template payload (name, languageCode, components).
additionalProperties: true
MessageResult:
type: object
properties:
messageId:
type: integer
status:
type: string
example: queued
Message:
type: object
properties:
messageId:
type: integer
contactId:
type: integer
channelId:
type: integer
traffic:
type: string
enum:
- incoming
- outgoing
message:
$ref: '#/components/schemas/MessageContent'
timestamp:
type: integer
status:
type: string
description: Delivery status (sent, delivered, read, failed).
Conversation:
type: object
properties:
contactId:
type: integer
status:
type: string
enum:
- open
- close
assignee:
type: string
nullable: true
opened:
type: integer
closed:
type: integer
nullable: true
Pagination:
type: object
properties:
cursorId:
type: integer
nullable: true
hasMore:
type: boolean
Error:
type: object
properties:
message:
type: string
status:
type: integer