{
    "variable": [
        {
            "id": "baseUrl",
            "key": "baseUrl",
            "type": "string",
            "name": "string",
            "value": "https:\/\/integrations.revenexx.com"
        }
    ],
    "info": {
        "name": "Integrations Service API",
        "_postman_id": "150db768-a645-4212-9693-350c3857561c",
        "description": "API for the revenexx Integration Studio \u2014 connects Revenue Cloud to external systems (ERP, PIM, CRM) via Temporal workflows.",
        "schema": "https:\/\/schema.getpostman.com\/json\/collection\/v2.1.0\/collection.json"
    },
    "item": [
        {
            "name": "Audit Log",
            "description": "\nRead access to the append-only audit trail (credential \/ secret \/ workflow \/\ntrigger create-edit-delete, plus workflow run start\/finished\/failed). Two\nplanes: the public feed is auto-scoped to the caller's org + tenant; the\nadmin feed (registered under `v1\/admin`) filters all three identity fields\noptionally. Results are newest-first and cursor-paginated.",
            "item": [
                {
                    "name": "List audit entries (public)",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/audit-logs",
                            "query": [
                                {
                                    "key": "sub",
                                    "value": "289347298347",
                                    "description": "optional Filter by acting user subject.",
                                    "disabled": false
                                },
                                {
                                    "key": "resource_type",
                                    "value": "workflow",
                                    "description": "optional Filter by resource type (credential, secret, workflow, trigger, workflow_run).",
                                    "disabled": false
                                },
                                {
                                    "key": "action",
                                    "value": "create",
                                    "description": "optional Filter by action (create, update, delete, run.started, run.finished, run.failed).",
                                    "disabled": false
                                },
                                {
                                    "key": "limit",
                                    "value": "50",
                                    "description": "optional Page size (1\u2013100, default 50).",
                                    "disabled": false
                                },
                                {
                                    "key": "cursor",
                                    "value": "eyJpZCI6NDJ9",
                                    "description": "optional Opaque pagination cursor from a previous response.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/audit-logs?sub=289347298347&resource_type=workflow&action=create&limit=50&cursor=eyJpZCI6NDJ9"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the audit entries for the caller's org + tenant, newest first.\nOptionally narrowed by `sub` (actor), `resource_type` and `action`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"id\": 42, \"org_id\": \"acme-org\", \"tenant_id\": \"acme-production\", \"actor_sub\": \"289347298347\", \"via_system\": false, \"channel\": \"api\", \"action\": \"create\", \"resource_type\": \"workflow\", \"resource_id\": \"1\", \"metadata\": {\"name\": \"Sync orders\"}, \"created_at\": \"2026-06-18T10:00:00Z\"}], \"meta\": {\"per_page\": 50, \"next_cursor\": null, \"prev_cursor\": null}}",
                            "name": "Success"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Auth",
            "description": "\nEndpoints for verifying authentication and tenant context.",
            "item": [
                {
                    "name": "Get authenticated user info",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/me",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/me"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns full user profile, resolved tenant context, and raw token claims.\nUseful for debugging authentication and understanding which data Zitadel provides."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\n  \"user\": {\"id\": 1, \"zitadel_id\": \"289347298347\", \"email\": \"user@acme.com\", \"name\": \"Jane Doe\"},\n  \"context\": {\"tenant_id\": \"acme-production\", \"active_plane\": \"public\", \"roles\": [\"admin\", \"user\"]},\n  \"claims\": {\"iss\": \"https:\/\/id.revenexx.com\", \"sub\": \"289347298347\", \"aud\": [\"project-id\"]}\n}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\n  \"message\": \"Unauthenticated.\"\n}",
                            "name": "Missing or invalid token"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Credential Types",
            "description": "\nRead-only catalogue of the credential types registered via node packages.\nDrives the credential form (fields + validation) and the `credentials-ref`\ntype picker in the editor. Globally registered, not tenant-scoped.",
            "item": [
                {
                    "name": "List credential types",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credential-types",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credential-types"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the latest registered version of each credential type."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"slug\": \"revenexx:smtp\", \"version\": \"1.0.0\", \"name\": \"SMTP\", \"description\": \"Send mail over SMTP\", \"icon\": null, \"auth_kind\": \"secret\", \"fields\": []}]}",
                            "name": "Success"
                        }
                    ]
                },
                {
                    "name": "Show a credential type",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credential-types\/:slug",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credential-types\/:slug",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Asmtp",
                                    "description": "Namespaced credential type slug."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the latest registered version of the credential type identified\nby its namespaced slug."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": {\"slug\": \"revenexx:smtp\", \"version\": \"1.0.0\", \"name\": \"SMTP\", \"description\": \"Send mail over SMTP\", \"icon\": null, \"auth_kind\": \"secret\", \"fields\": []}}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Credentials",
            "description": "\nTenant-scoped credential instances of a registered {@see CredentialType}.\nThe encrypted `config` \/ `durable_creds` blobs are never returned. Runtime\nresolution happens in the broker, not here \u2014 this controller only stores and\nproxies the on-demand connection test.",
            "item": [
                {
                    "name": "OAuth redirect callback (public)",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/oauth\/callback",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/oauth\/callback"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "The provider redirects the user's browser here with `code` + `state`.\nUnauthenticated by necessity \u2014 the single-use `state` (looked up in the\ncache) is the CSRF protection and carries the tenant + PKCE verifier.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"status\": \"connected\", \"credential_id\": 1}",
                            "name": "Connected"
                        },
                        {
                            "header": [],
                            "code": 400,
                            "body": "{\"message\": \"Invalid or expired OAuth state.\"}",
                            "name": "Missing or invalid state"
                        }
                    ]
                },
                {
                    "name": "List credentials",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials",
                            "query": [
                                {
                                    "key": "type",
                                    "value": "revenexx%3Asmtp",
                                    "description": "Filter by credential type slug.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials?type=revenexx%3Asmtp"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the current tenant's credential instances, optionally filtered to\na single credential type via `?type={slug}`. Secrets are never exposed."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"id\": 1, \"tenant_id\": \"acme-production\", \"credential_type_slug\": \"revenexx:smtp\", \"name\": \"Production SMTP\", \"status\": \"active\", \"public_config\": {}, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\"message\": \"Unauthenticated.\"}",
                            "name": "Missing or invalid token"
                        }
                    ]
                },
                {
                    "name": "Create a credential",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"credential_type_slug\":\"revenexx:smtp\",\"name\":\"Mailpit\",\"config\":{\"host\":\"smtp.example.com\",\"port\":587,\"username\":\"mailer\",\"password\":\"sekret\"}}"
                        },
                        "description": "Validates the submitted `config` against the credential type's declared\nfields, then stores it encrypted. Returns 201 with the masked instance."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{\"id\": 1, \"tenant_id\": \"acme-production\", \"credential_type_slug\": \"revenexx:smtp\", \"name\": \"Production SMTP\", \"status\": \"active\", \"public_config\": {}, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}",
                            "name": "Created"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The given data was invalid.\", \"errors\": {\"config\": [\"...\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Test an unsaved credential",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/test",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/test"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"credential_type_slug\":\"revenexx:smtp\",\"config\":{\"host\":\"smtp.example.com\",\"port\":587,\"username\":\"mailer\",\"password\":\"sekret\"}}"
                        },
                        "description": "Runs the broker connection test against an inline type + config, before\nthe instance is persisted. Non-blocking."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"ok\": true}",
                            "name": "Tested"
                        }
                    ]
                },
                {
                    "name": "Show a credential",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "019f124d-b287-731d-8879-de2bf1fa6924",
                                    "description": "The ID of the credential."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"tenant_id\": \"acme-production\", \"credential_type_slug\": \"revenexx:smtp\", \"name\": \"Production SMTP\", \"status\": \"active\", \"public_config\": {}, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Update a credential",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "019f124d-b287-731d-8879-de2bf1fa6924",
                                    "description": "The ID of the credential."
                                }
                            ]
                        },
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"name\":\"Mailpit (staging)\",\"config\":{\"host\":\"smtp.example.com\",\"port\":587,\"username\":\"mailer\",\"password\":\"sekret\"}}"
                        },
                        "description": "Updates the name and\/or `config`. When `config` is supplied it is\nre-validated against the credential type's declared fields."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"tenant_id\": \"acme-production\", \"credential_type_slug\": \"revenexx:smtp\", \"name\": \"Production SMTP\", \"status\": \"active\", \"public_config\": {}, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T11:00:00Z\"}",
                            "name": "Updated"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The given data was invalid.\", \"errors\": {\"config\": [\"...\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Delete a credential",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "019f124d-b287-731d-8879-de2bf1fa6924",
                                    "description": "The ID of the credential."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 204,
                            "body": "",
                            "name": "Deleted"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Test a saved credential",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/:id\/test",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/:id\/test",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "019f124d-b287-731d-8879-de2bf1fa6924",
                                    "description": "The ID of the credential."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Runs the credential type's connection test in the broker against the\nstored config. Non-blocking \u2014 does not change the stored instance."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"ok\": true}",
                            "name": "Tested"
                        }
                    ]
                },
                {
                    "name": "Begin 3-legged OAuth setup",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/credentials\/:id\/oauth\/authorize-url",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/credentials\/:id\/oauth\/authorize-url",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "019f124d-b287-731d-8879-de2bf1fa6924",
                                    "description": "The ID of the credential."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the provider authorize URL for the credential. The caller (the\ncockpit) opens it; the provider redirects back to the public callback."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"authorize_url\": \"https:\/\/login.example.com\/authorize?client_id=...&state=...\"}",
                            "name": "Authorize URL"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"Credential type does not use 3-legged OAuth.\"}",
                            "name": "Not a 3-legged OAuth type"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Node Packages",
            "description": "",
            "item": [
                {
                    "name": "Stream a node-package image.",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/node-packages\/images\/:id",
                            "query": [
                                {
                                    "key": "expires",
                                    "value": "16",
                                    "description": "Signed-URL expiry (added by the signer).",
                                    "disabled": false
                                },
                                {
                                    "key": "signature",
                                    "value": "architecto",
                                    "description": "URL signature (added by the signer).",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/node-packages\/images\/:id?expires=16&signature=architecto",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "architecto",
                                    "description": "The ID of the image."
                                },
                                {
                                    "id": "image",
                                    "key": "image",
                                    "value": "9b2e6b1e-6d0a-5f3a-8c1b-2b7f6a1c9d4e",
                                    "description": "The image UUID."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "\"<binary image stream>\"",
                            "name": "Valid signature"
                        },
                        {
                            "header": [],
                            "code": 403,
                            "body": "{\"message\": \"Invalid signature.\"}",
                            "name": "Missing, tampered, or expired signature"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not Found\"}",
                            "name": "Unknown image, or stored file missing"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Nodes",
            "description": "\nGlobally registered node definitions, addressed publicly by\n`<slug>\/<version>`. Read endpoints additionally accept the alias\n`latest` in place of an explicit version. The `DELETE` endpoint refuses\nthe alias and requires an exact version, so the caller always knows which\nrow they're touching.\n\nNodes are created and updated exclusively through the node-package upload\n(`POST \/v1\/admin\/orgs\/{org_id}\/node-packages`), which extracts the manifests\nfrom the published tarball \u2014 there is no standalone create\/update endpoint,\nsince a node always ships with its runtime code.\n\nAuthentication is required for every endpoint, but the resource itself\nis *not* tenant-scoped \u2014 per-tenant entitlement (which tenant may use\nwhich node) is the responsibility of a future app-registration flow.",
            "item": [
                {
                    "name": "List nodes",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/nodes",
                            "query": [
                                {
                                    "key": "namespace",
                                    "value": "revenexx",
                                    "description": "Filter by the slug-derived namespace (e.g. `revenexx`).",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/nodes?namespace=revenexx"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the registered nodes ordered by `slug` ascending, then\nsemver descending. Optionally filters to a single namespace via the\n`namespace` query parameter."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"name\": \"HTTP request\", \"namespace\": \"revenexx\", \"slug\": \"revenexx:http-request\", \"version\": \"1.0.0\", \"package\": {\"name\": \"@revenexx\/integrations-nodes-core\", \"version\": \"0.2.0\", \"label\": \"Core\"}, \"manifest_version\": \"v0-draft\", \"manifest\": {}, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\"message\": \"Unauthenticated.\"}",
                            "name": "Missing or invalid token"
                        }
                    ]
                },
                {
                    "name": "List versions for a node",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/nodes\/:slug\/versions",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/nodes\/:slug\/versions",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Ahttp-request",
                                    "description": "Full node slug."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the registered versions for a given slug, semver-descending.\nThe slug must match at least one stored row, otherwise a 404 is\nreturned \u2014 there's no representation for \"an empty list of\nversions\". The response intentionally only contains version\nstrings; callers that need the full row should follow up with\n`GET \/nodes\/{slug}\/{version}`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [\"2.5.0\", \"1.10.0\", \"1.0.0\"]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Unknown slug"
                        }
                    ]
                },
                {
                    "name": "Show a node",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/nodes\/:slug\/:version",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/nodes\/:slug\/:version",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Ahttp-request",
                                    "description": "Full node slug."
                                },
                                {
                                    "id": "version",
                                    "key": "version",
                                    "value": "1.0.0",
                                    "description": "Semver, or the alias `latest`."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns a single node by `(slug, version)`. The version may be the\nliteral string `latest`, in which case the highest semver registered\nfor the slug is returned."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"name\": \"HTTP request\", \"namespace\": \"revenexx\", \"slug\": \"revenexx:http-request\", \"version\": \"1.0.0\", \"package\": {\"name\": \"@revenexx\/integrations-nodes-core\", \"version\": \"0.2.0\", \"label\": \"Core\"}, \"manifest_version\": \"v0-draft\", \"manifest\": {}, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Resolve dynamic node config",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/nodes\/:slug\/:version\/config:resolve",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/nodes\/:slug\/:version\/config:resolve",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Aapi",
                                    "description": "Full node slug."
                                },
                                {
                                    "id": "version",
                                    "key": "version",
                                    "value": "1.0.0",
                                    "description": "Semver, or the alias `latest`."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"target\":\"*\",\"config\":[],\"locale\":\"de\"}"
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"fields\": [{\"key\": \"customerId\", \"type\": \"string\"}], \"outputs\": [{\"name\": \"success\"}]}",
                            "name": "Resolved"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Unknown node"
                        },
                        {
                            "header": [],
                            "code": 409,
                            "body": "{\"message\": \"Node bundle is not built yet; retry shortly.\"}",
                            "name": "Bundle not built yet"
                        },
                        {
                            "header": [],
                            "code": 502,
                            "body": "{\"message\": \"Node runtime resolve failed: ...\"}",
                            "name": "Node runtime unavailable or failed"
                        }
                    ]
                },
                {
                    "name": "Delete a node",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/nodes\/:slug\/:version",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/nodes\/:slug\/:version",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Ahttp-request",
                                    "description": "Full node slug."
                                },
                                {
                                    "id": "version",
                                    "key": "version",
                                    "value": "1.0.0",
                                    "description": "Exact semver of the node version to delete; the alias `latest` is rejected."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Removes the node version identified by `(slug, version)`. The\n`latest` alias is rejected to prevent ambiguous deletes."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 204,
                            "body": "",
                            "name": "Deleted"
                        },
                        {
                            "header": [],
                            "code": 400,
                            "body": "{\"message\": \"The `latest` alias is not allowed for mutating requests.\"}",
                            "name": "Latest alias rejected"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Schemas",
            "description": "\nPublic, read-only access to the JSON-Schema definitions used to validate\nversioned payloads (currently the workflow `blob` and the node manifest).\nSchemas are global \u2014 they describe the shape of payloads regardless of\ntenant \u2014 so these endpoints are intentionally unauthenticated.",
            "item": [
                {
                    "name": "List schema versions",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/schemas\/:domain",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/schemas\/:domain",
                            "variable": [
                                {
                                    "id": "domain",
                                    "key": "domain",
                                    "value": "workflow",
                                    "description": "The schema domain. Supported domains: `workflow`, `node`."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns the identifiers of every registered schema version for the given\ndomain, in registration order (which is also the order in which they\nare accepted by the validation layer).",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"domain\": \"workflow\", \"versions\": [\"v0-draft\"]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Unknown schema domain.\"}",
                            "name": "Unknown domain"
                        }
                    ]
                },
                {
                    "name": "Show a schema version",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/schemas\/:domain\/:version",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/schemas\/:domain\/:version",
                            "variable": [
                                {
                                    "id": "domain",
                                    "key": "domain",
                                    "value": "workflow",
                                    "description": "The schema domain."
                                },
                                {
                                    "id": "version",
                                    "key": "version",
                                    "value": "v0-draft",
                                    "description": "The schema version identifier."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            }
                        ],
                        "body": null,
                        "description": "Returns the serialized JSON-Schema definition for one specific\n`(domain, version)` pair. The payload uses the standard JSON Schema\nvocabulary (`type`, `properties`, `required`, \u2026) and is suitable for\nclient-side validation or form generation.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"domain\": \"workflow\", \"version\": \"v0-draft\", \"schema\": {\"title\": \"Workflow Definition (v0-draft)\", \"type\": \"object\"}}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Unknown schema version.\"}",
                            "name": "Unknown version"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Templates",
            "description": "\nCatalogue of the workflow templates registered via node packages, plus the\n\"install\" actions a UI uses to turn one into a real workflow. Listing\/showing\nis global; instantiation is scoped to the current tenant.",
            "item": [
                {
                    "name": "List templates",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/templates",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/templates"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the latest registered version of each template, without the\n(heavy) embedded workflow `definition` blob \u2014 that ships only on `show`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"slug\": \"revenexx:bc-sales-order-digest\", \"version\": \"1.0.0\", \"category\": \"sales\", \"level\": \"beginner\", \"name\": \"Daily Sales-Order Digest\", \"shortDescription\": \"Email a daily summary of Business Central sales orders.\", \"description\": null, \"icon\": \"mdi:email-newsletter\", \"industries\": [\"any\"], \"vendors\": [\"microsoft\", \"business-central\"], \"triggerTypes\": [\"schedule\"]}]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\"message\": \"Unauthenticated.\"}",
                            "name": "Missing or invalid token"
                        }
                    ]
                },
                {
                    "name": "Show a template",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/templates\/:slug",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/templates\/:slug",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Aslack-to-crm",
                                    "description": "Namespaced template slug."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the latest registered version of the template identified by its\nnamespaced slug, including the embedded workflow `definition` used to\ninstantiate a new workflow."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": {\"slug\": \"revenexx:bc-sales-order-digest\", \"version\": \"1.0.0\", \"category\": \"sales\", \"level\": \"beginner\", \"name\": \"Daily Sales-Order Digest\", \"shortDescription\": \"Email a daily summary of Business Central sales orders.\", \"description\": null, \"icon\": \"mdi:email-newsletter\", \"industries\": [\"any\"], \"vendors\": [\"microsoft\", \"business-central\"], \"triggerTypes\": [\"schedule\"], \"blob_version\": \"v0-draft\", \"definition\": {\"nodeManifestVersion\": \"v0-draft\", \"name\": \"Daily Sales-Order Digest\", \"nodes\": [], \"edges\": []}, \"triggers\": [{\"handle\": \"a1c0ffee-0001-4001-8001-000000000001\", \"type\": \"schedule\", \"config\": {\"cron\": \"0 7 * * *\"}}]}}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Template installation requirements",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/templates\/:slug\/requirements",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/templates\/:slug\/requirements",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Aslack-to-crm",
                                    "description": "Namespaced template slug."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Lists the credential types and secret keys the template's workflow\nreferences, cross-referenced against the current tenant (how many\ncredential instances already exist, whether each secret key is stored) so\nan install UI can have the user provision what is missing first."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": {\"credentialTypes\": [{\"slug\": \"revenexx:business-central\", \"registered\": true, \"existingInstances\": 1, \"usedBy\": [{\"nodeId\": \"list_orders\", \"configKey\": \"credentials\"}], \"version\": \"1.0.0\", \"name\": \"Business Central\", \"authKind\": \"oauth2-client-credentials\", \"fields\": []}], \"secrets\": []}}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Instantiate a template",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/templates\/:slug\/instantiate",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/templates\/:slug\/instantiate",
                            "variable": [
                                {
                                    "id": "slug",
                                    "key": "slug",
                                    "value": "revenexx%3Aslack-to-crm",
                                    "description": "Namespaced template slug."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"name\":\"My Slack flow\",\"credential_bindings\":[\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"]}"
                        },
                        "description": "Creates a new workflow (and its triggers) for the current tenant from the\ntemplate's blueprint. Trigger handles are regenerated so repeated installs\nnever collide; the workflow and all triggers start inactive. Returns the\ncreated workflow."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{\"id\": 1, \"name\": \"Daily Sales-Order Digest\", \"description\": null, \"blob_definition_version\": \"v0-draft\", \"blob\": {}, \"active\": false, \"revision\": 1, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}",
                            "name": "Created"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The given data was invalid.\", \"errors\": {\"credential_bindings\": [\"The credential_bindings field must be an array.\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Tenant Secrets",
            "description": "\nPer-tenant encrypted key\/value store. Values are AES-256-GCM encrypted at\nrest using a dedicated SECRETS_ENCRYPTION_KEY (separate from APP_KEY) and\nare never returned by the API.",
            "item": [
                {
                    "name": "List secret keys",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/secrets",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/secrets"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the alphabetically sorted list of secret keys for the current\ntenant. Values are never exposed."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"keys\": [\"SLACK_WEBHOOK_URL\", \"STRIPE_API_KEY\"]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\"message\": \"Unauthenticated.\"}",
                            "name": "Missing or invalid token"
                        }
                    ]
                },
                {
                    "name": "Create or update a secret",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/secrets",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/secrets"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"key\":\"STRIPE_API_KEY\",\"value\":\"sk_live_abc123\"}"
                        },
                        "description": "Upserts a secret value for the given key within the current tenant.\nReturns 201 on creation, 200 on update. The value is never echoed back."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"key\": \"STRIPE_API_KEY\", \"created_at\": \"2026-05-04T08:50:00Z\", \"updated_at\": \"2026-05-05T08:50:00Z\"}",
                            "name": "Updated"
                        },
                        {
                            "header": [],
                            "code": 201,
                            "body": "{\"key\": \"STRIPE_API_KEY\", \"created_at\": \"2026-05-05T08:50:00Z\", \"updated_at\": \"2026-05-05T08:50:00Z\"}",
                            "name": "Created"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The key field format is invalid.\", \"errors\": {\"key\": [\"...\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Update a secret value",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/secrets\/:key",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/secrets\/:key",
                            "variable": [
                                {
                                    "id": "key",
                                    "key": "key",
                                    "value": "bc-client-secret",
                                    "description": "The secret key to update."
                                }
                            ]
                        },
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"value\":\"sk_live_new_value\"}"
                        },
                        "description": "Replaces the value of an existing secret. The key is immutable \u2014 create\na new secret and delete the old one if you need to rename a key. Returns\n404 if the key does not exist for the current tenant."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"key\": \"bc-client-secret\", \"created_at\": \"2026-05-04T08:50:00Z\", \"updated_at\": \"2026-06-12T10:00:00Z\"}",
                            "name": "Updated"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The value field is required.\", \"errors\": {\"value\": [\"...\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Delete a secret",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/secrets\/:key",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/secrets\/:key",
                            "variable": [
                                {
                                    "id": "key",
                                    "key": "key",
                                    "value": "STRIPE_API_KEY",
                                    "description": "The secret key to delete."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Removes the secret identified by `{key}` for the current tenant. The\nlookup is explicitly scoped to the current tenant, so a key belonging\nto another tenant \u2014 or one that does not exist at all \u2014 yields a 404\nwithout leaking existence either way."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 204,
                            "body": "",
                            "name": "Deleted"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Triggers",
            "description": "\nManage triggers for a workflow. Triggers are the entry points that can start\na workflow execution (manual, schedule, webhook, or event). They live as DB entities\nrather than inside the workflow blob, and are referenced in blob edges via\ntheir stable UUID handle.",
            "item": [
                {
                    "name": "List triggers for a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/triggers",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/triggers",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"id\": 12, \"workflow_id\": 1, \"handle\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\", \"type\": \"webhook\", \"name\": \"PSP webhook\", \"config\": {\"method\": \"POST\", \"public\": true, \"inbound\": {\"endpoint_id\": \"inb_abc123\", \"url\": \"https:\/\/webhooks.revenexx.com\/in\/inb_abc123\"}}, \"active\": true, \"created_at\": \"2026-06-15T10:00:00Z\", \"updated_at\": \"2026-06-15T10:00:00Z\"}]}",
                            "name": "Success"
                        }
                    ]
                },
                {
                    "name": "Create a trigger",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/triggers",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/triggers",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"handle\":\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",\"type\":\"webhook\",\"name\":\"PSP webhook\",\"active\":true,\"config\":{\"method\":\"POST\",\"public\":true}}"
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{\"id\": 12, \"workflow_id\": 1, \"handle\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\", \"type\": \"webhook\", \"name\": \"PSP webhook\", \"config\": {\"method\": \"POST\", \"public\": true, \"inbound\": {\"endpoint_id\": \"inb_abc123\", \"url\": \"https:\/\/webhooks.revenexx.com\/in\/inb_abc123\"}}, \"active\": true, \"created_at\": \"2026-06-15T10:00:00Z\", \"updated_at\": \"2026-06-15T10:00:00Z\", \"inbound_secret\": \"whsec_ing_onetime\"}",
                            "name": "Public webhook trigger"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The config.method field is required.\", \"errors\": {\"config.method\": [\"The config.method field is required.\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Update a trigger",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/triggers\/:triggerId",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/triggers\/:triggerId",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "triggerId",
                                    "key": "triggerId",
                                    "value": "1",
                                    "description": "The trigger id."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"type\":\"webhook\",\"name\":\"PSP webhook\",\"active\":true,\"config\":{\"method\":\"POST\",\"public\":true}}"
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 12, \"workflow_id\": 1, \"handle\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\", \"type\": \"webhook\", \"name\": \"PSP webhook\", \"config\": {\"method\": \"POST\", \"public\": true, \"inbound\": {\"endpoint_id\": \"inb_abc123\", \"url\": \"https:\/\/webhooks.revenexx.com\/in\/inb_abc123\"}}, \"active\": true, \"created_at\": \"2026-06-15T10:00:00Z\", \"updated_at\": \"2026-06-15T10:05:00Z\", \"inbound_secret\": \"whsec_ing_onetime\"}",
                            "name": "Public webhook trigger"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The config.method field is required.\", \"errors\": {\"config.method\": [\"The config.method field is required.\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Delete a trigger",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/triggers\/:triggerId",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/triggers\/:triggerId",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "triggerId",
                                    "key": "triggerId",
                                    "value": "1",
                                    "description": "The trigger id."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": ""
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 204,
                            "body": "",
                            "name": "Deleted"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Webhooks",
            "description": "\nInbound endpoint that fires a workflow run for a webhook trigger. The\ntrigger is addressed by its UUID handle in the URL; authentication is the\nstandard JWT + `X-Tenant-Id` used by the rest of the API, so the trigger is\nresolved within the caller's tenant. The HTTP request (body, query,\nheaders, method) is delivered to the workflow as the trigger payload,\nreachable via `${{ trigger.payload.* }}`.",
            "item": [
                {
                    "name": "Fire a webhook trigger",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/webhooks\/:handle",
                            "query": [
                                {
                                    "key": "mode",
                                    "value": "async",
                                    "description": "optional Force `sync` or `async`. Honored for `caller_decides` workflows; conflicting with `async_only`\/`sync_only` yields 422.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/webhooks\/:handle?mode=async",
                            "variable": [
                                {
                                    "id": "handle",
                                    "key": "handle",
                                    "value": "0190a9c0-1111-7000-8000-000000000000",
                                    "description": "The webhook trigger handle (UUID)."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Resolves the webhook trigger by handle, enforces the configured HTTP\nmethod, and starts a run. The mode follows the workflow's `execution_mode`\n(`async_only` \u2192 202; `sync_only`\/`caller_decides` \u2192 wait and return the\nresult), and can be overridden per request with `?mode=sync|async` when\nthe policy allows it \u2014 a conflicting `mode` is rejected with 422."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"workflow_id\": 1, \"status\": \"completed\", \"result\": {}}",
                            "name": "Completed (sync)"
                        },
                        {
                            "header": [],
                            "code": 202,
                            "body": "{\"id\": 1, \"workflow_id\": 1, \"status\": \"running\"}",
                            "name": "Accepted (async)"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"No active webhook trigger with handle \u2026 exists.\"}",
                            "name": "No such webhook trigger"
                        },
                        {
                            "header": [],
                            "code": 405,
                            "body": "{\"message\": \"This webhook expects POST.\"}",
                            "name": "Method not allowed"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"Workflow does not allow sync execution (execution_mode=async_only).\"}",
                            "name": "Mode conflicts with policy"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Workflow Credentials",
            "description": "\nRead-only introspection of which typed credentials a workflow's nodes\nreference through their `credentials-ref` config fields. Useful for pre-run\nchecks, access auditing, and impact analysis when a credential instance is\nrotated or deleted. The credential *values* are never touched here \u2014 only\nthe instance UUIDs and their credential type slugs are reported.",
            "item": [
                {
                    "name": "List credential ids used across the tenant's workflows",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/used-credentials",
                            "query": [
                                {
                                    "key": "type",
                                    "value": "revenexx%3Asmtp",
                                    "description": "Filter to a single credential type slug.",
                                    "disabled": false
                                },
                                {
                                    "key": "active",
                                    "value": "1",
                                    "description": "Only consider active workflows.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/used-credentials?type=revenexx%3Asmtp&active=1"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the distinct credential *instance* UUIDs referenced by every\nworkflow of the current tenant. Optionally filtered to a single\ncredential type slug via `?type={slug}` and\/or to active workflows only\nvia `?active=true`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [\"9f3e2c1a-0000-4000-8000-000000000001\", \"1ab2c3d4-0000-4000-8000-000000000002\"]}",
                            "name": "Used credentials"
                        }
                    ]
                },
                {
                    "name": "List credential type slugs used across the tenant's workflows",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/used-credential-types",
                            "query": [
                                {
                                    "key": "active",
                                    "value": "1",
                                    "description": "Only consider active workflows.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/used-credential-types?active=1"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the distinct credential *type* slugs (e.g. `revenexx:smtp`)\nreferenced by every workflow of the current tenant. Optionally filtered\nto active workflows only via `?active=true`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [\"revenexx:smtp\", \"revenexx:deepl\"]}",
                            "name": "Used credential types"
                        }
                    ]
                },
                {
                    "name": "List credential ids used by a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/credentials",
                            "query": [
                                {
                                    "key": "type",
                                    "value": "revenexx%3Asmtp",
                                    "description": "Filter to a single credential type slug.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/credentials?type=revenexx%3Asmtp",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the distinct credential *instance* UUIDs the workflow's nodes\nreference, optionally filtered to a single credential type slug via\n`?type={slug}`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [\"9f3e2c1a-0000-4000-8000-000000000001\", \"1ab2c3d4-0000-4000-8000-000000000002\"]}",
                            "name": "Used credentials"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Workflow not found"
                        }
                    ]
                },
                {
                    "name": "List credential type slugs used by a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/credential-types",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/credential-types",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the distinct credential *type* slugs (e.g. `revenexx:smtp`) the\nworkflow's nodes reference through their `credentials-ref` config fields."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [\"revenexx:smtp\", \"revenexx:deepl\"]}",
                            "name": "Used credential types"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Workflow not found"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Workflow Revisions",
            "description": "\nRead the archived revision history of a workflow and restore an old\nrevision. Every blob change to a workflow snapshots the previous revision\ninto `workflow_histories`; these endpoints expose that history and let a\nclient re-apply an old revision as a brand-new one.\n\nAll endpoints are scoped to the tenant resolved by the `resolve.tenant`\nmiddleware. Cross-tenant access returns 404 so the API never leaks the\nexistence of resources owned by other tenants.",
            "item": [
                {
                    "name": "List workflow revisions",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/revisions",
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number to retrieve (1-based). Defaults to 1. Must be at least 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "25",
                                    "description": "Number of revisions per page (1\u2013100). Defaults to 25. Must be at least 1. Must not be greater than 100.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/revisions?page=1&per_page=25",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the archived revisions of a workflow, newest first, paginated.\nList items carry metadata only \u2014 use the show endpoint to fetch a\nsingle revision's full `blob` and `triggers`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"id\": 7, \"revision\": 2, \"name\": \"Sync orders\", \"description\": null, \"active\": true, \"blob_definition_version\": \"v0-draft\", \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T11:00:00Z\", \"archived_at\": \"2026-05-06T12:00:00Z\"}], \"meta\": {\"current_page\": 1, \"per_page\": 25, \"total\": 1, \"last_page\": 1}}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Workflow not found"
                        }
                    ]
                },
                {
                    "name": "Show a workflow revision",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/revisions\/:revision",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/revisions\/:revision",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "revision",
                                    "key": "revision",
                                    "value": "1",
                                    "description": "The archived revision number."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns a single archived revision in full, including its `blob` and\n`triggers` snapshot."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 7, \"revision\": 1, \"name\": \"Sync orders\", \"description\": null, \"active\": true, \"blob_definition_version\": \"v0-draft\", \"blob\": {}, \"triggers\": [], \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T11:00:00Z\", \"archived_at\": \"2026-05-06T12:00:00Z\"}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Revision or workflow not found"
                        }
                    ]
                },
                {
                    "name": "Restore a workflow revision",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/revisions\/:revision\/restore",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/revisions\/:revision\/restore",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "revision",
                                    "key": "revision",
                                    "value": "1",
                                    "description": "The archived revision number to restore."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Re-applies the given archived revision's definition (`blob`,\n`blob_definition_version`, and `triggers`) to the workflow as a brand-new\nrevision. The current state is first snapshotted into the history, the\n`revision` counter is bumped, and a fresh bundle build is dispatched. The\nworkflow's `name`, `description`, `active` and `execution_mode` are left\nunchanged.\n\nRestoring a revision whose definition is identical to the current one is\na safe no-op for the `revision` counter (no new history row is written),\nthough triggers are still re-synced from the snapshot."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"name\": \"Sync orders\", \"revision\": 3, \"build_status\": \"pending\", \"blob\": {}, \"triggers\": []}",
                            "name": "Restored"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Revision or workflow not found"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Workflow Runs",
            "description": "\nTrigger and inspect executions of a workflow. Each run is handed off to\nthe workflow's dedicated Temporal worker, which orchestrates node\nexecution and streams status back.",
            "item": [
                {
                    "name": "List runs for a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/runs",
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number to retrieve (1-based). Defaults to 1. Must be at least 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "25",
                                    "description": "Number of runs per page (1\u2013100). Defaults to 25. Must be at least 1. Must not be greater than 100.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/runs?page=1&per_page=25",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns all runs for the workflow, newest first."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [], \"meta\": {\"current_page\": 1, \"per_page\": 25, \"total\": 0, \"last_page\": 1}}",
                            "name": "Success"
                        }
                    ]
                },
                {
                    "name": "Start a workflow run",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/runs",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/runs",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"trigger_payload\":{\"source\":\"api\"},\"trigger_handle\":\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",\"mode\":\"sync\"}"
                        },
                        "description": "Execution behavior depends on workflow `execution_mode` and optional\nrequest `mode`:\n\n- Async: starts the run and returns HTTP 202 with status `running`.\n- Sync: waits for worker completion and returns HTTP 200\/422\/504\/503\n  with the final outcome.\n\nFor `caller_decides`, omitting `mode` defaults to async execution."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"workflow_id\": 1, \"status\": \"completed\", \"result\": {\"node-1\": {\"ok\": true}}, \"completed_at\": \"2026-05-22T10:00:30Z\"}",
                            "name": "Sync completed"
                        },
                        {
                            "header": [],
                            "code": 202,
                            "body": "{\"id\": 1, \"workflow_id\": 1, \"status\": \"running\", \"temporal_workflow_id\": \"tenant:1:abc\", \"started_at\": \"2026-05-13T10:00:00Z\"}",
                            "name": "Accepted"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Workflow not found"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"Workflow does not allow sync execution (execution_mode=async_only).\"}",
                            "name": "Mode not allowed"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"Workflow execution failed.\", \"error\": \"node execution failed\", \"run\": {\"id\": 1, \"status\": \"failed\"}}",
                            "name": "Sync failed"
                        },
                        {
                            "header": [],
                            "code": 501,
                            "body": "{\"message\": \"Synchronous workflow execution is not supported by the configured run starter driver.\"}",
                            "name": "Sync not supported by starter"
                        },
                        {
                            "header": [],
                            "code": 503,
                            "body": "{\"message\": \"Workflow worker is unavailable.\"}",
                            "name": "Worker unavailable"
                        },
                        {
                            "header": [],
                            "code": 504,
                            "body": "{\"message\": \"Workflow execution timed out.\", \"error\": \"Sync run for workflow 1 exceeded timeout of 30 seconds.\"}",
                            "name": "Sync timeout"
                        }
                    ]
                },
                {
                    "name": "Get a workflow run",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/runs\/:runId",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/runs\/:runId",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "runId",
                                    "key": "runId",
                                    "value": "1",
                                    "description": "The run id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the current state of a workflow run. If the run is still\nin progress, the worker is polled for the latest Temporal status."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"workflow_id\": 1, \"status\": \"completed\", \"result\": {}, \"completed_at\": \"2026-05-13T10:01:00Z\"}",
                            "name": "Completed"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Get execution details for a workflow run",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/runs\/:runId\/details",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/runs\/:runId\/details",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "runId",
                                    "key": "runId",
                                    "value": "1",
                                    "description": "The run id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the execution description (status, timing, history length,\nparent linkage) via {@see WorkflowExecutionInspector}. The inspector\ntransparently routes between a live Temporal call and the local\nsnapshot taken when the run reached a terminal status; the response\ncarries a `source` field of `\"temporal\"` or `\"snapshot\"` so clients\nknow which view they are seeing."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"source\": \"temporal\", \"data\": {\"workflow_id\": \"tenant:1:abc\", \"run_id\": \"0190...\", \"status\": \"running\"}}",
                            "name": "Live"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"source\": \"snapshot\", \"data\": {\"workflow_id\": \"tenant:1:abc\", \"run_id\": \"0190...\", \"status\": \"completed\"}}",
                            "name": "Snapshot"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Run not found"
                        },
                        {
                            "header": [],
                            "code": 409,
                            "body": "{\"message\": \"Workflow run has no Temporal execution yet.\"}",
                            "name": "Run not handed off to Temporal yet"
                        },
                        {
                            "header": [],
                            "code": 410,
                            "body": "{\"message\": \"Workflow execution history is no longer available.\"}",
                            "name": "History unavailable"
                        },
                        {
                            "header": [],
                            "code": 503,
                            "body": "{\"message\": \"Temporal is currently unavailable.\"}",
                            "name": "Temporal unavailable"
                        }
                    ]
                },
                {
                    "name": "Get execution history for a workflow run",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/runs\/:runId\/history",
                            "query": [
                                {
                                    "key": "page_token",
                                    "value": "",
                                    "description": "Opaque continuation token returned by the previous page. Omit for the first page. Must not be greater than 8192 characters.",
                                    "disabled": true
                                },
                                {
                                    "key": "page_size",
                                    "value": "200",
                                    "description": "Maximum number of history events per page (1\u20131000). Defaults to the server-configured value. Must be at least 1. Must not be greater than 1000.",
                                    "disabled": false
                                }
                            ],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/runs\/:runId\/history?page_token=&page_size=200",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "runId",
                                    "key": "runId",
                                    "value": "1",
                                    "description": "The run id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns one page of history events via {@see WorkflowExecutionInspector}.\nLike the details endpoint, the response is hybrid-routed and carries\na `source` field. The `next_page_token` is opaque (source-tagged with\n`tmp:` or `snp:`); pass it verbatim to the next call. Note that\nswitching sources mid-pagination resets to page 1 (the response's\n`source` will change), which the client should treat as a fresh\npagination."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"source\": \"temporal\", \"data\": [{\"event_id\": 1, \"event_type\": \"workflow_execution_started\"}], \"next_page_token\": null}",
                            "name": "Live page"
                        },
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"source\": \"snapshot\", \"data\": [{\"event_id\": 1}], \"next_page_token\": null}",
                            "name": "Snapshot page"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Run not found"
                        },
                        {
                            "header": [],
                            "code": 409,
                            "body": "{\"message\": \"Workflow run has no Temporal execution yet.\"}",
                            "name": "Run not handed off to Temporal yet"
                        },
                        {
                            "header": [],
                            "code": 410,
                            "body": "{\"message\": \"Workflow execution history is no longer available.\"}",
                            "name": "History unavailable"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"Invalid page_token.\"}",
                            "name": "Invalid page token"
                        },
                        {
                            "header": [],
                            "code": 503,
                            "body": "{\"message\": \"Temporal is currently unavailable.\"}",
                            "name": "Temporal unavailable"
                        }
                    ]
                },
                {
                    "name": "Get the current call stack of a running workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:workflowId\/runs\/:runId\/stack-trace",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:workflowId\/runs\/:runId\/stack-trace",
                            "variable": [
                                {
                                    "id": "workflowId",
                                    "key": "workflowId",
                                    "value": "1",
                                    "description": "The workflow id."
                                },
                                {
                                    "id": "runId",
                                    "key": "runId",
                                    "value": "1",
                                    "description": "The run id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Issues the built-in `__stack_trace` query against the workflow worker\nand returns the formatted stack trace as plain text. Only meaningful\nwhile the run is still executing; terminal runs return 409."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"stack_trace\": \"coroutine ...\"}",
                            "name": "Running"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Run not found"
                        },
                        {
                            "header": [],
                            "code": 409,
                            "body": "{\"message\": \"Workflow run has no Temporal execution yet.\"}",
                            "name": "Run not handed off to Temporal yet"
                        },
                        {
                            "header": [],
                            "code": 409,
                            "body": "{\"message\": \"Workflow run is no longer running.\"}",
                            "name": "Run is no longer running"
                        },
                        {
                            "header": [],
                            "code": 410,
                            "body": "{\"message\": \"Workflow execution history is no longer available.\"}",
                            "name": "Execution unknown to Temporal"
                        },
                        {
                            "header": [],
                            "code": 503,
                            "body": "{\"message\": \"Temporal is currently unavailable.\"}",
                            "name": "Temporal unavailable"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Workflows",
            "description": "\nPer-tenant workflow definitions. Every endpoint is scoped to the tenant\nresolved by the `resolve.tenant` middleware (from the JWT or\n`X-Tenant-Id` header). Cross-tenant access deliberately returns 404 so\nthat the API does not leak the existence of resources owned by other\ntenants.",
            "item": [
                {
                    "name": "List workflows",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows"
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns the workflows owned by the current tenant, ordered by name."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"data\": [{\"id\": 1, \"name\": \"Sync orders\", \"description\": null, \"blob_definition_version\": \"v0-draft\", \"blob\": {}, \"active\": true, \"revision\": 1, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}]}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 401,
                            "body": "{\"message\": \"Unauthenticated.\"}",
                            "name": "Missing or invalid token"
                        }
                    ]
                },
                {
                    "name": "Create a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows"
                        },
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"name\":\"Sync orders nightly\",\"description\":\"Pulls orders from the upstream API every night at 02:00 UTC.\",\"blob_definition_version\":\"v0-draft\",\"blob\":{\"nodes\":[],\"edges\":[]},\"active\":true,\"execution_mode\":\"async_only\",\"triggers\":[{\"handle\":\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",\"type\":\"architecto\",\"name\":\"architecto\",\"active\":true}]}"
                        },
                        "description": "Persists a new workflow under the current tenant. The `name` must be\nunique within the tenant. The `blob` is validated against the schema\nregistered for the supplied `blob_definition_version`."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 201,
                            "body": "{\"id\": 1, \"name\": \"Sync orders\", \"description\": null, \"blob_definition_version\": \"v0-draft\", \"blob\": {}, \"active\": true, \"revision\": 1, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}",
                            "name": "Created"
                        },
                        {
                            "header": [],
                            "code": 422,
                            "body": "{\"message\": \"The given data was invalid.\", \"errors\": {\"blob_definition_version\": [\"...\"]}}",
                            "name": "Validation failed"
                        }
                    ]
                },
                {
                    "name": "Show a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "GET",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Returns a single workflow by id within the current tenant."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"name\": \"Sync orders\", \"description\": null, \"blob_definition_version\": \"v0-draft\", \"blob\": {}, \"active\": true, \"revision\": 1, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T10:00:00Z\"}",
                            "name": "Success"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Replace a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": {
                            "mode": "raw",
                            "raw": "{\"name\":\"Sync orders nightly\",\"description\":\"Pulls orders from the upstream API every night at 02:00 UTC.\",\"blob_definition_version\":\"v0-draft\",\"blob\":{\"nodes\":[],\"edges\":[]},\"active\":true,\"execution_mode\":\"async_only\",\"triggers\":[{\"handle\":\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",\"type\":\"architecto\",\"name\":\"architecto\",\"active\":false}]}"
                        },
                        "description": "Performs a full-replace update of the workflow with the given id. All\ndomain fields are required. The `revision` counter is incremented\nexactly when the supplied `blob` differs from the stored one, in which\ncase the previous revision is snapshotted into the workflow history."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 200,
                            "body": "{\"id\": 1, \"name\": \"Sync orders\", \"description\": null, \"blob_definition_version\": \"v0-draft\", \"blob\": {}, \"active\": true, \"revision\": 2, \"created_at\": \"2026-05-06T10:00:00Z\", \"updated_at\": \"2026-05-06T11:00:00Z\"}",
                            "name": "Updated"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                },
                {
                    "name": "Delete a workflow",
                    "request": {
                        "url": {
                            "host": "{{baseUrl}}",
                            "path": "api\/v1\/workflows\/:id",
                            "query": [],
                            "raw": "{{baseUrl}}\/api\/v1\/workflows\/:id",
                            "variable": [
                                {
                                    "id": "id",
                                    "key": "id",
                                    "value": "1",
                                    "description": "The workflow id."
                                }
                            ]
                        },
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application\/json"
                            },
                            {
                                "key": "Accept",
                                "value": "application\/json"
                            },
                            {
                                "key": "X-Tenant-Id",
                                "value": "acme-production"
                            }
                        ],
                        "body": null,
                        "description": "Removes the workflow identified by `{id}` for the current tenant.\nAssociated history rows are removed via cascade."
                    },
                    "response": [
                        {
                            "header": [],
                            "code": 204,
                            "body": "",
                            "name": "Deleted"
                        },
                        {
                            "header": [],
                            "code": 404,
                            "body": "{\"message\": \"Not found.\"}",
                            "name": "Not found"
                        }
                    ]
                }
            ]
        }
    ],
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "Authorization",
                "type": "string"
            }
        ]
    }
}