Analisar uma Página com IA
Envie um URL para o endpoint de análise de IA da CaptureKit e receba insights estruturados sobre o conteúdo, design, stack tecnológico e metadados SEO da página.
Visão geral
O endpoint de análise de IA da CaptureKit combina captura de screenshot com análise baseada em LLM. Passe qualquer URL e um prompt personalizado — a API devolve uma resposta JSON estruturada baseada no que a página realmente parece. Use-o para auditorias de concorrentes, avaliações de UX ou QA automático de conteúdo.
Pré-requisitos
- Uma chave de API CaptureKit — obtenha uma em app.capturekit.dev
- Instale as dependências para o seu idioma:
pip install requestsSem dependências adicionais — utiliza a API fetch nativa (Node 18+).
Extensão curl ativada (ativa por padrão).
Sem dependências adicionais — utiliza net/http (Go 1.18+).
Sem dependências adicionais — utiliza java.net.http (Java 11+).
Sem dependências adicionais — utiliza System.Net.Http (.NET 6+).
# Cargo.toml
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde_json = "1"Passos
Submeter um pedido de análise
Chame GET /v1/analyze com os parâmetros url e prompt. O prompt define a resposta da IA.
import requests
API_KEY = "YOUR_API_KEY"
PROMPT = "Resume a proposta de valor principal desta página em 2 frases. Em seguida, liste os 3 principais CTAs visíveis acima do fold."
response = requests.get(
"https://api.capturekit.dev/v1/analyze",
headers={"x-api-key": API_KEY},
params={"url": "https://stripe.com", "prompt": PROMPT},
)
data = response.json()
print(data)const API_KEY = "YOUR_API_KEY";
const PROMPT = "Resume a proposta de valor principal desta página em 2 frases. Em seguida, liste os 3 principais CTAs visíveis acima do fold.";
const params = new URLSearchParams({ url: "https://stripe.com", prompt: PROMPT });
const response = await fetch(`https://api.capturekit.dev/v1/analyze?${params}`, {
headers: { "x-api-key": API_KEY },
});
const data = await response.json();
console.log(data);<?php
$apiKey = "YOUR_API_KEY";
$prompt = "Resume a proposta de valor principal desta página em 2 frases. Em seguida, liste os 3 principais CTAs visíveis acima do fold.";
$params = http_build_query(["url" => "https://stripe.com", "prompt" => $prompt]);
$ch = curl_init("https://api.capturekit.dev/v1/analyze?{$params}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-api-key: {$apiKey}"]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
params := url.Values{
"url": {"https://stripe.com"},
"prompt": {"Resume a proposta de valor em 2 frases. Liste os 3 principais CTAs acima do fold."},
}
req, _ := http.NewRequest("GET", "https://api.capturekit.dev/v1/analyze?"+params.Encode(), nil)
req.Header.Set("x-api-key", "YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var data map[string]any
json.Unmarshal(body, &data)
fmt.Println(data)
}import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
var client = HttpClient.newHttpClient();
var prompt = URLEncoder.encode("Resume a proposta de valor em 2 frases. Liste os 3 principais CTAs acima do fold.", StandardCharsets.UTF_8);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.capturekit.dev/v1/analyze?url=https%3A%2F%2Fstripe.com&prompt=" + prompt))
.header("x-api-key", "YOUR_API_KEY").GET().build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");
var prompt = Uri.EscapeDataString("Resume a proposta de valor em 2 frases. Liste os 3 principais CTAs acima do fold.");
var body = await client.GetStringAsync(
$"https://api.capturekit.dev/v1/analyze?url=https%3A%2F%2Fstripe.com&prompt={prompt}");
Console.WriteLine(body);#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let data = reqwest::Client::new()
.get("https://api.capturekit.dev/v1/analyze")
.header("x-api-key", "YOUR_API_KEY")
.query(&[
("url", "https://stripe.com"),
("prompt", "Resume a proposta de valor em 2 frases. Liste os 3 principais CTAs acima do fold."),
])
.send().await?.json::<serde_json::Value>().await?;
println!("{:#?}", data);
Ok(())
}Ler a análise de IA
A resposta inclui analysis (a resposta da IA ao seu prompt), screenshot_url e metadados como title e description.
print(f"Página : {data.get('title')}")
print(f"Pré-visual. : {data.get('screenshot_url')}")
print()
print("=== Análise de IA ===")
print(data.get("analysis", ""))console.log(`Página : ${data.title}`);
console.log(`Pré-visual. : ${data.screenshot_url}\n`);
console.log("=== Análise de IA ===");
console.log(data.analysis);echo "Página : {$data['title']}\n";
echo "Pré-visual. : {$data['screenshot_url']}\n\n";
echo "=== Análise de IA ===\n";
echo $data["analysis"] ?? "";fmt.Printf("Página : %v\nPré-visual. : %v\n\n=== Análise de IA ===\n%v\n",
data["title"], data["screenshot_url"], data["analysis"])import org.json.*;
var d = new JSONObject(response.body());
System.out.printf("Página : %s%nPré-visual. : %s%n%n=== Análise de IA ===%n%s%n",
d.getString("title"), d.getString("screenshot_url"), d.getString("analysis"));using System.Text.Json;
var d = JsonDocument.Parse(body).RootElement;
Console.WriteLine($"Página : {d.GetProperty("title")}");
Console.WriteLine($"Pré-visual. : {d.GetProperty("screenshot_url")}\n");
Console.WriteLine("=== Análise de IA ===");
Console.WriteLine(d.GetProperty("analysis"));println!("Página : {}", data["title"].as_str().unwrap_or(""));
println!("Pré-visual. : {}\n", data["screenshot_url"].as_str().unwrap_or(""));
println!("=== Análise de IA ===");
println!("{}", data["analysis"].as_str().unwrap_or(""));Executar uma auditoria de concorrentes em múltiplas páginas
Analise várias landing pages de concorrentes com um prompt consistente e guarde os resultados como um relatório estruturado.
import json, time, requests
API_KEY = "YOUR_API_KEY"
PROMPT = """Analise esta landing page e devolva um objeto JSON com estas chaves:
- value_proposition (string)
- primary_cta (string)
- target_audience (string)
- pricing_visible (boolean)
- social_proof_types (array de strings: "testimonials", "logos", "stats", etc.)"""
CONCORRENTES = [
{"name": "Stripe", "url": "https://stripe.com"},
{"name": "Paddle", "url": "https://paddle.com"},
{"name": "Lemonsqueezy", "url": "https://lemonsqueezy.com"},
]
report = []
for comp in CONCORRENTES:
r = requests.get("https://api.capturekit.dev/v1/analyze",
headers={"x-api-key": API_KEY},
params={"url": comp["url"], "prompt": PROMPT})
data = r.json()
analysis_text = data.get("analysis", "{}")
try:
raw = analysis_text.strip().removeprefix("```json").removesuffix("```").strip()
analysis = json.loads(raw)
except json.JSONDecodeError:
analysis = {"raw": analysis_text}
report.append({"concorrente": comp["name"], "url": comp["url"], **analysis})
print(f"✓ {comp['name']} analisado")
time.sleep(2)
with open("auditoria_concorrentes.json", "w") as f:
json.dump(report, f, indent=2)
print("\nRelatório guardado em auditoria_concorrentes.json")import { writeFileSync } from "fs";
const API_KEY = "YOUR_API_KEY";
const PROMPT = `Analise esta landing page e devolva um objeto JSON com estas chaves:
- value_proposition (string)
- primary_cta (string)
- target_audience (string)
- pricing_visible (boolean)
- social_proof_types (array de strings)`;
const concorrentes = [
{ name: "Stripe", url: "https://stripe.com" },
{ name: "Paddle", url: "https://paddle.com" },
{ name: "Lemonsqueezy", url: "https://lemonsqueezy.com" },
];
const report: any[] = [];
for (const comp of concorrentes) {
const params = new URLSearchParams({ url: comp.url, prompt: PROMPT });
const res = await fetch(`https://api.capturekit.dev/v1/analyze?${params}`, {
headers: { "x-api-key": API_KEY },
});
const data = await res.json();
let analysis: any;
try {
const raw = (data.analysis ?? "{}").replace(/^```json\n?/, "").replace(/```$/, "").trim();
analysis = JSON.parse(raw);
} catch { analysis = { raw: data.analysis }; }
report.push({ concorrente: comp.name, url: comp.url, ...analysis });
console.log(`✓ ${comp.name} analisado`);
await new Promise(r => setTimeout(r, 2000));
}
writeFileSync("auditoria_concorrentes.json", JSON.stringify(report, null, 2));
console.log("\nRelatório guardado em auditoria_concorrentes.json");<?php
$apiKey = "YOUR_API_KEY";
$prompt = "Analise esta landing page e devolva um objeto JSON com chaves: value_proposition, primary_cta, target_audience, pricing_visible, social_proof_types.";
$concorrentes = [
["name" => "Stripe", "url" => "https://stripe.com"],
["name" => "Paddle", "url" => "https://paddle.com"],
["name" => "Lemonsqueezy", "url" => "https://lemonsqueezy.com"],
];
$report = [];
foreach ($concorrentes as $comp) {
$params = http_build_query(["url" => $comp["url"], "prompt" => $prompt]);
$ch = curl_init("https://api.capturekit.dev/v1/analyze?{$params}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-api-key: {$apiKey}"]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
$raw = preg_replace('/^```json\n?|```$/', '', trim($data["analysis"] ?? "{}"));
$analysis = json_decode($raw, true) ?? ["raw" => $data["analysis"]];
$report[] = array_merge(["concorrente" => $comp["name"], "url" => $comp["url"]], $analysis);
echo "✓ {$comp['name']} analisado\n";
sleep(2);
}
file_put_contents("auditoria_concorrentes.json", json_encode($report, JSON_PRETTY_PRINT));
echo "\nRelatório guardado em auditoria_concorrentes.json\n";package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"os"
"strings"
"time"
)
const (
APIKey = "YOUR_API_KEY"
Prompt = "Analise esta landing page e devolva um objeto JSON: value_proposition, primary_cta, target_audience, pricing_visible, social_proof_types."
)
type Concorrente struct{ Name, URL string }
func analyze(comp Concorrente) map[string]any {
params := url.Values{"url": {comp.URL}, "prompt": {Prompt}}
req, _ := http.NewRequest("GET", "https://api.capturekit.dev/v1/analyze?"+params.Encode(), nil)
req.Header.Set("x-api-key", APIKey)
resp, _ := http.DefaultClient.Do(req)
body, _ := io.ReadAll(resp.Body)
resp.Body.Close()
var data map[string]any
json.Unmarshal(body, &data)
raw := strings.TrimSpace(fmt.Sprint(data["analysis"]))
raw = strings.TrimPrefix(raw, "```json")
raw = strings.TrimSuffix(raw, "```")
var analysis map[string]any
if err := json.Unmarshal([]byte(strings.TrimSpace(raw)), &analysis); err != nil {
analysis = map[string]any{"raw": raw}
}
analysis["concorrente"] = comp.Name
analysis["url"] = comp.URL
return analysis
}
func main() {
concorrentes := []Concorrente{
{"Stripe", "https://stripe.com"},
{"Paddle", "https://paddle.com"},
{"Lemonsqueezy", "https://lemonsqueezy.com"},
}
var report []map[string]any
for _, c := range concorrentes {
report = append(report, analyze(c))
fmt.Printf("✓ %s analisado\n", c.Name)
time.Sleep(2 * time.Second)
}
b, _ := json.MarshalIndent(report, "", " ")
os.WriteFile("auditoria_concorrentes.json", b, 0644)
fmt.Println("\nRelatório guardado em auditoria_concorrentes.json")
}import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;
import org.json.*;
public class Main {
static final String API_KEY = "YOUR_API_KEY";
static final String PROMPT = "Analise esta landing page e devolva um objeto JSON: value_proposition, primary_cta, target_audience, pricing_visible, social_proof_types.";
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var concorrentes = List.of(
Map.of("name","Stripe", "url","https://stripe.com"),
Map.of("name","Paddle", "url","https://paddle.com"),
Map.of("name","Lemonsqueezy", "url","https://lemonsqueezy.com"));
var report = new JSONArray();
for (var comp : concorrentes) {
var encodedUrl = URLEncoder.encode(comp.get("url"), StandardCharsets.UTF_8);
var encodedPrompt = URLEncoder.encode(PROMPT, StandardCharsets.UTF_8);
var req = HttpRequest.newBuilder()
.uri(URI.create("https://api.capturekit.dev/v1/analyze?url=" + encodedUrl + "&prompt=" + encodedPrompt))
.header("x-api-key", API_KEY).GET().build();
var resp = client.send(req, HttpResponse.BodyHandlers.ofString());
var data = new JSONObject(resp.body());
var analysisText = data.getString("analysis")
.replaceAll("^```json\\n?","").replaceAll("```$","").strip();
JSONObject analysis;
try { analysis = new JSONObject(analysisText); }
catch (Exception e) { analysis = new JSONObject().put("raw", analysisText); }
analysis.put("concorrente", comp.get("name")).put("url", comp.get("url"));
report.put(analysis);
System.out.println("✓ " + comp.get("name") + " analisado");
Thread.sleep(2000);
}
Files.writeString(Path.of("auditoria_concorrentes.json"), report.toString(2));
System.out.println("\nRelatório guardado em auditoria_concorrentes.json");
}
}using System.Net.Http;
using System.Text.Json;
using System.Text.RegularExpressions;
const string API_KEY = "YOUR_API_KEY";
const string PROMPT = "Analise esta landing page e devolva um objeto JSON: value_proposition, primary_cta, target_audience, pricing_visible, social_proof_types.";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", API_KEY);
var concorrentes = new[] {
(name: "Stripe", url: "https://stripe.com"),
(name: "Paddle", url: "https://paddle.com"),
(name: "Lemonsqueezy", url: "https://lemonsqueezy.com"),
};
var report = new List<object>();
foreach (var comp in concorrentes)
{
var encodedUrl = Uri.EscapeDataString(comp.url);
var encodedPrompt = Uri.EscapeDataString(PROMPT);
var body = await client.GetStringAsync($"https://api.capturekit.dev/v1/analyze?url={encodedUrl}&prompt={encodedPrompt}");
var data = JsonDocument.Parse(body).RootElement;
var analysisText = data.GetProperty("analysis").GetString() ?? "{}";
var clean = Regex.Replace(analysisText.Trim(), @"^```json\n?|```$", "").Trim();
object analysis;
try { analysis = JsonSerializer.Deserialize<Dictionary<string, object>>(clean)!; }
catch { analysis = new { raw = analysisText }; }
report.Add(new { concorrente = comp.name, comp.url, analysis });
Console.WriteLine($"✓ {comp.name} analisado");
await Task.Delay(2000);
}
File.WriteAllText("auditoria_concorrentes.json",
JsonSerializer.Serialize(report, new JsonSerializerOptions { WriteIndented = true }));
Console.WriteLine("\nRelatório guardado em auditoria_concorrentes.json");use reqwest::Client;
use serde_json::{json, Value};
use std::{fs, time::Duration};
use tokio::time::sleep;
const API_KEY: &str = "YOUR_API_KEY";
const PROMPT: &str = "Analise esta landing page e devolva um objeto JSON: value_proposition, primary_cta, target_audience, pricing_visible, social_proof_types.";
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let client = Client::new();
let concorrentes = [("Stripe","https://stripe.com"), ("Paddle","https://paddle.com"), ("Lemonsqueezy","https://lemonsqueezy.com")];
let mut report = Vec::new();
for (name, url) in &concorrentes {
let data = client.get("https://api.capturekit.dev/v1/analyze")
.header("x-api-key", API_KEY)
.query(&[("url", url), ("prompt", &PROMPT)])
.send().await?.json::<Value>().await?;
let analysis_text = data["analysis"].as_str().unwrap_or("{}");
let clean = analysis_text.trim().trim_start_matches("```json").trim_end_matches("```").trim();
let analysis: Value = serde_json::from_str(clean).unwrap_or(json!({ "raw": analysis_text }));
report.push(json!({ "concorrente": name, "url": url, "analysis": analysis }));
println!("✓ {} analisado", name);
sleep(Duration::from_secs(2)).await;
}
fs::write("auditoria_concorrentes.json", serde_json::to_string_pretty(&report).unwrap()).unwrap();
println!("\nRelatório guardado em auditoria_concorrentes.json");
Ok(())
}Instrua a IA para devolver JSON estruturado no seu prompt — o modelo formatará o resultado correspondentemente, facilitando a análise e armazenamento em base de dados ou folha de cálculo sem pós-processamento adicional.