Axuz Developers

POST /teams/{teamId}/calendar/events

Cria event em calendar do team.

  • Access: Team member
  • Service: https://api-calendar.axuz.net

Accepted authentication

  • sessionCookie — Sessão plena Axuz (cookie de sessão da casa). Sessão restrita é 403 enrollment_required.
  • bearerSession — JWT de acesso da sessão em `Authorization: Bearer`.

Responde POST /teams/{teamId}/calendar/events.

Motivo: criar event (single ou recorrente) em um calendar do team ou personal do caller.

Comportamento: valida body (summary obrigatório, calendar_id UUID, dtend >= dtstart, rrule parseável por rrule-go, tz IANA-válido); verifica ownership do calendar (CalendarOwnership) — team calendar deve pertencer ao teamId da URL, personal deve pertencer ao caller; delega repo.CreateEvent; 201 com entity.

Entradas: URL teamId, JSON eventInput.

Retorno: JSON 201 ou erro (400/403/404/500).

Parameters

NameInTypeRequiredDescription
teamIdpathstringyes

Request body

application/json · Required

NameTypeRequiredDescription
calendar_idstring<uuid>yes
summarystringyes
descriptionstring | nullno
locationstring | nullno
dtstartstring<date-time>yes
dtendstring<date-time>yes

Deve ser >= dtstart.

all_daybooleanno
rrulestring | nullno

Validado por rrule-go antes de persistir.

tzstring | nullno

IANA timezone name. Rejeita aliases (EST, GMT-3). '' ou nil = UTC.

remindersarray<CalendarReminderInput> | nullno

R-007. Ausente/null/[] = evento sem lembretes (não há default no servidor). Gravado na MESMA transação do evento. 400 (nunca 500) para: mais de 10 itens, offset ausente/null/fracionário/string ou fora de ±43200, kind fora do enum (comparação exata), par (offset, kind) repetido.

{
  "calendar_id": "00000000-0000-0000-0000-000000000000",
  "summary": "string",
  "description": "string",
  "location": "string",
  "dtstart": "2026-01-15T12:00:00Z",
  "dtend": "2026-01-15T12:00:00Z",
  "all_day": false,
  "rrule": "string",
  "tz": "string",
  "reminders": [
    {
      "trigger_offset_minutes": 1,
      "kind": "email"
    }
  ]
}

Responses

201

Criado.

NameTypeRequiredDescription
idstring<uuid>yes
calendar_idstring<uuid> | nullno
calendar_namestringno
calendar_colorstringno
team_idstring<uuid> | nullno
summarystringyes
descriptionstring | nullno
locationstring | nullno
dtstartstring<date-time>yes
dtendstring<date-time>yes
all_daybooleanyes
rrulestring | nullno

RFC5545 RRULE (ex: FREQ=WEEKLY;BYDAY=MO,WE).

tzstringno

IANA timezone name (Region/City). '' = UTC.

is_recurring_instancebooleanno

True quando é ocorrência expandida (não master row).

recurrence_idstring<date-time> | nullno

dtstart canônico da ocorrência dentro da série.

parent_event_idstring<uuid> | nullno

Aponta pro master quando é override.

is_overriddenbooleanno
created_bystring<uuid>no
created_atstring<date-time>no
updated_atstring<date-time>no
meet_room_idstring<uuid>no

Sala de vídeo vinculada ao evento (F-063). AUSENTE quando o evento não tem sala — o cliente testa presença da chave, não string vazia. Só é devolvido em GET .../events/{id}; a listagem não o traz. Com ele o cliente monta a URL do membro, <MEET_URL>/<teamId>/<meet_room_id>, e distingue "criar sala" de "entrar na sala" sem precisar POSTar para descobrir (O-005).

meet_room_slugstringno

Slug da mesma sala. É a chave da entrada de CONVIDADO (<MEET_URL>/convidado/<slug>, sem conta nem team) — por isso vale como link de compartilhamento externo, e o meet_room_id não.

remindersarray<CalendarEventReminder>no

Lembretes do evento (R-007). Devolvido em GET .../events/{id} e na resposta de POST/PATCH que trouxe reminders; a listagem por janela NÃO o traz. AUSENTE quando o evento não tem lembretes.

reminders[].idstring<uuid>yes
reminders[].trigger_offset_minutesintegeryes
reminders[].kindstringyes

enum: "email", "push", "inapp"

reminders[].fired_atstring<date-time>no

AUSENTE enquanto pendente; presente quando terminal.

400

Input inválido.

NameTypeRequiredDescription
errorstringyes

Mensagem humana curta; sem stack.

401

Faltando ou token inválido.

NameTypeRequiredDescription
errorstringyes

Mensagem humana curta; sem stack.

403

Sem permissão para o recurso.

NameTypeRequiredDescription
errorstringyes

Mensagem humana curta; sem stack.

404

Recurso não encontrado.

NameTypeRequiredDescription
errorstringyes

Mensagem humana curta; sem stack.

429

Limite de requisições excedido.

NameTypeRequiredDescription
errorstringyes

500

Erro interno. Tente de novo com backoff; reporte o X-Request-Id.

NameTypeRequiredDescription
errorstringyes

Examples

"Try it" is turned off in this reference. Use the examples with your test credential.

curl

curl -sS -X POST 'https://api-calendar.axuz.net/teams/TEAM_ID/calendar/events' \
  -H "Authorization: Bearer $AXUZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"calendar_id":"00000000-0000-0000-0000-000000000000","summary":"string","description":"string","location":"string","dtstart":"2026-01-15T12:00:00Z","dtend":"2026-01-15T12:00:00Z","all_day":false,"rrule":"string","tz":"string","reminders":[{"trigger_offset_minutes":1,"kind":"email"}]}'

Node.js

const res = await fetch("https://api-calendar.axuz.net/teams/TEAM_ID/calendar/events", {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.AXUZ_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "calendar_id": "00000000-0000-0000-0000-000000000000",
    "summary": "string",
    "description": "string",
    "location": "string",
    "dtstart": "2026-01-15T12:00:00Z",
    "dtend": "2026-01-15T12:00:00Z",
    "all_day": false,
    "rrule": "string",
    "tz": "string",
    "reminders": [
      {
        "trigger_offset_minutes": 1,
        "kind": "email"
      }
    ]
  }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
console.log(await res.json());

Python

import os
import requests

res = requests.request(
    "POST",
    "https://api-calendar.axuz.net/teams/TEAM_ID/calendar/events",
    headers={
        "Authorization": f"Bearer {os.environ['AXUZ_TOKEN']}",
    },
    json={
        "calendar_id": "00000000-0000-0000-0000-000000000000",
        "summary": "string",
        "description": "string",
        "location": "string",
        "dtstart": "2026-01-15T12:00:00Z",
        "dtend": "2026-01-15T12:00:00Z",
        "all_day": False,
        "rrule": "string",
        "tz": "string",
        "reminders": [
            {
                "trigger_offset_minutes": 1,
                "kind": "email",
            },
        ],
    },
    timeout=30,
)
res.raise_for_status()
print(res.json())