Intégration

Cookbook, sécurité UE et drift

Recettes for_each, smoke CI, vérif webhook, RGPD et règle UI ou Terraform.

Contrat OpenAPIÉmettre une clé d’APICompte Solo gratuit

Document complet, sans authentification, à donner à votre générateur de client.

Sécurité, UE et RGPD

Mesure depuis l’UE. Données hébergées dans l’Union. Minimisez les PII dans les noms de scénarios et les payloads custom. Les exports d’organisation (membres) restent hors API clé — volontairement.

Rotation : TTL court sur les clés CI, révocation immédiate si fuite. Logs applicatifs : ne jamais journaliser Authorization ni le corps signé brut si le secret y figure.

UI ou Terraform, pas les deux

Le drift apparaît quand la console et l’état Terraform divergent. Choisissez une source de vérité par environnement. Import natif du provider pour adopter un parc déjà créé à la main, puis interdire les edits console sur ces ressources.

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

Cookbook — recettes

Recettes prêtes à coller. Adaptez les noms et les URLs (domaines example.* uniquement dans la doc).

Flotte agence — 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}'