{
  "openapi": "3.1.0",
  "info": {
    "title": "DJ Ban EMC · dados públicos",
    "version": "1.0.0",
    "description": "Dados públicos da DJ Ban EMC, escola de DJ e produção musical em São Paulo desde 2001. Somente leitura, sem autenticação, servidos como arquivos estáticos. Feito para assistentes e agentes de IA responderem sobre cursos, endereço, horário e conteúdo publicado. O preço de curso não está aqui de propósito: ele depende de carga e formato e é passado no atendimento por WhatsApp.",
    "contact": {
      "name": "DJ Ban EMC",
      "url": "https://djban.com.br/contato",
      "email": "contato@djban.com.br"
    },
    "license": {
      "name": "Uso livre para leitura e citação com atribuição",
      "url": "https://djban.com.br/developers"
    }
  },
  "servers": [
    {
      "url": "https://djban.com.br",
      "description": "Produção"
    }
  ],
  "security": [],
  "paths": {
    "/api/cursos.json": {
      "get": {
        "operationId": "listarCursos",
        "summary": "Lista os cursos e serviços da DJ Ban EMC",
        "description": "Devolve todos os cursos de DJ e de produção musical com carga horária, nível, formatos (individual, dupla, coletivo) e modos (presencial, online ao vivo), mais os serviços da casa. O campo preco de cada curso aponta para o WhatsApp: não estime valor.",
        "tags": [
          "catálogo"
        ],
        "responses": {
          "200": {
            "description": "Catálogo de cursos e serviços",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Cursos"
                }
              }
            }
          },
          "404": {
            "description": "Recurso não encontrado",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            }
          }
        }
      }
    },
    "/api/unidade.json": {
      "get": {
        "operationId": "obterUnidade",
        "summary": "Dados da escola: endereço, horário, contato e números",
        "description": "Devolve o endereço completo com CEP, o horário de funcionamento por dia, os canais de contato (WhatsApp, telefone, e-mail) e os números públicos da escola, como o total de alunos formados.",
        "tags": [
          "escola"
        ],
        "responses": {
          "200": {
            "description": "Dados da unidade",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Unidade"
                }
              }
            }
          },
          "404": {
            "description": "Recurso não encontrado",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            }
          }
        }
      }
    },
    "/api/blog.json": {
      "get": {
        "operationId": "listarPosts",
        "summary": "Lista os posts publicados no blog",
        "description": "Devolve todos os posts do blog da DJ Ban EMC com slug, título, resumo, data de publicação e URL. Serve para responder sobre equipamento, técnica de DJ, produção musical e a cena.",
        "tags": [
          "conteúdo"
        ],
        "responses": {
          "200": {
            "description": "Lista de posts",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Blog"
                }
              }
            }
          },
          "404": {
            "description": "Recurso não encontrado",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Curso": {
        "type": "object",
        "description": "Um curso da DJ Ban EMC.",
        "required": [
          "id",
          "nome",
          "area",
          "nivel",
          "formatos",
          "modos",
          "descricao",
          "pagina"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Identificador estável do curso.",
            "examples": [
              "dj-levels"
            ]
          },
          "nome": {
            "type": "string",
            "description": "Nome comercial do curso."
          },
          "area": {
            "type": "string",
            "enum": [
              "dj",
              "producao-musical"
            ],
            "description": "Área do curso."
          },
          "carga_horaria_horas": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Carga horária em horas. Nulo quando é clínica de duração variável."
          },
          "nivel": {
            "type": "string",
            "description": "Nível esperado do aluno."
          },
          "formatos": {
            "type": "array",
            "description": "Formatos de turma disponíveis.",
            "items": {
              "type": "string",
              "enum": [
                "individual",
                "dupla",
                "coletivo"
              ]
            }
          },
          "modos": {
            "type": "array",
            "description": "Modos de aula disponíveis.",
            "items": {
              "type": "string",
              "enum": [
                "presencial",
                "online-ao-vivo"
              ]
            }
          },
          "descricao": {
            "type": "string",
            "description": "O que o aluno aprende."
          },
          "pagina": {
            "type": "string",
            "format": "uri",
            "description": "Página do curso."
          },
          "preco": {
            "type": "string",
            "description": "Sempre 'sob consulta' com o link do WhatsApp."
          }
        }
      },
      "Servico": {
        "type": "object",
        "description": "Um serviço da casa, fora dos cursos.",
        "required": [
          "id",
          "nome",
          "descricao",
          "pagina"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Identificador estável do serviço."
          },
          "nome": {
            "type": "string",
            "description": "Nome do serviço."
          },
          "descricao": {
            "type": "string",
            "description": "O que o serviço entrega."
          },
          "pagina": {
            "type": "string",
            "format": "uri",
            "description": "Página do serviço."
          }
        }
      },
      "Cursos": {
        "type": "object",
        "description": "Catálogo completo de cursos e serviços.",
        "required": [
          "escola",
          "cursos",
          "servicos"
        ],
        "properties": {
          "escola": {
            "type": "string",
            "description": "Nome da escola."
          },
          "site": {
            "type": "string",
            "format": "uri",
            "description": "Site oficial."
          },
          "atualizado_em": {
            "type": "string",
            "format": "date",
            "description": "Data de geração do arquivo."
          },
          "preco": {
            "type": "object",
            "description": "Política de preço: onde perguntar, já que o valor não está no arquivo.",
            "properties": {
              "politica": {
                "type": "string",
                "description": "Por que o preço não está aqui."
              },
              "onde_perguntar": {
                "type": "string",
                "format": "uri",
                "description": "Link do WhatsApp."
              },
              "telefone": {
                "type": "string",
                "description": "Telefone de atendimento."
              }
            }
          },
          "total_cursos": {
            "type": "integer",
            "description": "Quantidade de cursos."
          },
          "cursos": {
            "type": "array",
            "description": "Os cursos.",
            "items": {
              "$ref": "#/components/schemas/Curso"
            }
          },
          "total_servicos": {
            "type": "integer",
            "description": "Quantidade de serviços."
          },
          "servicos": {
            "type": "array",
            "description": "Os serviços.",
            "items": {
              "$ref": "#/components/schemas/Servico"
            }
          }
        }
      },
      "Unidade": {
        "type": "object",
        "description": "Dados da escola em São Paulo.",
        "required": [
          "nome",
          "endereco",
          "contato",
          "horario"
        ],
        "properties": {
          "nome": {
            "type": "string",
            "description": "Nome da escola."
          },
          "descricao": {
            "type": "string",
            "description": "O que a escola faz."
          },
          "fundacao": {
            "type": "string",
            "format": "date",
            "description": "Data de fundação."
          },
          "site": {
            "type": "string",
            "format": "uri",
            "description": "Site oficial."
          },
          "atualizado_em": {
            "type": "string",
            "format": "date",
            "description": "Data de geração do arquivo."
          },
          "endereco": {
            "type": "object",
            "description": "Endereço físico da escola.",
            "properties": {
              "logradouro": {
                "type": "string",
                "description": "Rua e número."
              },
              "bairro": {
                "type": "string",
                "description": "Bairro."
              },
              "cidade": {
                "type": "string",
                "description": "Cidade."
              },
              "uf": {
                "type": "string",
                "description": "Unidade federativa."
              },
              "cep": {
                "type": "string",
                "description": "CEP."
              },
              "pais": {
                "type": "string",
                "description": "País, em ISO 3166-1 alfa-2."
              },
              "referencia": {
                "type": "string",
                "description": "Como chegar."
              }
            }
          },
          "contato": {
            "type": "object",
            "description": "Canais de atendimento.",
            "properties": {
              "whatsapp": {
                "type": "string",
                "format": "uri",
                "description": "Link direto do WhatsApp."
              },
              "telefone": {
                "type": "string",
                "description": "Telefone principal."
              },
              "telefone_fixo": {
                "type": "string",
                "description": "Telefone fixo."
              },
              "email": {
                "type": "string",
                "format": "email",
                "description": "E-mail de contato."
              }
            }
          },
          "horario": {
            "type": "array",
            "description": "Horário de funcionamento por faixa de dias.",
            "items": {
              "type": "object",
              "properties": {
                "dias": {
                  "type": "string",
                  "description": "Faixa de dias."
                },
                "abre": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Hora de abertura, ou nulo se fechado."
                },
                "fecha": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Hora de fechamento, ou nulo se fechado."
                }
              }
            }
          },
          "numeros": {
            "type": "object",
            "description": "Números públicos da escola.",
            "properties": {
              "alunos_formados": {
                "type": "integer",
                "description": "Total de alunos formados desde 2001."
              },
              "nota_google": {
                "type": "number",
                "description": "Nota média no Google."
              },
              "nota_facebook": {
                "type": "number",
                "description": "Nota média no Facebook."
              }
            }
          },
          "links": {
            "type": "object",
            "description": "Atalhos para as páginas principais."
          }
        }
      },
      "Post": {
        "type": "object",
        "description": "Um post do blog.",
        "required": [
          "slug",
          "titulo",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identificador do post na URL."
          },
          "titulo": {
            "type": "string",
            "description": "Título do post."
          },
          "resumo": {
            "type": "string",
            "description": "Resumo de uma ou duas frases."
          },
          "data": {
            "type": "string",
            "description": "Data de publicação, escrita por extenso em português."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Endereço do post."
          }
        }
      },
      "Blog": {
        "type": "object",
        "description": "Índice dos posts publicados.",
        "required": [
          "total",
          "posts"
        ],
        "properties": {
          "site": {
            "type": "string",
            "format": "uri",
            "description": "Site oficial."
          },
          "atualizado_em": {
            "type": "string",
            "format": "date",
            "description": "Data de geração do arquivo."
          },
          "total": {
            "type": "integer",
            "description": "Quantidade de posts."
          },
          "posts": {
            "type": "array",
            "description": "Os posts.",
            "items": {
              "$ref": "#/components/schemas/Post"
            }
          }
        }
      },
      "Erro": {
        "type": "object",
        "description": "Erro devolvido em JSON, com código, mensagem e o que fazer.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "description": "Código estável do erro.",
                "examples": [
                  "not_found"
                ]
              },
              "message": {
                "type": "string",
                "description": "O que aconteceu, em português."
              },
              "resolution": {
                "type": "string",
                "description": "O que fazer para resolver."
              },
              "docs": {
                "type": "string",
                "format": "uri",
                "description": "Página da documentação."
              }
            }
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "catálogo",
      "description": "Cursos e serviços oferecidos."
    },
    {
      "name": "escola",
      "description": "Endereço, horário e contato."
    },
    {
      "name": "conteúdo",
      "description": "O que a escola publica."
    }
  ]
}
