Requizon

Boring Observability  ·  Laravel package

See every call your app makes out.

The other half of your traffic.

You have a dashboard for the requests coming in. Requizon is the one for the requests going out — every third-party API your application depends on, with duration, status, failure classification and the response body of anything that broke. In your own database.

Http::tracked('stripe')->post($url, $payload);

That is the whole integration. Everything else about the request stays the same.

See what it records → $19/yr on the waitlist, $29.99 after

Waitlist — open now · Early access — September 2026

Requizon · /requizon

Outbound HTTP

API Host Total Success Avg Failures
stripe api.stripe.com 18,379 100% 639 ms 0 Paths Requests
postmark api.postmarkapp.com 4,102 99.9% 214 ms 3 Paths Requests
sedna api.sedna.example 812 91.4% 1,240 ms 70 Paths Requests
nausys ws.nausys.com 3 100% 362 ms 0 Paths Requests
Http::tracked()

One call opts a client in. No middleware to wire, no code to restructure.

/requizon

Its own routes, views and assets — shaped exactly like Horizon.

2 tables

Detail rows and their hourly rollup, in your own MySQL database.

0 egress

No agent, no third-party account, nothing leaving your servers.

Guarantee

Recording never breaks the call it observes. Anything that goes wrong inside the recorder is reported through your application's exception handler and then swallowed — instrumentation cannot take down the integration it is watching.

[ what it records ]

Enough to answer "was it us or was it them?"

Every outbound integration is a dependency you do not control and cannot see. Requizon makes it legible — which API, which path, how slow, how often it fails, and what it said when it did.

Grouped by the API, not the URL

You name the integration when you opt it in, and the dashboard rolls up under that name — then down to host, path and the individual calls.

Three kinds of failure, told apart

A connection that never landed, an HTTP 4xx/5xx, and a 200 carrying an error are three different problems. Requizon labels each one instead of counting them all as "errors".

Catch the 200 OK that isn't

Plenty of APIs answer 200 with the failure in the body. Pass a one-line callback and those calls are recorded as application errors, with the message the API actually gave you.

The failing response, kept

Every failed call stores the response body next to it. You debug the payload the API really sent, at the timestamp it sent it — not a summary of it.

Credentials redacted before storage

Parameters whose name looks like a secret are written as ***. A body Requizon cannot parse into named parameters is stored by shape only, because it cannot find the credentials inside it.

Hourly rollups, not table scans

Calls are aggregated every five minutes into hourly buckets keyed by API, host and path, and the dashboard reads its window — 24 hours, 72, a week, a fortnight — straight off those. It costs the same at three thousand calls a day and at three million.

Retention that bounds itself

Detail rows are pruned after 14 days and aggregates after a year, on a schedule Requizon registers for you. The tables stay a fixed size instead of growing forever.

Gated exactly like Horizon

Access runs through a viewRequizon gate you define. Until you do, the dashboard answers only in the local environment — a forgotten install cannot expose your outbound traffic.

Your database. Your servers.

Requizon is a Laravel package writing to two tables in your own MySQL. No agent, no third-party account, and not one byte of your traffic leaves your infrastructure.

[ opt in, one client at a time ]

Swap Http:: for Http::tracked().

Requizon registers one macro. Name the API you are calling and that client's requests are recorded — the timeout, headers, retries and everything else about the call are untouched, because it is the same Laravel HTTP client underneath.

  • Recording rides on Guzzle's on_stats hook, which fires once per transfer
  • It fires for connection failures too — where there is no response to inspect at all
  • Nothing is recorded that you did not opt in, so noisy internal calls stay out of the table
app/Services/SednaClient.php
// Before — a call you cannot see.
Http::timeout(30)
    ->post($url, $payload);

// After — recorded under the API name "sedna".
Http::tracked('sedna')
    ->timeout(30)
    ->post($url, $payload);
200 OK, with the failure in the body
// The API answers 200 and puts the error in the payload.
Http::tracked('sedna', fn ($body) => $body['errorMessage'] ?? null)
    ->get($url);

// Recorded as:
//   failure_type    application_error
//   failure_message "Charter not available for these dates"
//   status_code     200

[ the failures a status code hides ]

Not every failure has the decency to be a 500.

