Loading…
Loading…
Todo lo que necesitas para monitorizar la salud de tu instancia de Odoo, desde el primer escaneo hasta la monitorización continua.
Obtén tu primer Pulse Score en menos de 60 segundos. No requiere instalación.
El Pulse Score es una métrica de salud 0–100 para tu instancia de Odoo. Mayor es mejor.
The score combines deprecated module count, permission vulnerabilities, custom code risks, and other heuristics. Each finding has a severity and contributes to the overall grade.
Mantén tu Pulse Score actualizado automáticamente y recibe alertas cuando las cosas cambien.
For the best experience, use the NonaGuard Connector — it sends health pings every 15 minutes with no open ports or manual scans.
The NonaGuard Connector is a free native Odoo module that automatically pushes health data every 15 minutes — no manual scans, no open ports, works behind any firewall.
AI-generated recommendations, priority actions, and effort estimates are available out of the box on paid plans.
NonaGuard uses server-managed AI providers (with Groq prioritized) so your team can generate insights immediately without API key setup. Available on all paid plans.
Solo+ Invite team members and assign roles (Admin, Member, Viewer). Control who can add instances, run scans, or view sensitive data. Available on Solo, Agency, Partner, and Enterprise plans.
Partner / Enterprise Use the REST API to integrate NonaGuard with your CI/CD pipelines, ticketing systems, or internal dashboards.
opk_...) — it's shown only onceX-API-Key header in all requestsList instances:
curl -H "X-API-Key: opk_YOUR_KEY" \
https://api.nonaguard.com/api/v1/instances/Trigger a scan:
curl -X POST \
-H "X-API-Key: opk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"instance_id": "YOUR_INSTANCE_ID"}' \
https://api.nonaguard.com/api/v1/scans/triggerGet scan results:
curl -H "X-API-Key: opk_YOUR_KEY" \
https://api.nonaguard.com/api/v1/scans/SCAN_IDDownload PDF report:
curl -H "X-API-Key: opk_YOUR_KEY" \
-o report.pdf \
https://api.nonaguard.com/api/v1/reports/SCAN_ID/pdfconst API_KEY = "opk_YOUR_KEY";
const BASE = "https://api.nonaguard.com/api/v1";
const headers = { "X-API-Key": API_KEY, "Content-Type": "application/json" };
// Trigger a scan
const { scan_id } = await fetch(`${BASE}/scans/trigger`, {
method: "POST",
headers,
body: JSON.stringify({ instance_id: "YOUR_INSTANCE_ID" }),
}).then(r => r.json());
// Poll until complete (simple example)
let scan;
do {
await new Promise(r => setTimeout(r, 5000));
scan = await fetch(`${BASE}/scans/${scan_id}`, { headers }).then(r => r.json());
} while (scan.status === "queued" || scan.status === "running");
console.log(`Score: ${scan.pulse_score}/100 (Grade: ${scan.grade})`);
console.log(`Risks: ${scan.risks_count} total`);import requests, time
API_KEY = "opk_YOUR_KEY"
BASE = "https://api.nonaguard.com/api/v1"
headers = {"X-API-Key": API_KEY}
# Trigger a scan
resp = requests.post(f"{BASE}/scans/trigger",
headers=headers,
json={"instance_id": "YOUR_INSTANCE_ID"})
scan_id = resp.json()["scan_id"]
# Poll until complete
while True:
scan = requests.get(f"{BASE}/scans/{scan_id}", headers=headers).json()
if scan["status"] in ("completed", "failed"):
break
time.sleep(5)
print(f"Score: {scan['pulse_score']}/100 (Grade: {scan['grade']})")
print(f"Risks: {scan['risks_count']} total")
# Download PDF report
pdf = requests.get(f"{BASE}/reports/{scan_id}/pdf", headers=headers)
with open("report.pdf", "wb") as f:
f.write(pdf.content)scan scope required)