Carregando dados do Brazil Intelligence…
Não foi possível carregar os dados neste momento. Por favor, retorne em breve.
Briefing Intelligence

O Brasil que amamos, lido através dos números.

Uma leitura essencial do Brasil — fluxos turísticos, contexto econômico, segurança e sazonalidade — com o mundo como um discreto ponto de referência, nunca o assunto principal.

01 · Turismo

A curva de chegadas

Chegadas internacionais indexadas (primeiro ano rastreado = 100), a partir do histórico oficial do Brasil.

Chegadas internacionais — crescimento indexado
Onde o Brasil se posiciona
Percentil entre os países rastreados

02 · Economia

Contexto macroeconômico

Cada indicador mostra o valor do Brasil; a marca assinala a média mundial como ponto de referência.

Crescimento e inflação
Percentual, ano mais recente reportado
Lendo os números
O que esses números significam

03 · Segurança

O Brasil entre seus pares mais próximos

Um índice de segurança de 0 a 100 derivado dos níveis oficiais de alertas de viagem. O Brasil é destacado em relação aos países mais próximos na classificação geral.

Índice de segurança — Brasil vs. países com classificação próxima
Brasil Média entre pares / mundial

04 · Clima e sazonalidade

Quando viajar, região por região

Índice mensal de conforto (0–100) para as cinco macrorregiões — útil para o planejamento sazonal de roteiros.

Índice de conforto mensal por região
Temperatura + precipitação combinadas · mais escuro = mais confortável
Menor conforto Maior conforto

Posicionamento

Brasil no ranking global

Países próximos da posição do Brasil na pontuação combinada (turismo + economia + segurança, com pesos iguais).

#PaísTurismoEconomiaSegurançaCombinado
Acesso privado

Além do benchmark público

Esta página apresenta a leitura essencial. O dossiê completo — séries históricas, detalhamento sub-regional e alertas de atualização — é reservado aos parceiros.

Perfil do destino

Um dossiê comparativo completo sobre o Brasil, atualizado trimestralmente.

Benchmark personalizado

Comparação direta com os destinos com os quais você efetivamente compete.

Monitoramento de sinais

Um alerta discreto sempre que um indicador apresentar mudança significativa.