A depressing number of APIs answer 200 OK with the real answer buried in the body. Pass a second argument and those calls are classified as application_error, with the message the API actually gave you — so a 100% success rate means what it says.

  • The callback receives a decoded array for JSON responses, the raw string otherwise
  • Return a non-empty string to mark it a failure; return null for success
  • The response stream is rewound afterwards, so your own $response->body() still works

[ your data, on your terms ]

What it stores — and what it refuses to.

An outbound-traffic recorder sits exactly where your credentials are. Requizon is built on the assumption that you would rather it stored too little than too much.

Recorded

  • The API name you gave it, the method, the host
  • The path, normalized — /orders/:id, not 40,000 distinct URLs
  • Status code and duration, to the millisecond
  • Failure type and the message behind it
  • Request parameters, with credentials redacted
  • The full response body of anything that failed

Redacted

  • Any parameter whose name contains pass, secret, token, apikey, api_key or auth
  • Parameters named exactly p, l or pwd — the abbreviations some APIs still use
  • Both lists are yours to extend in config/requizon.php
"api_key": "***", "_unparsed": "application/xml, 1482 bytes"

Redaction works by parameter name, so a body Requizon cannot parse into named parameters — XML, SOAP, text/plain — is one whose credentials it cannot find. It stores the shape and nothing else, unless you tell it otherwise.

Worth knowing

The response body of a failed call is stored as-is, with no redaction — that is the point of it. An API that echoes your credentials back, or a 401 from a token endpoint, will put them in http_requests for as long as your detail retention allows. Keep that window short and treat the table as sensitive. We would rather tell you this on the landing page than in an incident review.

Stop guessing which vendor is having a bad day.

Join the waitlist and pay $19/yr instead of $29.99 — for as long as your subscription stays active.

One email to confirm, then only when Requizon opens. No spam, unsubscribe anytime.

[ installed in three steps ]

A composer require and a migration.

Requizon is deliberately shaped like Horizon: its own routes, its own views and assets, and access controlled by a gate you define.

  1. 01

    Authenticate Composer

    Point Composer at the private registry with your license key.

    composer config --global \
      --auth http-basic.requizon.composer.sh \
      you@example.com YOUR-LICENSE-KEY
  2. 02

    Require & migrate

    Pull in the package and create the two tables it reads and writes.

    composer require boring-o11y/requizon
    php artisan migrate
  3. 03

    Publish & gate it

    Publish the provider, then narrow the gate to whoever should see the dashboard.

    php artisan vendor:publish \
      --tag=requizon-provider
app/Providers/RequizonServiceProvider.php
class RequizonServiceProvider extends RequizonApplicationServiceProvider
{
    protected function gate(): void
    {
        Gate::define('viewRequizon', fn ($user) => $user->hasRole('administrator'));
    }
}

Until that gate exists, the dashboard answers only in the local environment — a forgotten install does not expose your outbound traffic in production.

PHP 8.2+ · Laravel 12 or 13 · MySQL 8.0.20+

[ pricing ]

One plan. The waitlist price is lower, permanently.

Sign up before Requizon opens and keep the waitlist rate for as long as your subscription stays active — not for a first year, not until we change our minds.

Save $10.99

Waitlist price

$19 / year
per app

$29.99 / year once it opens — waitlist sign-ups keep $19.

  • Your license key the moment Requizon opens
  • Every feature — no tiers, no per-call metering
  • Runs on your own servers, against your own database
  • A direct line to the makers and real roadmap influence
Lock in $19 / year

No charge today — early access opens September 2026.

[ answers ]

Frequently asked questions

What is Requizon?

+

Requizon is a Laravel package that gives you a dashboard for your application's outbound HTTP traffic. It records every call you opt into tracking — duration, status, failure classification, redacted request parameters, and the response body of anything that failed — rolls it up into hourly buckets, and serves a self-contained UI at /requizon. It is made by Boring Observability, who also make Laravel Skyline.

How does Requizon record outbound HTTP calls?

+

Requizon registers an Http::tracked() macro. Use it in place of Http:: on the clients you want recorded and pass a name for the API — for example Http::tracked('stripe')->post($url, $payload). Everything else about the request stays exactly the same. Recording rides on Guzzle's on_stats hook, which fires once per transfer, after the response is in hand, and also fires when the connection fails outright and there is no response at all.

