/api/v1/calendar/eventsCria uma reunião no calendário nativo com o membro da chave como proprietário. O proprietário nunca vem do corpo da requisição.
createConference solicita um link do Google Meet e implica syncToGoogle. Ambas as opções exigem conexão Google com permissão de escrita. Se o Google falhar, a criação inteira falha. recordWithBot exige um link de conferência criado nesta chamada ou informado em conferenceUrl; o bot participa apenas do Google Meet ou Microsoft Teams.
Exemplos
A URL usa o servidor de produção. Defina PIPEFACIL_API_KEY e as variáveis de caminho (como SEQ ou ID) com os identificadores reais. Ajuste o corpo antes de executar: requisições de escrita alteram dados do workspace.
cURL
curl --request POST \
--url "https://pipefacil-server.matchsales.com.br/api/v1/calendar/events" \
--header "Authorization: Bearer $PIPEFACIL_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"summary": "Apresentação da proposta",
"start": {
"dateTime": "2026-10-06T14:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"end": {
"dateTime": "2026-10-06T14:30:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"allDay": false
}'JavaScript
const response = await fetch(`https://pipefacil-server.matchsales.com.br/api/v1/calendar/events`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PIPEFACIL_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"summary": "Apresentação da proposta",
"start": {
"dateTime": "2026-10-06T14:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"end": {
"dateTime": "2026-10-06T14:30:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"allDay": false
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const text = await response.text();
const data = text ? JSON.parse(text) : null;Python
import os
import json
import requests
response = requests.request(
"POST",
f"https://pipefacil-server.matchsales.com.br/api/v1/calendar/events",
headers={"Authorization": f"Bearer {os.environ['PIPEFACIL_API_KEY']}"},
json=json.loads("{\n \"summary\": \"Apresentação da proposta\",\n \"start\": {\n \"dateTime\": \"2026-10-06T14:00:00-03:00\",\n \"timeZone\": \"America/Sao_Paulo\"\n },\n \"end\": {\n \"dateTime\": \"2026-10-06T14:30:00-03:00\",\n \"timeZone\": \"America/Sao_Paulo\"\n },\n \"allDay\": false\n}"),
)
response.raise_for_status()
data = response.json() if response.content else NoneCorpo da requisição
Content-Type: application/json · obrigatório
{
"summary": "Apresentação da proposta",
"start": {
"dateTime": "2026-10-06T14:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"end": {
"dateTime": "2026-10-06T14:30:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"allDay": false
}| Campo | Tipo | Obrigatório no objeto | Descrição |
|---|---|---|---|
summary | string | Sim | Até 255 caracteres. |
description | string | Não | Aceita null. |
location | string | Não | Aceita null. Até 500 caracteres. |
start | EventDateTime | Sim | Mesmo formato do Google Calendar: date para dia inteiro ou dateTime para instante ISO 8601. Nunca envie ambos. |
start.date | string | Não | Data no formato YYYY-MM-DD para eventos de dia inteiro. Formato: date. Aceita null. |
start.dateTime | string | Não | Formato: date-time. Aceita null. |
start.timeZone | string | Não | Fuso IANA. Padrão: fuso do workspace. Aceita null. |
end | EventDateTime | Sim | Mesmo formato do Google Calendar: date para dia inteiro ou dateTime para instante ISO 8601. Nunca envie ambos. |
end.date | string | Não | Data no formato YYYY-MM-DD para eventos de dia inteiro. Formato: date. Aceita null. |
end.dateTime | string | Não | Formato: date-time. Aceita null. |
end.timeZone | string | Não | Fuso IANA. Padrão: fuso do workspace. Aceita null. |
allDay | boolean | Não | Aceita null. |
status | string | Não | confirmed (padrão), tentative, cancelled. Aceita null. |
attendees | array | Não | Cada entrada usa { type: member, memberId } ou { type: contact, contactId }. Identificador desconhecido resulta em 400. Aceita null. |
attendees[].type | string | Não | Valores: member, contact. |
attendees[].memberId | string | Não | Aceita null. |
attendees[].contactId | string | Não | Aceita null. |
attendees[].responseStatus | string | Não | Valores: needs_action, accepted, declined, tentative. |
attendees[].organizer | boolean | Não | — |
attendees[].optional | boolean | Não | — |
extendedProperties | object | Não | Aceita null. |
syncToGoogle | boolean | Não | Sincroniza a reunião no Google Calendar do proprietário. Exige conexão com permissão de escrita. Aceita null. |
createConference | boolean | Não | Solicita um link do Google Meet. Implica syncToGoogle. Aceita null. |
recordWithBot | boolean | Não | Solicita gravação pelo bot. Requer link de Google Meet ou Microsoft Teams; caso contrário, retorna 400. Aceita null. |
conferenceUrl | string | Não | Link de reunião existente, quando não estiver criando uma conferência. Para gravação pelo bot, use Google Meet ou Microsoft Teams. Aceita null. Até 1000 caracteres. |
Esquema OpenAPI
{
"type": "object",
"required": [
"summary",
"start",
"end"
],
"properties": {
"summary": {
"type": "string",
"maxLength": 255
},
"description": {
"type": "string",
"nullable": true
},
"location": {
"type": "string",
"maxLength": 500,
"nullable": true
},
"start": {
"$ref": "#/components/schemas/EventDateTime"
},
"end": {
"$ref": "#/components/schemas/EventDateTime"
},
"allDay": {
"type": "boolean",
"nullable": true
},
"status": {
"type": "string",
"nullable": true,
"description": "confirmed (padrão), tentative, cancelled."
},
"attendees": {
"type": "array",
"nullable": true,
"description": "Cada entrada usa { type: member, memberId } ou { type: contact, contactId }. Identificador desconhecido resulta em `400`.",
"items": {
"$ref": "#/components/schemas/CalendarAttendeeRequest"
}
},
"extendedProperties": {
"type": "object",
"additionalProperties": true,
"nullable": true
},
"syncToGoogle": {
"type": "boolean",
"nullable": true,
"description": "Sincroniza a reunião no Google Calendar do proprietário. Exige conexão com permissão de escrita."
},
"createConference": {
"type": "boolean",
"nullable": true,
"description": "Solicita um link do Google Meet. Implica syncToGoogle."
},
"recordWithBot": {
"type": "boolean",
"nullable": true,
"description": "Solicita gravação pelo bot. Requer link de Google Meet ou Microsoft Teams; caso contrário, retorna 400."
},
"conferenceUrl": {
"type": "string",
"maxLength": 1000,
"nullable": true,
"description": "Link de reunião existente, quando não estiver criando uma conferência. Para gravação pelo bot, use Google Meet ou Microsoft Teams."
}
},
"example": {
"summary": "Apresentação da proposta",
"start": {
"dateTime": "2026-10-06T14:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"end": {
"dateTime": "2026-10-06T14:30:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"allDay": false
}
}Respostas
201Criado
| Campo | Tipo | Descrição |
|---|---|---|
data | CalendarEvent | Formato único do calendário, utilizado por todos os itens, independentemente da fonte. |
data.id | string | provider:kind:id, por exemplo, native:meeting:5f2c… |
data.provider | string | Valores: native, google. |
data.kind | string | Valores: meeting, task, cadence_task. |
data.readOnly | boolean | Não pode ser alterado por esta API; somente reuniões nativas permitem escrita. |
data.status | string | confirmed, tentative, cancelled. |
data.summary | string | — |
data.description | string | Aceita null. |
data.location | string | Aceita null. |
data.start | EventDateTime | Mesmo formato do Google Calendar: date para dia inteiro ou dateTime para instante ISO 8601. Nunca envie ambos. |
data.start.date | string | Data no formato YYYY-MM-DD para eventos de dia inteiro. Formato: date. Aceita null. |
data.start.dateTime | string | Formato: date-time. Aceita null. |
data.start.timeZone | string | Fuso IANA. Padrão: fuso do workspace. Aceita null. |
data.end | EventDateTime | Mesmo formato do Google Calendar: date para dia inteiro ou dateTime para instante ISO 8601. Nunca envie ambos. |
data.end.date | string | Data no formato YYYY-MM-DD para eventos de dia inteiro. Formato: date. Aceita null. |
data.end.dateTime | string | Formato: date-time. Aceita null. |
data.end.timeZone | string | Fuso IANA. Padrão: fuso do workspace. Aceita null. |
data.attendees | array | — |
data.attendees[].type | string | Valores: member, contact. |
data.attendees[].member | object | Aceita null. |
data.attendees[].member.id | string | — |
data.attendees[].member.userId | string | — |
data.attendees[].member.name | string | — |
data.attendees[].member.email | string | — |
data.attendees[].member.image | string | Aceita null. |
data.attendees[].member.role | string | — |
data.attendees[].contact | object | Aceita null. |
data.attendees[].contact.id | string | — |
data.attendees[].contact.displayName | string | — |
data.attendees[].contact.email | string | Aceita null. |
data.attendees[].contact.phone | string | Aceita null. |
data.attendees[].removed | boolean | A identidade não existe mais; o convidado continua no histórico. |
data.attendees[].responseStatus | string | Valores: needs_action, accepted, declined, tentative. |
data.attendees[].organizer | boolean | — |
data.attendees[].optional | boolean | — |
data.owner | object | Nulo quando o membro proprietário saiu do workspace. Aceita null. |
data.owner.userId | string | — |
data.owner.name | string | — |
data.owner.email | string | — |
data.owner.image | string | Aceita null. |
data.owner.role | string | Papel do membro no workspace, por exemplo owner. |
data.owner.id | string | ID do vínculo de membro no workspace. userId identifica o usuário. |
data.extendedProperties | object | Aceita null. |
data.conferenceUrl | string | Link da reunião, independentemente de sua origem. Aceita null. |
data.botEnabled | boolean | O bot de gravação está configurado para esta reunião. |
data.botStatus | string | Último estado informado pelo bot. Aceita null. |
data.created | string | Formato: date-time. Aceita null. |
data.updated | string | Formato: date-time. Aceita null. |
message | string | Aceita null. |
Esquema OpenAPI
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/CalendarEvent"
},
"message": {
"type": "string",
"nullable": true
}
}
}400Falha de validação dos campos; `fieldErrors` contém os erros.
| Campo | Tipo | Descrição |
|---|---|---|
error | string | — |
code | string | Valores: BAD_REQUEST, VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, FEATURE_DISABLED, NOT_FOUND, CONFLICT, QUOTA_EXCEEDED, UNPROCESSABLE_ENTITY, INTERNAL_ERROR, SERVICE_UNAVAILABLE. |
requestId | string | — |
details | string | Aceita null. |
fieldErrors | array | Aceita null. |
fieldErrors[].field | string | — |
fieldErrors[].message | string | — |
Esquema OpenAPI
{
"type": "object",
"description": "Formato padrão de erro. `details` e `fieldErrors` são omitidos quando ausentes.",
"properties": {
"error": {
"type": "string"
},
"code": {
"type": "string",
"enum": [
"BAD_REQUEST",
"VALIDATION_ERROR",
"UNAUTHORIZED",
"FORBIDDEN",
"FEATURE_DISABLED",
"NOT_FOUND",
"CONFLICT",
"QUOTA_EXCEEDED",
"UNPROCESSABLE_ENTITY",
"INTERNAL_ERROR",
"SERVICE_UNAVAILABLE"
]
},
"requestId": {
"type": "string"
},
"details": {
"type": "string",
"nullable": true
},
"fieldErrors": {
"type": "array",
"nullable": true,
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
}
},
"required": [
"error",
"code",
"requestId"
]
}401Chave ausente, malformada, desconhecida, revogada ou expirada, ou membro emissor inativo.
| Campo | Tipo | Descrição |
|---|---|---|
error | string | — |
code | string | Valores: BAD_REQUEST, VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, FEATURE_DISABLED, NOT_FOUND, CONFLICT, QUOTA_EXCEEDED, UNPROCESSABLE_ENTITY, INTERNAL_ERROR, SERVICE_UNAVAILABLE. |
requestId | string | — |
details | string | Aceita null. |
fieldErrors | array | Aceita null. |
fieldErrors[].field | string | — |
fieldErrors[].message | string | — |
Esquema OpenAPI
{
"type": "object",
"description": "Formato padrão de erro. `details` e `fieldErrors` são omitidos quando ausentes.",
"properties": {
"error": {
"type": "string"
},
"code": {
"type": "string",
"enum": [
"BAD_REQUEST",
"VALIDATION_ERROR",
"UNAUTHORIZED",
"FORBIDDEN",
"FEATURE_DISABLED",
"NOT_FOUND",
"CONFLICT",
"QUOTA_EXCEEDED",
"UNPROCESSABLE_ENTITY",
"INTERNAL_ERROR",
"SERVICE_UNAVAILABLE"
]
},
"requestId": {
"type": "string"
},
"details": {
"type": "string",
"nullable": true
},
"fieldErrors": {
"type": "array",
"nullable": true,
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
}
},
"required": [
"error",
"code",
"requestId"
]
}403Autenticado, mas sem acesso: falta de permissão (`FORBIDDEN`), recurso desligado no workspace (`FEATURE_DISABLED`) ou tentativa de acessar uma agenda não permitida.
| Campo | Tipo | Descrição |
|---|---|---|
error | string | — |
code | string | Valores: BAD_REQUEST, VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, FEATURE_DISABLED, NOT_FOUND, CONFLICT, QUOTA_EXCEEDED, UNPROCESSABLE_ENTITY, INTERNAL_ERROR, SERVICE_UNAVAILABLE. |
requestId | string | — |
details | string | Aceita null. |
fieldErrors | array | Aceita null. |
fieldErrors[].field | string | — |
fieldErrors[].message | string | — |
Esquema OpenAPI
{
"type": "object",
"description": "Formato padrão de erro. `details` e `fieldErrors` são omitidos quando ausentes.",
"properties": {
"error": {
"type": "string"
},
"code": {
"type": "string",
"enum": [
"BAD_REQUEST",
"VALIDATION_ERROR",
"UNAUTHORIZED",
"FORBIDDEN",
"FEATURE_DISABLED",
"NOT_FOUND",
"CONFLICT",
"QUOTA_EXCEEDED",
"UNPROCESSABLE_ENTITY",
"INTERNAL_ERROR",
"SERVICE_UNAVAILABLE"
]
},
"requestId": {
"type": "string"
},
"details": {
"type": "string",
"nullable": true
},
"fieldErrors": {
"type": "array",
"nullable": true,
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
}
},
"required": [
"error",
"code",
"requestId"
]
}429Limite de requisições excedido por workspace ou IP.
| Campo | Tipo | Descrição |
|---|---|---|
error | string | — |
code | string | Valores: BAD_REQUEST, VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, FEATURE_DISABLED, NOT_FOUND, CONFLICT, QUOTA_EXCEEDED, UNPROCESSABLE_ENTITY, INTERNAL_ERROR, SERVICE_UNAVAILABLE. |
requestId | string | — |
details | string | Aceita null. |
fieldErrors | array | Aceita null. |
fieldErrors[].field | string | — |
fieldErrors[].message | string | — |
Esquema OpenAPI
{
"type": "object",
"description": "Formato padrão de erro. `details` e `fieldErrors` são omitidos quando ausentes.",
"properties": {
"error": {
"type": "string"
},
"code": {
"type": "string",
"enum": [
"BAD_REQUEST",
"VALIDATION_ERROR",
"UNAUTHORIZED",
"FORBIDDEN",
"FEATURE_DISABLED",
"NOT_FOUND",
"CONFLICT",
"QUOTA_EXCEEDED",
"UNPROCESSABLE_ENTITY",
"INTERNAL_ERROR",
"SERVICE_UNAVAILABLE"
]
},
"requestId": {
"type": "string"
},
"details": {
"type": "string",
"nullable": true
},
"fieldErrors": {
"type": "array",
"nullable": true,
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
}
},
"required": [
"error",
"code",
"requestId"
]
}