Solicitar acesso completo
${arrivals ? fmtCompact(arrivals.value) : "—"}
${yoyBadge}
${worldAvgArrivals ? "Média mundial (entre " + worldAvgArrivals.n_countries + " países monitorados): " + fmtCompact(worldAvgArrivals.value) : ""}
${srcLine(arrivals, "Chegadas")}
Receitas de turismo${receipts?.year ? " · " + receipts.year : ""}
${receipts ? "$" + fmtCompact(receipts.value) : "—"}
Receitas de turismo internacional, US$ correntes
${srcLine(receipts, "Receitas")}
Posição global
${rank?.brazil_rank ? rank.brazil_rank + "de " + rank.total_countries + "" : "—"}
${topPct !== null ? `Top ${topPct}% mundial` : ""}
Pontuação composta considerando turismo, economia e segurança
Fonte: YourBrasil composite — metodologia proprietária, veja a seção de rankings abaixo
`; document.getElementById("ybi-meta-row").innerHTML = `
${rank?.total_countries ?? "—"} países no benchmark
5 macro-regiões cobertas
Fontes: World Bank · US Dept of State · NASA POWER
Atualização de dados: ${d.generated_at ? new Date(d.generated_at).toLocaleDateString('pt-BR', {year:'numeric', month:'short', day:'numeric'}) : "—"}
`; document.getElementById("ybi-footer-note").textContent = `YourBrasil Intelligence — Brazil data desk · gerado em ${d.generated_at ? new Date(d.generated_at).toISOString() : "—"}`; } function renderTourism(d) { const host = document.getElementById("chart-tourism-line".replace("chart", "ybi-chart")); const series = d.brazil.international_arrivals?.series || []; document.getElementById("ybi-tourism-src").innerHTML = srcLine(d.brazil.international_arrivals, "Série de chegadas"); if (series.length < 2) { host.innerHTML = `Ainda não há pontos de dados históricos suficientes para traçar uma tendência (necessários pelo menos 2 anos).
`; document.getElementById("ybi-tourism-sub").textContent = "Aguardando mais histórico"; } else { const base = series[0].value || 1; const indexed = series.map(s => ({ year: s.year, index: Math.round((s.value / base) * 100) })); document.getElementById("ybi-tourism-sub").textContent = `${series[0].year} = 100 · Somente Brasil (veja a nota sobre comparabilidade mundial abaixo)`; const W = host.clientWidth || 480, H = 220, PAD = { t: 14, r: 40, b: 26, l: 34 }; const values = indexed.map(p => p.index); const yMin = Math.min(...values) - 10, yMax = Math.max(...values) + 10; const svg = elx("svg", { width: "100%", height: H, viewBox: `0 0 ${W} ${H}` }, host); const x = i => PAD.l + (i / (indexed.length - 1)) * (W - PAD.l - PAD.r); const y = v => H - PAD.b - ((v - yMin) / (yMax - yMin)) * (H - PAD.t - PAD.b); elx("line", { class: "ybi-axis-line", x1: PAD.l, x2: W - PAD.r, y1: H - PAD.b, y2: H - PAD.b }, svg); indexed.forEach((p, i) => elx("text", { x: x(i), y: H - 6, "text-anchor": "middle", class: "ybi-muted", "font-size": 11 }, svg).textContent = p.year); const pts = indexed.map((p, i) => `${x(i)},${y(p.index)}`).join(" "); elx("polyline", { points: pts, fill: "none", stroke: "#C6A75E", "stroke-width": 2.5, "stroke-linejoin": "round", "stroke-linecap": "round" }, svg); indexed.forEach((p, i) => elx("circle", { cx: x(i), cy: y(p.index), r: 4, fill: "#C6A75E", stroke: "#131F29", "stroke-width": 2 }, svg)); const lastI = indexed.length - 1; elx("text", { x: x(lastI) + 8, y: y(indexed[lastI].index) + 4, "font-size": 12, "font-weight": 600, fill: "#C6A75E" }, svg).textContent = indexed[lastI].index; const tt = tooltip(host); svg.addEventListener("mousemove", (e) => { const rect = svg.getBoundingClientRect(); const mx = e.clientX - rect.left; let i = Math.round(((mx - PAD.l) / (W - PAD.l - PAD.r)) * (indexed.length - 1)); i = Math.max(0, Math.min(indexed.length - 1, i)); tt.show(x(i) * (rect.width / W), 26, `${indexed[i].year}
Índice: ${indexed[i].index}`); }); svg.addEventListener("mouseleave", () => tt.hide()); } const tourismRank = d.ranking?.nearby?.find(r => r.iso3 === "BRA"); document.getElementById("ybi-tourism-pct").textContent = tourismRank?.tourism !== undefined && tourismRank?.tourism !== null ? tourismRank.tourism + "º" : "—"; document.getElementById("ybi-tourism-pct-context").textContent = "Posição percentil em chegadas internacionais entre todos os países rastreados — maior é mais chegadas."; document.getElementById("ybi-tourism-pct-src").innerHTML = "Fonte: YourBrasil composite (posição percentil), derivado de dados de chegadas do World Bank"; } function renderEconomy(d) { const host = document.getElementById("ybi-meters"); const gdp = d.brazil.gdp_growth_pct, infl = d.brazil.inflation_pct; const gdpWorld = d.world_context?.gdp_growth_avg, inflWorld = d.world_context?.inflation_avg; function meterRow(label, metric, world, max) { if (!metric) return `
${label}: não disponível nas fontes atualmente conectadas
`; const pct = Math.max(0, Math.min(100, (metric.value / max) * 100)); const worldPct = world ? Math.max(0, Math.min(100, (world.value / max) * 100)) : null; return `
${label}${metric.year ? " · " + metric.year : ""}${metric.value.toFixed(1)}%
${worldPct !== null ? `
` : ""}
${worldPct !== null ? `
média mundial ${world.value}%
` : ""}
Fonte: ${metric.source}
`; } host.innerHTML = meterRow("Crescimento do PIB", gdp, gdpWorld, 8) + meterRow("Inflação", infl, inflWorld, 15); const readHost = document.getElementById("ybi-economy-read"); let html = ""; if (gdp && gdpWorld) { const delta = Math.round((gdp.value - gdpWorld.value) * 10) / 10; html += `
${gdp.value.toFixed(1)}%
Crescimento do PIB em ${gdp.year} — ${Math.abs(delta)} pontos ${delta >= 0 ? "acima" : "abaixo"} da média mundial (${gdpWorld.value}%).
Fonte: ${gdp.source}

