Internalize runs multi-step HTTP checks against your API on a schedule, and pages you when one fails.

A flow is a list of requests, for example log in, create an order, pay and clean up, with checks on each response. We run it every few minutes from our regions, or a runner inside your network runs it. When a check fails you see the request, the response body and the check that broke, and the incident shows up on your status page.

Start free Compare plans The Starter plan is free: 2 flows, each run at most once every hour.
A failing run of the flow Card payment end-to-end. Step 3, POST /v1/payment_intents/capture, returned 502; the expected status was 201 and the response took 8114 ms.
A failing run in the app. Step 3 of a payment flow got a 502 after 8 seconds. The panel on the right shows the open incident and where alerts go.

What a flow is

Each step is an HTTP request. A step can use values captured from earlier steps and check what comes back. You build flows in the editor or import them from cURL, Postman or OpenAPI, and you can export any flow as JSON. This is one, exported and trimmed to two steps.

{
  "version": 1,
  "flow": {
    "name": "Card payment end-to-end",
    "schedule": "*/5 * * * *",
    "steps": [
      {
        "name": "Create a payment intent",
        "method": "POST",
        "url": "{{env.BASE_URL}}/v1/payment_intents",
        "headers": { "Authorization": "Bearer {{env.API_KEY}}" },
        "body": "{\"amount\": 4900, \"currency\": \"NOK\"}",
        "captures": [{ "name": "intent_id", "path": "id" }],
        "assertions": [{ "type": "status_code", "expected": 201 }]
      },
      {
        "name": "Capture the payment",
        "method": "POST",
        "url": "{{env.BASE_URL}}/v1/payment_intents/{{captures.intent_id}}/capture",
        "assertions": [
          { "type": "status_code", "expected": 201 },
          { "type": "response_time", "maxMs": 2000 },
          { "type": "condition", "left": "{{response.body.status}}",
            "operator": "equals", "right": "succeeded" }
        ]
      }
    ]
  }
}
  • Checks the status code, the response time, or any value in the body. A failed check shows what it expected and what came back.
  • Runs from our regions or from your own. The self-hosted runner connects out over a WebSocket, so it reaches services with no public address.
  • You decide when to be alerted: after a number of failed runs in a row, or when an SLO burns too fast. Alerts go out by email, Slack, Discord or webhook, and escalate if nobody acknowledges them.
  • Link a flow to a status page component, and its incident opens and closes with the flow.
  • Cron jobs get the same treatment. Your job calls a URL when it finishes, and a late call raises an alert.

Pricing

Pay monthly or yearly. Self-hosted runners come with Enterprise.

PlanFlowsSteps per flowCron monitorsShortest intervalRun historyPriceChoose
Starter2311 h24 hoursFreeStart free
Hobby10585 min7 daysLoadingChoose Hobby
Pro10015501 min30 daysLoadingChoose Pro
EnterpriseUnlimitedUnlimitedUnlimited30 s90 daysAsk usEmail sales