Collections diffables
Un dossier, des fichiers YAML, des descriptions Markdown. Chaque changement se relit proprement en pull request.
Collections en YAML versionnable, secrets dans le keychain de l’OS, tests QuickJS identiques en local et en CI. HTTP, GraphQL, WebSocket, SSE et gRPC dans un seul outil desktop — zéro cloud.
macOS Windows Linux 100 % local · open source
Un seul outil, tous tes protocoles
Variables résolues, réponses, tests, runner, flux live, exports. L’interface est dense parce que ton travail l’est aussi — et chaque détail reste lisible.
Un dossier, des fichiers YAML, des descriptions Markdown. Chaque changement se relit proprement en pull request.
La syntaxe {{secret:NOM}} garde le YAML partageable et délègue la valeur sensible au keychain de l’OS.
preRequest, zapi.fetch, test() et expect() tournent à l’identique dans l’app et dans la CLI.
reqwest envoie les requêtes côté natif : timings réels, pas de proxy navigateur, corps binaires préservés.
Une requête n’est pas une capture d’écran : c’est un artefact versionné, exécutable en local, relu en équipe et publiable en JSON ou JUnit. Auth, variables et tests vivent dans le même fichier.
name: Créer une facture
kind: http
method: POST
url: "{{baseUrl}}/invoices"
headers:
- key: Authorization
value: "Bearer {{token}}"
enabled: true
body:
type: json
content: |
{ "customerId": "{{customerId}}", "amount": 12900, "currency": "EUR" }
scripts:
preRequest: |
const auth = zapi.fetch(zapi.getVar("baseUrl") + "/auth/login", {
method: "POST",
body: { password: "{{secret:API_PASSWORD}}" }
});
zapi.setVar("token", auth.json.accessToken);
tests: |
test("facture créée", () => expect(res.status).toBe(201));
test("id présent", () => expect(res.json.id).toBeDefined());// Les mêmes tests en local et en CI
test("status 200", () => expect(res.status).toBe(200));
test("contrat respecté", () => {
expect(res.headers["content-type"]).toContain("application/json");
expect(res.json.id).toBeDefined();
expect(res.json.items).toHaveLength(3);
});
test("latence acceptable", () =>
expect(res.durationMs).toBeLessThan(500));Le moteur QuickJS embarqué est partagé entre l’app et la CLI. Un test qui
passe sur ton poste passe en CI — mêmes helpers, même budget de timeout,
mêmes matchers expect.
Variables, secrets OS, GraphQL, flux live, gRPC dynamique et format de collection : chaque page est locale, statique et navigable avec View Transitions.
Télécharge Zapi, ouvre un dossier, et ta première requête part en quelques secondes. Gratuit et open source.