`; } if (infl && inflWorld) { const delta = Math.round((infl.value - inflWorld.value) * 10) / 10; html += `
${infl.value.toFixed(1)}%
Inflação em ${infl.year} — ${Math.abs(delta)} pontos ${delta >= 0 ? "acima" : "abaixo"} da média mundial (${inflWorld.value}%).
Fonte: ${infl.source}
`; } readHost.innerHTML = html || `
Dados econômicos indisponíveis nas fontes atualmente conectadas.
`; } function renderSafety(d) { const host = document.getElementById("ybi-chart-safety-bar"); const nearby = (d.ranking?.nearby || []).filter(r => r.safety !== null && r.safety !== undefined); const worldAvg = d.world_context?.safety_score_avg; document.getElementById("ybi-safety-src").innerHTML = "Fonte: Avisos de Viagem do Departamento de Estado dos EUA, convertidos internamente para uma escala de 0-100"; document.getElementById("ybi-safety-sub").textContent = "0-100, maior = mais seguro · países mais próximos do Brasil no ranking geral"; if (!nearby.length) { host.innerHTML = `
Dados de segurança indisponíveis nas fontes atualmente conectadas.
`; return; } const data = nearby.map(r => ({ label: r.country_name, value: r.safety, emphasis: r.iso3 === "BRA" })); if (worldAvg) data.push({ label: "Média mundial", value: Math.round(worldAvg.value), emphasis: false }); data.sort((a, b) => b.value - a.value); const W = host.clientWidth || 480, rowH = 34, PAD = { t: 6, r: 46, b: 6, l: 130 }; const H = PAD.t + PAD.b + rowH * data.length; const svg = elx("svg", { width: "100%", height: H, viewBox: `0 0 ${W} ${H}` }, host); const xMax = 100; const x = v => PAD.l + (v / xMax) * (W - PAD.l - PAD.r); data.forEach((dd, i) => { const cy = PAD.t + rowH * i + rowH / 2, barH = 16; elx("text", { x: PAD.l - 10, y: cy + 4, "text-anchor": "end", "font-size": 12.5, "font-weight": dd.emphasis ? 600 : 400, fill: dd.emphasis ? "var(--ybi-text-primary)" : "var(--ybi-text-secondary)" }, svg).textContent = dd.label; elx("rect", { x: PAD.l, y: cy - barH/2, width: Math.max(0, x(dd.value) - PAD.l), height: barH, rx: 3, fill: dd.emphasis ? "#C6A75E" : "#8C8579" }, svg); elx("text", { x: x(dd.value) + 8, y: cy + 4, "font-size": 12.5, "font-weight": dd.emphasis ? 600 : 400, fill: "var(--ybi-text-secondary)" }, svg).textContent = dd.value; }); } function renderClimate(d) { const host = document.getElementById("ybi-chart-heatmap"); const byRegion = d.climate_by_region || {}; const regionOrder = ["Norte", "Nordeste", "Centro-Oeste", "Sudeste", "Sul"]; const rows = regionOrder.filter(r => byRegion[r]).map(r => byRegion[r]); document.getElementById("ybi-climate-src").innerHTML = rows.length ? `Fonte: ${rows[0].source}` : `Dados climáticos indisponíveis nas fontes atualmente conectadas.`; if (!rows.length) return; const W = host.clientWidth || 480, PAD = { t: 22, r: 8, b: 8, l: 118 }; const rowH = 30, cellGap = 2; const H = PAD.t + PAD.b + rowH * rows.length; const svg = elx("svg", { width: "100%", height: H, viewBox: `0 0 ${W} ${H}` }, host); const colW = (W - PAD.l - PAD.r) / 12; const ramp = ["#4A3C1E","#5E4A22","#7A5F26","#9A7935","#C6A75E","#D9C089","#EAD9AE"]; function colorFor(v) { if (v === null || v === undefined) return "#2c2c2a"; const t = Math.max(0, Math.min(1, v / 100)); return ramp[Math.round(t * (ramp.length - 1))]; } rows[0].months.forEach((m, i) => elx("text", { x: PAD.l + colW*i + colW/2, y: 14, "text-anchor": "middle", class: "ybi-muted", "font-size": 10.5 }, svg).textContent = m.month); const tt = tooltip(host); rows.forEach((row, ri) => { elx("text", { x: PAD.l - 10, y: PAD.t + rowH*ri + rowH/2 + 4, "text-anchor": "end", "font-size": 12, fill: "var(--ybi-text-secondary)" }, svg).textContent = row.region; row.months.forEach((m, ci) => { const rx = PAD.l + colW*ci + cellGap/2, ry = PAD.t + rowH*ri + cellGap/2; const rect = elx("rect", { x: rx, y: ry, width: colW - cellGap, height: rowH - cellGap, rx: 3, fill: colorFor(m.comfort_index) }); rect.addEventListener("mousemove", (e) => { const hr = host.getBoundingClientRect(); tt.show(e.clientX - hr.left, e.clientY - hr.top - 10, `${row.region} · ${m.month}
${m.temperature_c !== null ? m.temperature_c.toFixed(1)+"°C" : "—"} · ${m.precipitation_mm !== null ? m.precipitation_mm.toFixed(0)+"mm" : "—"}
Conforto: ${m.comfort_index ?? "—"}`); }); rect.addEventListener("mouseleave", () => tt.hide()); svg.appendChild(rect); }); }); } function renderRanking(d) { const rank = d.ranking || {}; document.getElementById("ybi-ranking-hero").innerHTML = rank.brazil_rank ? `${rank.brazil_rank}${ordinalSuffix(rank.brazil_rank)}de ${rank.total_countries} países monitorados` : `Classificação ainda não disponível`; document.getElementById("ybi-ranking-src").innerHTML = "Fonte: Índice composto YourBrasil — combinação percentílica de peso igual entre turismo, economia e segurança (metodologia interna, não um índice publicado externamente)"; const tbody = document.getElementById("ybi-ranking-rows"); tbody.innerHTML = ""; (rank.nearby || []).forEach(r => { const tr = document.createElement("tr"); if (r.iso3 === "BRA") tr.className = "ybi-highlight"; tr.innerHTML = `${r.rank}${r.country_name}${r.iso3 === "BRA" ? '' : ''}${r.tourism ?? "—"}${r.economy ?? "—"}${r.safety ?? "—"}${r.composite ?? "—"}`; tbody.appendChild(tr); }); } function ordinalSuffix(n) { const j = n % 10, k = n % 100; if (j === 1 && k !== 11) return "º"; if (j === 2 && k !== 12) return "º"; if (j === 3 && k !== 13) return "º"; return "º"; } fetch(DATA_URL, { cache: "no-store" }) .then(r => { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); }) .then(d => { if (Array.isArray(d)) d = d[0] || {}; if (!d.brazil) throw new Error("Dados sem 'brazil' — verifique a saída do fluxo n8n."); document.getElementById("ybi-loading").classList.add("ybi-hidden"); document.getElementById("ybi-content").classList.remove("ybi-hidden"); renderKPIs(d); renderTourism(d); renderEconomy(d); renderSafety(d); renderClimate(d); renderRanking(d); }) .catch(err => { document.getElementById("ybi-loading").classList.add("ybi-hidden"); const errEl = document.getElementById("ybi-error"); errEl.textContent = "Não foi possível carregar os dados no momento (" + err.message + "). Por favor, retorne em breve."; errEl.classList.remove("ybi-hidden"); }); })();
Pronto para começar?

Vamos levar o Brasil aos seus clientes

Solicite uma proposta