Front Channels Platform API

Build custom messaging channels that bridge Front to proprietary messaging platforms (e.g. internal portals, niche chat networks).

OpenAPI Specification

front-channel-api-openapi.json Raw ↑
{
  "openapi": "3.0.0",
  "x-api-id": "front",
  "x-explorer-enabled": false,
  "x-proxy-enabled": true,
  "x-samples-enabled": true,
  "info": {
    "version": "1.0.0",
    "title": "Channel API",
    "contact": {
      "name": "Front Platform",
      "url": "https://community.front.com"
    }
  },
  "security": [
    {
      "http": []
    }
  ],
  "servers": [
    {
      "url": "https://api2.frontapp.com"
    }
  ],
  "components": {
    "securitySchemes": {
      "http": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "responses": {
      "acceptedMessage": {
        "description": "An accepted message",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "string",
                  "default": "accepted"
                },
                "message_uid": {
                  "type": "string",
                  "description": "Message unique identifier"
                }
              }
            }
          }
        }
      },
      "applicationMessageTemplate": {
        "description": "An application message template",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApplicationMessageTemplateResponse"
            }
          }
        }
      }
    },
    "schemas": {
      "AddCallRecordingFormFields": {
        "type": "object",
        "required": [
          "recording_type"
        ],
        "properties": {
          "recording_type": {
            "type": "string",
            "enum": [
              "call",
              "voicemail"
            ]
          }
        }
      },
      "AddCallSummary": {
        "type": "object",
        "required": [
          "content"
        ],
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1,
            "description": "Summary text for the call."
          }
        }
      },
      "AddCallTranscript": {
        "type": "object",
        "required": [
          "lines"
        ],
        "properties": {
          "lines": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/TranscriptLine"
            }
          }
        }
      },
      "ApplicationMessageTemplate": {
        "required": [
          "external_id",
          "name",
          "blurb",
          "is_disabled",
          "status_name",
          "variable_mappings",
          "template_preview"
        ],
        "allOf": [
          {
            "$ref": "#/components/schemas/ApplicationMessageTemplateEditBlob"
          },
          {
            "type": "object",
            "properties": {
              "external_id": {
                "type": "string"
              }
            }
          }
        ]
      },
      "ApplicationMessageTemplateEditBlob": {
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the message template."
          },
          "blurb": {
            "type": "string",
            "description": "A limited preview of the message template content."
          },
          "is_disabled": {
            "type": "boolean",
            "description": "Whether the message template is enabled for use in the external service."
          },
          "status_name": {
            "type": "string",
            "description": "Either \"PENDING\", \"APPROVED\", or \"REJECTED\". This value helps admins understand why a template may be enabled or disabled in the external service."
          },
          "variable_mappings": {
            "type": "array",
            "description": "List of variable mappings",
            "items": {
              "type": "object",
              "required": [
                "uid",
                "type",
                "name"
              ],
              "properties": {
                "uid": {
                  "type": "string",
                  "description": "Value of the variable"
                },
                "name": {
                  "type": "string",
                  "description": "Name of the variable"
                },
                "type": {
                  "type": "string",
                  "description": "Type of the variable"
                }
              }
            }
          },
          "template_preview": {
            "type": "string",
            "description": "Preview of the template"
          }
        }
      },
      "ApplicationMessageTemplateResponse": {
        "description": "Response for an application message template.",
        "type": "object",
        "properties": {
          "template_id": {
            "type": "number",
            "description": "ID of the application message template",
            "example": "msg_777"
          }
        }
      },
      "CallParty": {
        "type": "object",
        "required": [
          "handle"
        ],
        "properties": {
          "handle": {
            "type": "string",
            "description": "Party identifier compatible with the application channel contact type."
          },
          "name": {
            "type": "string",
            "description": "Optional display name for the party."
          }
        }
      },
      "CreateCall": {
        "discriminator": {
          "propertyName": "direction",
          "mapping": {
            "inbound": "#/components/schemas/CreateCallInbound",
            "outbound": "#/components/schemas/CreateCallOutbound"
          }
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/CreateCallInbound"
          },
          {
            "$ref": "#/components/schemas/CreateCallOutbound"
          }
        ],
        "properties": {
          "direction": {
            "type": "string",
            "enum": [
              "inbound",
              "outbound"
            ],
            "description": "Use `inbound` with required `from` (external party); use `outbound` with required `to` (callee)."
          }
        }
      },
      "CreateCallInbound": {
        "type": "object",
        "required": [
          "external_call_id",
          "initial_status",
          "direction",
          "from",
          "parent_external_call_id"
        ],
        "properties": {
          "external_call_id": {
            "type": "string",
            "description": "Stable identifier for this call in the provider system."
          },
          "initial_status": {
            "type": "string",
            "enum": [
              "queued",
              "ringing"
            ]
          },
          "direction": {
            "type": "string",
            "enum": [
              "inbound"
            ],
            "description": "Inbound calls must include `from` (external party who initiated). The channel is treated as the receiving side (e.g. agent or queue)."
          },
          "from": {
            "$ref": "#/components/schemas/CallParty",
            "description": "External party who initiated the inbound call."
          },
          "started_at": {
            "type": "number",
            "description": "Optional Unix timestamp (ms) when the call started."
          },
          "parent_external_call_id": {
            "type": "string",
            "description": "External ID of the parent call (e.g. where the call was transferred from). This will be used to thread the call into an existing conversation with a matching parent call ID."
          },
          "agent_email_address": {
            "type": "string",
            "description": "Optional email of the teammate associated with the call."
          }
        }
      },
      "CreateCallOutbound": {
        "type": "object",
        "required": [
          "external_call_id",
          "initial_status",
          "direction",
          "to",
          "parent_external_call_id"
        ],
        "properties": {
          "external_call_id": {
            "type": "string",
            "description": "Stable identifier for this call in the provider system."
          },
          "initial_status": {
            "type": "string",
            "enum": [
              "queued",
              "ringing"
            ]
          },
          "direction": {
            "type": "string",
            "enum": [
              "outbound"
            ],
            "description": "Outbound calls must include `to` (callee). The channel is treated as the originating side (e.g. agent)."
          },
          "to": {
            "$ref": "#/components/schemas/CallParty",
            "description": "Party being called (callee)."
          },
          "started_at": {
            "type": "number",
            "description": "Optional Unix timestamp (ms) when the call started."
          },
          "parent_external_call_id": {
            "type": "string",
            "description": "External ID of the parent call (e.g. where the call was transferred from). This will be used to thread the call into an existing conversation with a matching parent call ID."
          },
          "agent_email_address": {
            "type": "string",
            "description": "Optional email of the teammate associated with the call."
          }
        }
      },
      "InboundMessage": {
        "required": [
          "sender",
          "body",
          "metadata"
        ],
        "properties": {
          "sender": {
            "type": "object",
            "description": "Data of the sender",
            "required": [
              "handle"
            ],
            "properties": {
              "name": {
                "type": "string",
                "description": "Name of the sender"
              },
              "handle": {
                "type": "string",
                "description": "Handle of the sender. It can be any string used to uniquely identify the sender. **Important:** When sending a phone number, include a country code preceded by a plus (+) sign. For example, +33 for France. If you do not send a country code or include a plus sign, Front will normalize your phone number to the USA (+1)."
              },
              "email": {
                "type": "string",
                "description": "Email of the sender. When provided, links this contact to existing contacts with the same email to prevent duplicates across channels."
              }
            }
          },
          "subject": {
            "type": "string",
            "description": "Subject of the message"
          },
          "body": {
            "type": "string",
            "description": "The body of the message in HTML or plain text format."
          },
          "metadata": {
            "type": "object",
            "required": [
              "external_id",
              "external_conversation_id"
            ],
            "properties": {
              "external_id": {
                "type": "string",
                "maxLength": 200,
                "description": "External identifier of the message"
              },
              "external_conversation_id": {
                "type": "string",
                "maxLength": 200,
                "description": "External identifier of the conversation. Will be used to thread messages."
              },
              "referenced_message_external_id": {
                "type": "string",
                "maxLength": 200,
                "description": "External identifier of the message that this message is replying to. Use this for explicit replies."
              }
            }
          },
          "delivered_at": {
            "type": "integer",
            "description": "Time in seconds at which message was created in external system"
          },
          "attachments": {
            "description": "Binary data of attached files. Must use `Content-Type: multipart/form-data` if specified. See [example](https://gist.github.com/hdornier/e04d04921032e98271f46ff8a539a4cb) or read more about [Attachments](https://dev.frontapp.com/docs/attachments-1).  Max 25 MB.",
            "type": "array",
            "items": {
              "type": "string",
              "format": "binary"
            }
          }
        }
      },
      "OutboundMessage": {
        "required": [
          "to",
          "body",
          "metadata"
        ],
        "description": "Payload to receive an outbound message from an external system into Front.",
        "properties": {
          "sender_name": {
            "type": "string",
            "description": "Name of the sender"
          },
          "to": {
            "type": "array",
            "description": "Data of the message recipient",
            "items": {
              "type": "object",
              "required": [
                "handle"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the recipient"
                },
                "handle": {
                  "type": "string",
                  "description": "Handle of the recipient. It can be any string used to uniquely identify the sender. **Important:** When sending a phone number, include a country code preceded by a plus (+) sign. For example, +33 for France. If you do not send a country code or include a plus sign, Front will normalize your phone number to the USA (+1)."
                },
                "email": {
                  "type": "string",
                  "description": "Email of the recipient. When provided, links this contact to existing contacts with the same email to prevent duplicates across channels."
                }
              }
            }
          },
          "subject": {
            "type": "string",
            "description": "Subject of the message"
          },
          "author_id": {
            "type": "string",
            "description": "ID of the teammate on behalf of whom the message is sent"
          },
          "body": {
            "type": "string",
            "description": "The body of the message in HTML or plain text format."
          },
          "metadata": {
            "type": "object",
            "required": [
              "external_id",
              "external_conversation_id"
            ],
            "properties": {
              "external_id": {
                "type": "string",
                "maxLength": 200,
                "description": "External identifier of the message"
              },
              "external_conversation_id": {
                "type": "string",
                "maxLength": 200,
                "description": "External identifier of the conversation. Will be used to thread messages."
              },
              "referenced_message_external_id": {
                "type": "string",
                "maxLength": 200,
                "description": "External identifier of the message that this message is replying to. Use this for explicit replies."
              }
            }
          },
          "delivered_at": {
            "type": "integer",
            "description": "Time in seconds at which message was created in external system"
          },
          "attachments": {
            "description": "Binary data of attached files. Must use `Content-Type: multipart/form-data` if specified. See [example](https://gist.github.com/hdornier/e04d04921032e98271f46ff8a539a4cb) or read more about [Attachments](https://dev.frontapp.com/docs/attachments-1).  Max 25 MB.",
            "type": "array",
            "items": {
              "type": "string",
              "format": "binary"
            }
          }
        }
      },
      "TranscriptLine": {
        "type": "object",
        "required": [
          "speaker_name",
          "content",
          "start_time_seconds",
          "speaker_type"
        ],
        "properties": {
          "speaker_name": {
            "type": "string"
          },
          "content": {
            "type": "string"
          },
          "start_time_seconds": {
            "type": "number"
          },
          "speaker_type": {
            "type": "string",
            "enum": [
              "internal",
              "external"
            ],
            "description": "internal for agent or system-side speech; external for the other party."
          }
        }
      },
      "UpdateCall": {
        "type": "object",
        "required": [
          "call_status"
        ],
        "properties": {
          "occurred_at": {
            "type": "number",
            "description": "Optional Unix timestamp (ms) when this status change occurred."
          },
          "call_status": {
            "type": "string",
            "enum": [
              "queued",
              "ringing",
              "connected",
              "hold",
              "hangup",
              "abandoned",
              "missed",
              "transferred"
            ]
          },
          "agent_email_address": {
            "type": "string",
            "description": "Optional; include when the status update relates to a specific teammate."
          }
        }
      },
      "UpdateChannel": {
        "properties": {
          "status": {
            "type": "string",
            "description": "Status of the channel",
            "enum": [
              "offline",
              "ok"
            ]
          }
        }
      }
    }
  },
  "paths": {
    "/channels/{channel_id}": {
      "patch": {
        "summary": "Update Channel",
        "operationId": "update-channel",
        "description": "Update a channel.",
        "tags": [
          "Channels"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The Channel ID. Alternatively, you can supply the channel address as a [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          }
        ],
        "requestBody": {
          "description": "Channel details",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateChannel"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "No content"
          }
        },
        "x-required-scopes": [
          "channels:write"
        ]
      }
    },
    "/channels/{channel_id}/application_message_templates": {
      "put": {
        "summary": "Sync application message template",
        "operationId": "sync-application-message-template",
        "description": "Import an application message template from an external service (such as WhatsApp or Facebook). The message template becomes available for use by the channel specified if configured as described in [this topic](https://dev.frontapp.com/update/docs/application-channel-message-templates).",
        "tags": [
          "Application Message Templates"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The channel ID. Alternatively, you can supply the channel address as a [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationMessageTemplate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/applicationMessageTemplate"
          },
          "400": {
            "description": "Channel is not an application channel or does not support application message templates."
          }
        },
        "x-required-scopes": [
          "message_templates:write"
        ]
      }
    },
    "/channels/{channel_id}/application_message_templates/{external_id}": {
      "patch": {
        "summary": "Update application message template",
        "operationId": "update-application-message-template",
        "description": "Update an application message template that already exists in Front.",
        "tags": [
          "Application Message Templates"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The channel ID. Alternatively, you can supply the channel address as a [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          },
          {
            "in": "path",
            "name": "external_id",
            "required": true,
            "description": "The external ID of the application message template.",
            "schema": {
              "type": "string",
              "default": "ext_123"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationMessageTemplateEditBlob"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/applicationMessageTemplate"
          },
          "400": {
            "description": "Channel is not an application channel or does not support application message templates."
          }
        },
        "x-required-scopes": [
          "message_templates:write"
        ]
      }
    },
    "/channels/{channel_id}/calls": {
      "post": {
        "summary": "Create a call",
        "operationId": "create-call",
        "description": "Creates a call in Front.",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The Channel ID.",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCall"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request"
          }
        },
        "x-required-scopes": [
          "channels:write"
        ]
      }
    },
    "/channels/{channel_id}/calls/{external_call_id}": {
      "patch": {
        "summary": "Update call status",
        "operationId": "update-call",
        "description": "Updates the call status of a call in Front.",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The Channel ID.",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          },
          {
            "in": "path",
            "name": "external_call_id",
            "required": true,
            "description": "The external call ID from the provider system (same as `external_call_id` on create).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCall"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request"
          }
        },
        "x-required-scopes": [
          "channels:write"
        ]
      }
    },
    "/channels/{channel_id}/calls/{external_call_id}/recording": {
      "post": {
        "summary": "Add call recording",
        "operationId": "add-call-recording",
        "description": "Adds a recording to a call in Front. Send `multipart/form-data` with exactly one file in the `attachments` field, `Content-Type: audio/*`, and required `recording_type` (`call` or `voicemail`).\n",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The Channel ID.",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          },
          {
            "in": "path",
            "name": "external_call_id",
            "required": true,
            "description": "The external call ID from the provider system.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "attachments",
                  "recording_type"
                ],
                "properties": {
                  "attachments": {
                    "type": "string",
                    "format": "binary",
                    "description": "Exactly one audio file (`audio/*`)."
                  },
                  "recording_type": {
                    "type": "string",
                    "enum": [
                      "call",
                      "voicemail"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request"
          }
        },
        "x-required-scopes": [
          "channels:write"
        ]
      }
    },
    "/channels/{channel_id}/calls/{external_call_id}/summary": {
      "post": {
        "summary": "Add call summary",
        "operationId": "add-call-summary",
        "description": "Adds a summary to a call in Front.",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The Channel ID.",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          },
          {
            "in": "path",
            "name": "external_call_id",
            "required": true,
            "description": "The external call ID from the provider system.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddCallSummary"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request"
          }
        },
        "x-required-scopes": [
          "channels:write"
        ]
      }
    },
    "/channels/{channel_id}/calls/{external_call_id}/transcript": {
      "post": {
        "summary": "Add call transcript",
        "operationId": "add-call-transcript",
        "description": "Adds a transcript to a call in Front.",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The Channel ID.",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          },
          {
            "in": "path",
            "name": "external_call_id",
            "required": true,
            "description": "The external call ID from the provider system.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddCallTranscript"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request"
          }
        },
        "x-required-scopes": [
          "channels:write"
        ]
      }
    },
    "/channels/{channel_id}/conversations/{conv_ext_id}/messages/{message_ext_id}/status": {
      "put": {
        "summary": "Update external message status",
        "operationId": "update-external-message-status",
        "description": "Update the status of an outbound message by external ID. This endpoint is used by external systems (like SMS providers or custom channels)\nto notify Front when a message's delivery status has changed.\n\n**Available status changes:**\n- `failed`: Mark a message as failed. When marked as failed, the conversation is reopened so the team can take action.\n\n**Note:** This endpoint is only available for outbound messages.\n",
        "tags": [
          "Messages"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The channel ID. Alternatively, you can supply the channel address as a [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          },
          {
            "in": "path",
            "name": "conv_ext_id",
            "required": true,
            "description": "The conversation's external ID.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "message_ext_id",
            "required": true,
            "description": "The message's external ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "status"
                ],
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "failed"
                    ],
                    "description": "The status to set for the message. Currently only 'failed' is supported."
                  },
                  "reason": {
                    "type": "string",
                    "description": "Optional reason for the status change. This will be displayed to users and logged for debugging purposes."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "No content"
          }
        },
        "x-required-scopes": [
          "messages:write"
        ]
      }
    },
    "/channels/{channel_id}/inbound_messages": {
      "post": {
        "summary": "Sync inbound message",
        "operationId": "sync-inbound-message",
        "description": "Import a message that was received by the channel.",
        "tags": [
          "Messages"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "channel_id",
            "required": true,
            "description": "The channel ID. Alternatively, you can supply the channel address as a [resource alias](https://dev.frontapp.com/docs/resource-aliases-1).",
            "schema": {
              "type": "string",
              "default": "cha_123"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InboundMessage"
              }
            }
          }

# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/front/refs/heads/main/openapi/front-channel-api-openapi.json