Integración

Cookbook, seguridad UE y drift

Recetas for_each, smoke CI, verificar webhook, RGPD y regla UI o Terraform.

Contrato OpenAPIEmitir una clave de APICuenta Solo gratis

Documento completo, sin autenticación, listo para su generador de clientes.

Seguridad, UE y RGPD

Medición desde la UE. Datos alojados en la Unión. Minimice PII en nombres y payloads. La exportación de organización queda fuera de la API con clave.

Rotación: TTL corto en CI, revocación inmediata si hay fuga. No registre Authorization en logs.

UI o Terraform, no ambos

El drift aparece cuando consola y estado Terraform divergen. Una fuente de verdad por entorno. Import nativo, luego bloquear ediciones en consola.

# Adopter un scénario existant
terraform import pathly_scenario.home scn_…

Cookbook — recetas

Recetas listas para pegar. Adapte nombres y URLs (dominios example.* en la doc).

Flota agencia — for_each

locals {
  clients = {
    acme  = "https://www.example.com/"
    globex = "https://shop.example.com/"
  }
}

resource "pathly_scenario" "home" {
  for_each     = local.clients
  name         = "home-${each.key}"
  url          = each.value
  interval_sec = 300
  severity     = "critical"
}

GitHub Actions — run-scenario post-deploy

- name: Pathly smoke
  uses: pathlyhq/pathly-action@v1
  with:
    api_token: ${{ secrets.PATHLY_API_TOKEN }}
    operation: run-scenario
    scenario_id: ${{ vars.PATHLY_CHECKOUT_SCENARIO_ID }}
    timeout_sec: "120"

GitLab CI — component

include:
  - component: gitlab.com/pathly1/provider/gitlab-ci/pathly-ping@0.1.2
    inputs:
      api_token: $PATHLY_API_TOKEN

Node SDK — Ping, Chain, lister

import { PathlyClient } from "@pathly/sdk";
const client = new PathlyClient({ token: process.env.PATHLY_API_TOKEN });
const s = await client.createScenario({
  name: "Checkout",
  url: "https://www.example.com/cart",
  intervalSec: 300,
  expectText: "Your cart",
});
const chain = await client.createChain({
  name: "Login then /me",
  intervalSec: 300,
  hops: [
    { method: "POST", url: "https://api.example.com/login", assertStatus: 200 },
    { method: "GET", url: "https://api.example.com/me", assertStatus: 200 },
  ],
});
for await (const row of client.paginate((cursor) => client.listScenarios({ cursor }))) {
  console.log(row.id, row.name);
}

Python SDK

from pathly import Client, ScenarioInput
client = Client()
s = client.create_scenario(ScenarioInput(
    name="Checkout",
    url="https://www.example.com/cart",
    intervalSec=300,
    expectText="Your cart",
))
chain = client.create_scenario(ScenarioInput(
    name="Login then /me",
    intervalSec=300,
    httpChain=[
        {"method": "POST", "url": "https://api.example.com/login", "assertStatus": 200},
        {"method": "GET", "url": "https://api.example.com/me", "assertStatus": 200},
    ],
))
print(s.id, chain.id)

jq — filtrer les scénarios critiques

curl -sS https://api.pathlyhq.com/v1/scenarios \
  -H "Authorization: Bearer $PATHLY_API_TOKEN" \
  | jq '.items[] | select(.severity=="critical") | {id,name,url}'