SlateCore API

API REST somente leitura para o seu slate, equipe, festivais, calendário e finanças. Pensada para que o seu site público (ou o das suas coprodutoras) leia dados em tempo real da SlateCore — sem precisar duplicá-los em um CMS à parte. Também oferecemos webhooks de saída para que o seu site seja invalidado assim que você mudar algo aqui dentro.

URL base

https://slatecore.app/api/v1

Gere a sua chave de API em Configurações → API & Webhooks, dentro do app. Disponível para os planos Studio e Label.

Autenticação

Toda requisição exige o header X-API-Key com a sua chave. As chaves são armazenadas com hash SHA-256 — a versão em texto puro só aparece uma vez, ao criá-la, então guarde-a bem (gerenciador de segredos / variável de ambiente). Se você a perder, revogue e gere uma nova.

bash
curl -H "X-API-Key: sk_live_..." \
  https://slatecore.app/api/v1/ping

Cada chave traz um conjunto de escopos (projects:read, team:read etc.). Um endpoint que exige um escopo que a sua chave não tem retorna 403 insufficient_scope.

Rate limits

Limites por minuto e por dia, configuráveis por chave (padrões: 60/min, 10.000/dia). Quando você os excede, o endpoint retorna 429 rate_limit_exceeded com o header Retry-After. As respostas ficam em cache na edge com s-maxage=30, stale-while-revalidate=60 — aproveite o cache para não gerar uma requisição a cada visitante do seu site.

Erros

Todos os erros seguem o formato { error, message }:

400bad_requestQuery inválida (ex.: limit > 100).
401invalid_api_keyHeader X-API-Key ausente ou chave revogada.
403insufficient_scopeA chave não tem o escopo que este endpoint exige.
404not_foundO recurso não existe ou não está acessível para o seu tenant.
429rate_limit_exceededVocê excedeu o limite por minuto ou por dia.
500internal_errorErro do nosso lado. Tente novamente com backoff exponencial.

Endpoints

Visibilidade: privado por padrão

Esta API só retorna os projetos que você marcou como públicos. Por padrão, um projeto é privado e não aparece aqui nem nos sites que consomem a API. Escolha o que expor em Configurações → API & Webhooks → Visibilidade pública na API: seus projetos ficam agrupados por slate (Slate confirmado, Em consideração etc.), com um switch por projeto e um botão para publicar o grupo inteiro de uma só vez. O controle fica na configuração da API —e não no projeto— de propósito: o que se torna público é decidido por quem administra a API (permissão manageApiKeys), e não por qualquer pessoa com acesso ao projeto. Se você coproduz, cada produtora publica o projeto compartilhado na sua própria API, de forma independente. O filtro se aplica a /projects, /projects/:id, aos prêmios deles e aos /events, /milestones e /finanzas de cada projeto.

Recomendado: publique o seu slate confirmado e deixe privado o que ainda estiver em consideração ou descartado. Revise esta lista antes de compartilhar a sua chave de API ou conectar o seu site.

GET/pingnenhum escopo necessário

Verificação de saúde (health check). Retorna 200 para qualquer chave ativa.

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/ping

Resposta

json
{ "ok": true, "tenant_id": "..." }
GET/brandingnenhum escopo necessário

Retorna a identidade visual pública (nome, logos, cor) do tenant que faz a chamada.

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/branding

Resposta

json
{
  "data": {
    "name": "Mi Productora",
    "logo_url": "https://...",
    "favicon_url": "https://...",
    "apple_touch_icon_url": "https://...",
    "primary_color": "#2563eb"
  }
}
GET/projectsprojects:read

Lista de projetos acessíveis (próprios + em colaboração) que você publicou na API pública. Paginada. Só aparecem os projetos publicados — gerencie quais em Configurações → API & Webhooks → Visibilidade pública.

Parâmetros de query

pageintNúmero da página; o padrão é 1.
limitintTamanho da página, de 1 a 100; o padrão é 20.

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  "https://slatecore.app/api/v1/projects?page=1&limit=20"

Resposta

json
{
  "data": [
    {
      "id": "uuid",
      "nombre": "La Balada del Chupacabras",
      "logline": "...",
      "estatus": "Producción",
      "tipo_de_proyecto": "Largometraje",
      "genero": ["Coming of Age", "Comedia"],
      "poster_url": "https://...",
      "productoras_info": [
        { "nombre": "TM Cine", "logoUrl": "...", "website": "..." }
      ],
      "part_of_slate": "Yes",
      "trailer_url": "https://www.youtube.com/watch?v=…",
      "collaboration_role": null
    }
  ],
  "meta": { "total": 14, "page": 1, "limit": 20 }
}
GET/projects/:idprojects:detail

Detalhe completo do projeto, incluindo líder, autores, equipe e comparáveis. Retorna 404 a menos que o projeto esteja publicado (visibilidade pública ativada).

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/projects/<uuid>

Resposta

json
{
  "data": {
    "id": "uuid",
    "nombre": "...",
    "logline": "...",
    "sinopsis": "...",
    "autores": [{ "nombre": "...", "apellido": "..." }],
    "crew": [{ "rol": "Dirección", "nombre": "..." }],
    "comparables": [{ "titulo": "...", "año": 2023 }],
    "part_of_slate": "Yes",
    "trailer_url": "https://vimeo.com/123456789/abcdef"
  }
}
GET/projects/:id/awardsawards:read

Seleções em festivais e prêmios desse projeto.

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/projects/<uuid>/awards

