Arachne é uma plataforma de inteligência de dados web — um motor de extração, transformação e análise de conteúdo da internet. Diferente de scrapers tradicionais, o Arachne foi construído para produzir dados limpos, estruturados e ricos em metadados — prontos para consumo por sistemas de IA, análise de mercado, pricing intelligence, monitoramento e RAG.
⚠️ Salve esta chave agora. Ela não será mostrada novamente.
Nenhuma chave de API criada ainda.
Crie sua primeira chave em 1 clique — ela dá acesso à API.
| Endpoint | Requisições | % |
|---|---|---|
| Endpoint | Método | Status | Duração | Data |
|---|---|---|---|---|
Selecione uma chave de API para ver o dashboard de uso.
| Endpoint | requisições | ✅ Sucesso | Erros | Média (ms) |
|---|---|---|---|---|
| Funcionalidade | 🔓 Free | 🚀 Pro | 💎 Enterprise |
|---|---|---|---|
| Requisições/mês | 500 | 10.000 | 100.000 |
| Rate limit | 10/min | 60/min | 300/min |
| Browser extraction | ❌ | ✅ | ✅ |
| Vision/OCR | ❌ | ✅ | ✅ |
| Transcribe (Whisper) | ❌ | ✅ | ✅ |
| MCP Tools (9) | ❌ | ✅ | ✅ |
| Export PBIX/PPTX | ❌ | ❌ | ✅ |
| Suporte | Community | Prioritário | Dedicado 24h |
| Preço | Grátis | R$ 49/mês | R$ 199/mês |
/api/v1/scrapeFaça uma requisição real de scraping para testar a API.
Crie uma chave na aba 🔑 Chaves acima.
Escolha sua linguagem favorita e copie o código:
curl -X POST /api/v1/scrape \
-H "X-API-Key: arn_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
import httpx
API_KEY = "arn_sua_chave_aqui"
BASE = ""
resp = httpx.post(
f"{BASE}/api/v1/scrape",
headers={"X-API-Key": API_KEY},
json={"url": "https://example.com"},
)
data = resp.json()
print(f"Job ID: {data['job_id']}")
print(f"Status: {data['status']}")
const API_KEY = "arn_sua_chave_aqui";
const BASE = "";
const resp = await fetch(`${BASE}/api/v1/scrape`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
const data = await resp.json();
console.log("Job ID:", data.job_id);
console.log("Status:", data.status);
Use o job_id retornado para buscar os dados extraídos:
curl /api/v1/jobs/{job_id} \
-H "X-API-Key: arn_sua_chave_aqui"
resp = httpx.get(
f"{BASE}/api/v1/jobs/{job_id}",
headers={"X-API-Key": API_KEY},
)
result = resp.json()
print(result["extraction"]["text_content"][:200])
const resp = await fetch(
`${BASE}/api/v1/jobs/${jobId}`,
{ headers: { "X-API-Key": API_KEY } }
);
const result = await resp.json();
console.log(result.extraction?.text_content?.slice(0, 200));
Agora que você já fez sua primeira extração, explore:
Já tem uma chave de API? Teste uma extração real no Playground:
O Arachne tem um MCP Server com 9 tools que funciona com Claude Desktop, Cursor, Codex CLI e qualquer cliente MCP.
{
"mcpServers": {
"arachne": {
"command": "python3",
"args": ["-m", "pip", "install", "httpx"],
"env": {
"ARACHNE_API_KEY": "sua_chave_aqui"
}
}
}
}
Crie uma chave na aba 🔑 Chaves acima.
curl -X POST /api/v1/scrape \
-H "X-API-Key: arn_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
import httpx
API_KEY = "arn_sua_chave_aqui"
BASE = ""
resp = httpx.post(
f"{BASE}/api/v1/scrape",
headers={"X-API-Key": API_KEY},
json={"url": "https://example.com"},
)
data = resp.json()
print(f"Job ID: {data['job_id']}")
print(f"Status: {data['status']}")
const API_KEY = "arn_sua_chave_aqui";
const BASE = "";
const resp = await fetch(`${BASE}/api/v1/scrape`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
const data = await resp.json();
console.log("Job ID:", data.job_id);
console.log("Status:", data.status);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
apiKey := "arn_sua_chave_aqui"
body, _ := json.Marshal(map[string]string{
"url": "https://example.com",
})
req, _ := http.NewRequest("POST",
"/api/v1/scrape",
bytes.NewBuffer(body),
)
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
var data map[string]any
json.NewDecoder(resp.Body).Decode(&data)
fmt.Println(data)
}
curl /api/v1/jobs/ \
-H "X-API-Key: arn_sua_chave_aqui"
resp = httpx.get(
f"{BASE}/api/v1/jobs/{job_id}",
headers={"X-API-Key": API_KEY},
)
result = resp.json()
print(result["extraction"]["text_content"][:200])
const resp = await fetch(
`${BASE}/api/v1/jobs/${jobId}`,
{ headers: { "X-API-Key": API_KEY } }
);
const result = await resp.json();
console.log(result.extraction?.text_content?.slice(0, 200));
req, _ := http.NewRequest("GET",
fmt.Sprintf("/api/v1/jobs/%d", jobId), nil)
req.Header.Set("X-API-Key", apiKey)
resp, _ := http.DefaultClient.Do(req)
var result map[string]any
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
Todas as requisições à API pública precisam do header:
X-API-Key: arn_sua_chave_aqui
Chaves são geradas no formato arn_ + token seguro de 32 bytes. Gerencie suas chaves na aba 🔑 Chaves.
| Método | Endpoint | Descrição | Escopo |
|---|---|---|---|
| GET | /api/v1/status | Health check | — |
| POST | /api/v1/scrape | Criar | scrape:execute |
| POST | /api/v1/scrape/batch | Extração em lote | scrape:execute |
| GET | /api/v1/jobs/{id} | Consultar job | jobs:read |
| GET | /api/v1/jobs | Listar jobs | jobs:read |
| GET | /api/v1/jobs/{id}/export | Exportar | jobs:export |
| POST | /api/v1/extract/text | Extrair texto de URL | scrape:execute |
| POST | /api/v1/extract/upload | Extrair de arquivo | scrape:upload |
| GET | /api/v1/usage | Uso da chave | jobs:read |
| GET | /api/v1/usage/stats | Stats detalhados | jobs:read |
| GET | /api/v1/plans | Listar planos | — |
Extraia múltiplas URLs de uma vez com streaming SSE.
curl -X POST /api/v1/scrape/batch \
-H "X-API-Key: arn_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://site1.com", "https://site2.com"]}'
resp = httpx.post(
f"{BASE}/api/v1/scrape/batch",
headers={"X-API-Key": API_KEY},
json={"urls": ["https://site1.com", "https://site2.com"]},
)
batch = resp.json()
print(f"Batch ID: {batch['batch_id']}")
print(f"Total: {batch['total']}")
const resp = await fetch(`${BASE}/api/v1/scrape/batch`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
urls: ["https://site1.com", "https://site2.com"],
}),
});
const batch = await resp.json();
console.log("Batch ID:", batch.batch_id);
body, _ := json.Marshal(map[string][]string{
"urls": {"https://site1.com", "https://site2.com"},
})
req, _ := http.NewRequest("POST",
"/api/v1/scrape/batch",
bytes.NewBuffer(body),
)
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
var batch map[string]any
json.NewDecoder(resp.Body).Decode(&batch)
fmt.Println("Batch ID:", batch["batch_id"])
Exporte resultados nos formatos JSON, CSV, XLSX, PPTX e PBIX.
curl /api/v1/jobs//export?format=csv \
-H "X-API-Key: arn_sua_chave_aqui" \
-o resultado.csv
resp = httpx.get(
f"{BASE}/api/v1/jobs/{job_id}/export?format=csv",
headers={"X-API-Key": API_KEY},
)
with open("resultado.csv", "wb") as f:
f.write(resp.content)
const resp = await fetch(
`${BASE}/api/v1/jobs/${jobId}/export?format=csv`,
{ headers: { "X-API-Key": API_KEY } }
);
const buffer = await resp.arrayBuffer();
Bun.write("resultado.csv", new Uint8Array(buffer));
req, _ := http.NewRequest("GET",
fmt.Sprintf("/api/v1/jobs/%d/export?format=csv", jobId), nil)
req.Header.Set("X-API-Key", apiKey)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
os.WriteFile("resultado.csv", data, 0644)
from arachne import Arachne
# Inicialize com sua chave
client = Arachne(api_key="arn_sua_chave_aqui")
# Scrape uma URL — retorna imediatamente com o job_id
job = client.scrape("https://example.com")
print(f"Job {job.id} — {job.status}")
# Aguarde e consulte o resultado
result = client.get_job(job.id)
print(f"Título: {result.title}")
print(f"Chars extraídos: {len(result.text_content)}")
# Scraping em lote
batch = client.scrape_many([
"https://site1.com",
"https://site2.com",
])
for item in batch:
print(f"{item.url}: {item.status}")
# Exportar
client.export(job.id, format="csv", output="dados.csv")
📦 O SDK está disponível no GitHub
Cada chave de API tem um limite de requisições por minuto configurável pelo plano. Headers de rate limit são retornados em todas as respostas:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1718640000
Quando o limite é excedido, a API retorna 429 Too Many Requests
com o header Retry-After indicando quantos segundos aguardar.
| Código | Significado | Solução |
|---|---|---|
400 | Requisição inválida | Verifique os parâmetros enviados |
401 | API Key ausente | Adicione o header X-API-Key |
403 | API Key inválida ou escopo insuficiente | Verifique sua chave ou escopo |
429 | Rate limit excedido | Aguarde o tempo indicado em Retry-After |
502 | Erro no scraping da URL | A URL pode estar bloqueada ou inacessível |
Receba notificações quando seus jobs forem concluídos.
curl -X POST /api/v1/scrape \
-H "X-API-Key: arn_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"webhook_url": "https://seu-servidor.com/webhook",
"webhook_events": ["job.completed"]
}'
resp = httpx.post(
f"{BASE}/api/v1/scrape",
headers={"X-API-Key": API_KEY},
json={
"url": "https://example.com",
"webhook_url": "https://seu-servidor.com/webhook",
"webhook_events": ["job.completed"],
},
)
const resp = await fetch(`${BASE}/api/v1/scrape`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://example.com",
webhook_url: "https://seu-servidor.com/webhook",
webhook_events: ["job.completed"],
}),
});
body, _ := json.Marshal(map[string]any{
"url": "https://example.com",
"webhook_url": "https://seu-servidor.com/webhook",
"webhook_events": []string{"job.completed"},
})
req, _ := http.NewRequest("POST",
"/api/v1/scrape", bytes.NewBuffer(body))
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)