Will Requizon slow down or break my HTTP calls?

+

No. Recording happens after the transfer completes, and every failure inside the recorder is reported through your application's exception handler and then swallowed — an instrumentation problem can never break the call it is observing. The write is a single insert; the aggregation that makes the dashboard fast runs out of band on the scheduler.

Does Requizon send my data anywhere?

+

No. Requizon is a package running inside your application, writing to two tables in your own database, and serving its own dashboard from your own domain. There is no agent, no SaaS account and no egress. That is also what makes it usable on traffic you are contractually not allowed to ship to a third party.

What counts as a failure?

+

Three things, recorded distinctly. A connection_error is a transfer that never produced a response at all — DNS, TLS, timeout. An http_error is any response with a status of 400 or above. An application_error is a successful HTTP response that your own callback classified as a failure, which is how you catch APIs that answer 200 OK with the error in the body.

Does Requizon store credentials?

+

It tries hard not to. Request parameters whose name contains pass, secret, token, apikey, api_key or auth, and those named exactly p, l or pwd, are stored as ***; both lists are configurable. A request body Requizon cannot parse into named parameters — XML, SOAP, text/plain — is recorded by shape only, because redaction works by parameter name. The one thing to know: the response body of a failed call is stored as-is, so a 401 from a token endpoint that echoes your credentials will land in the table. Keep detail retention short and treat the table as sensitive.

How is Requizon different from Telescope or an APM?

+

Telescope records everything in development and is not meant to be left on in production. An APM watches the requests coming in and needs an agent and data egress to do it. Requizon is narrow on purpose: the outbound calls you explicitly opted in, aggregated so it stays cheap at production volume, kept in your own database. Pair it with your APM — they tell you the request was slow, Requizon tells you which vendor made it slow.

What does Requizon require?

+

PHP 8.2 or newer, Laravel 12 or 13, and MySQL 8.0.20+ (or a compatible MariaDB) — the hourly rollup uses INSERT ... ON DUPLICATE KEY UPDATE with row aliases, and the aggregate command fails with a clear message on any other driver.

How long is the data kept?

+

By default, individual request rows for 14 days and hourly aggregates for a year. Both are pruned daily by a command Requizon schedules for you, and both retention windows are configurable. Re-aggregating a window is idempotent, so overlapping runs are safe.

How much does Requizon cost?

+

Requizon is $29.99 per year, per application, sold as an annual subscription. Everyone on the waitlist gets it for $19 per year and keeps that price for as long as their subscription stays active. Nothing is charged today — the waitlist opens into early access in September 2026.

Who can see the dashboard?

+

Whoever your viewRequizon gate says can. You publish a service provider, define the gate against your own roles or user check, and Requizon consults it on every dashboard request. Until that gate exists the dashboard is reachable only in the local environment.

[ waitlist ]

Get in before the price goes up.

Requizon isn't public yet. Leave your email and we'll send your invitation and license key the moment it opens — at $19 a year rather than $29.99.

Waitlist

Open now

Locks in $19/yr, for as long as you stay subscribed.

Early access

September 2026

Invites roll out to the list first.

One email to confirm, then only when Requizon opens. No spam, unsubscribe anytime.

Have questions before you commit? Contact us →

Before you sign up

How much does Requizon cost?

+

Requizon is $29.99 per year, per application, sold as an annual subscription. Everyone on the waitlist gets it for $19 per year and keeps that price for as long as their subscription stays active. Nothing is charged today — the waitlist opens into early access in September 2026.

Does Requizon send my data anywhere?

+

No. Requizon is a package running inside your application, writing to two tables in your own database, and serving its own dashboard from your own domain. There is no agent, no SaaS account and no egress. That is also what makes it usable on traffic you are contractually not allowed to ship to a third party.

What does Requizon require?

+

PHP 8.2 or newer, Laravel 12 or 13, and MySQL 8.0.20+ (or a compatible MariaDB) — the hourly rollup uses INSERT ... ON DUPLICATE KEY UPDATE with row aliases, and the aggregate command fails with a clear message on any other driver.

More in the full FAQ.