Resposta

json
{
  "data": [
    {
      "festival": "Sundance",
      "año": 2025,
      "estatus": "Selección oficial",
      "premio": null
    }
  ]
}
GET/teamteam:read

Lista pública da equipe do tenant que faz a chamada.

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/team

Resposta

json
{
  "data": [
    {
      "id": "uuid",
      "nombre": "Sebastián Sariñana",
      "rol": "Dirección",
      "foto_url": "https://...",
      "imdb_url": "https://www.imdb.com/name/..."
    }
  ]
}
GET/eventsevents:read

Eventos do calendário visíveis para quem faz a chamada (projetos próprios + em colaboração).

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/events

Resposta

json
{
  "data": [
    {
      "id": "uuid",
      "titulo": "Pitch a Netflix",
      "fecha": "2026-06-12T15:00:00Z",
      "proyecto_id": "uuid"
    }
  ]
}
GET/milestonesmilestones:read

Marcos visíveis para quem faz a chamada (projetos próprios + em colaboração).

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/milestones

Resposta

json
{
  "data": [
    {
      "id": "uuid",
      "titulo": "Primer corte",
      "fecha_objetivo": "2026-09-01",
      "completado": false,
      "proyecto_id": "uuid"
    }
  ]
}
GET/finanzasfinanzas:read

Resumos de resultado (P&L) por projeto, agrupados por moeda. Apenas agregados — nunca dados linha a linha. Escopo sensível: ativação opcional por chave.

Requisição

bash
curl -H "X-API-Key: $SLATE_API_KEY" \
  https://slatecore.app/api/v1/finanzas

Resposta

json
{
  "data": [
    {
      "proyecto_id": "uuid",
      "totals": {
        "MXN": { "ingresos": 12000000, "gastos": 8500000 },
        "USD": { "ingresos": 50000, "gastos": 12000 }
      }
    }
  ]
}

Webhooks

Receba um POST na sua URL sempre que um dado mudar na SlateCore — útil para revalidar o seu Next.js, invalidar o cache do Webflow ou disparar deploys. Registre o webhook em Configurações → API & Webhooks, no app: você escolhe os eventos que lhe interessam e nós geramos um secret HMAC para que você verifique a origem. Tentamos novamente até 3 vezes, com backoff (1 min, 5 min, 15 min), se o seu endpoint responder com 5xx ou não responder a tempo.

Eventos

project.created · project.updated · project.deleted

INSERT/UPDATE/DELETE em projects, além de qualquer mudança em uma linha de project_collaborators (entrada, saída ou mudança de slate). Distribui o evento (fan-out) a todos os tenants colaboradores ativos.

award.created · award.updated · award.deleted

INSERT/UPDATE/DELETE em festivales. Distribui o evento aos colaboradores.

team.created · team.updated · team.deleted

INSERT/UPDATE/DELETE em crew_cast. Distribui o evento aos colaboradores.

milestone.created · milestone.updated · milestone.deleted

INSERT/UPDATE/DELETE em milestones. Distribui o evento aos colaboradores.

event.created · event.updated · event.deleted

INSERT/UPDATE/DELETE em eventos. Distribui o evento quando ele pertence a um projeto; os eventos que são só do tenant ficam apenas com o proprietário.

Payload

Todo evento chega no mesmo formato. tenant_id sempre aponta para o tenant receptor — em coproduções, chega um evento para cada tenant que colabora. owner_tenant_id identifica o dono do recurso quando o evento chega por fan-out.

json
{
  "event": "project.updated",
  "id": "uuid-do-recurso",
  "tenant_id": "uuid-do-receptor",
  "proyecto_id": "uuid-ou-null",
  "owner_tenant_id": "uuid-ou-null",
  "reason": "collaboration_changed",
  "timestamp": "2026-05-05T16:30:00Z"
}

Headers que enviamos: X-Slate-Event, X-Slate-Signature, X-Slate-Delivery (id único — útil para deduplicar do seu lado).

Verifique a assinatura HMAC

Cada entrega traz X-Slate-Signature: sha256=<hmac>. Calcule o HMAC-SHA256 do corpo bruto (não serialize o JSON de novo; use os bytes recebidos) com o seu secret e compare antes de confiar.

javascript
const crypto = require('crypto')

app.post('/slate-webhook', (req, res) => {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', process.env.SLATE_WEBHOOK_SECRET)
    .update(req.rawBody)         // bytes brutos, não JSON.stringify
    .digest('hex')

  if (req.header('x-slate-signature') !== expected) {
    return res.status(401).end()
  }

  // Responda 2xx rápido — processe de forma assíncrona se for lento.
  res.status(200).end()
})

Cross-tenant fan-out

Quando você edita um projeto compartilhado, os webhooks de cada tenant colaborador também são disparados, com o seu próprio tenant_id e com o owner_tenant_id apontando para o dono. Cada consumidor consulta de novo com a sua chave de API e obtém a sua própria visão (incluindo o seu part_of_slate, que é por tenant).

Quando um colaborador altera algo que afeta somente a ele (o seu próprio part_of_slate em um projeto compartilhado), o evento project.updated é disparado com reason: "collaboration_changed" apenas para esse tenant — o dono não recebe o evento, o que evita spam.

Acesso por plano

A API e os webhooks estão disponíveis nos planos Studio e Label. Os planos Indie e School não incluem acesso à API. Compare os planos em slatecore.app. Para suporte: hola@slatecore.app.