mittwald/api-client
PHP client for the mittwald API, generated from its OpenAPI specification. It offers typed request and response models plus PSR-18 HTTP integration, making it easy to automate mittwald hosting resources such as projects, apps, domains, and databases from PHP or Laravel.
Architecture fit. mittwald/api-client is a transport-layer SDK, not a domain library. It maps 1:1 to the mStudio v2 API surface and gives you typed request/response objects and an HTTP transport. That makes it a good fit only in one place: an adapter at the edge of your application, behind an interface your domain owns. Any design where controllers, jobs, or models call the generated client directly will couple your business logic to mittwald's resource model and API version — and that coupling is expensive to unwind when the API changes. There is no Laravel-native packaging here: no service provider, no config publishing, no facade, no queue or event integration, no cache layer. That is not a defect, but it means the framework glue is your build, not theirs.
Integration feasibility. Mechanically this is a low-effort integration: Composer install, construct the client with an authenticated HTTP transport, call methods. The real cost sits in four places:
Technical risk. The dominant risk is not code quality — it is dependency surface and signal. Three stars and zero dependents means no community validation, no StackOverflow corpus, no third-party bug reports to learn from, and effectively a bus factor of the vendor's release process. If mittwald maintains it as an official artifact, that is acceptable; if it is a side project, it is not. Secondary risks: generated-client churn across API revisions, unknown PSR-18/PSR-7 and Guzzle major-version constraints that may conflict with Laravel's HTTP client stack, and undocumented rate limits that only surface under production provisioning load. The release metadata (a 2026-10-26 date) should be verified before you build a pinning policy around it.
Key questions.
Illuminate\Http\Client via a PSR-18 adapter, or does it hard-wire Guzzle?Stack fit. Assumes a Laravel/PHP service where mittwald is a supporting system — hosting, projects, domains, mail, databases — rather than the core domain. The correct shape is:
MittwaldClientInterface in your application layer with methods expressed in your language (provisionProject, listDomains), not theirs.mittwald/api-client, owns retries, logging, and error translation.config/mittwald.php and env-based credentials.Keep the generated client out of your composer.json autoload-consumer surface — nothing outside the adapter namespace should use it.
Migration path. There is no incremental migration to speak of. If you are already on mittwald and integrating manually via raw HTTP, this package is a drop-in replacement for that code, and the migration is: replace the hand-rolled curl/Guzzle calls with the adapter, keep your existing error handling contract, run both in parallel behind a flag for one release. If you are greenfield on mittwald, skip migration and go straight to the adapter — do not build raw HTTP first "to learn the API," because you will build the same wrapper twice.
Compatibility. Verify against your matrix before committing: PHP version constraint vs. your runtime, Guzzle/PSR-18 version vs. what Laravel 10/11/12 pulls in, and any transitive dependency on php-http/* or symfony/http-client. Also confirm the package does not require a specific PHP extension (curl vs. streams) that differs from your container baseline. Lock the package and run a dependency-resolution check in CI so an upstream minor bump cannot silently change transport behaviour.
Sequencing.
MittwaldClientInterface from your requirements, not from the SDK's method list. This is the decision that determines long-term cost.Maintenance. Low ongoing code maintenance — the adapter is thin and stable. The recurring cost is version tracking: regenerated clients can change method signatures, nullable fields, and enum values without a corresponding change in your code. Budget a recurring review of upstream releases each cycle, plus a pinned-version upgrade task with a sandbox run before merge. If the package goes quiet for two quarters, you need a documented fallback: generate your own client from the OpenAPI spec, which is a contained piece of work precisely because you built the adapter.
Support. This is the weakest dimension. With three stars and zero dependents there is no community to triage issues, no established patterns to copy, and no collective memory of gotchas. Escalation is to mittwald's own support channel or an empty issue tracker. If the integration is business-critical, get a named contact and a written statement of support scope before proceeding; if you cannot, treat the package as unsupported third-party code and own the risk explicitly.
Scaling. As an HTTP client, it is not a throughput bottleneck in itself — your limits are mittwald's rate limits, per-token concurrency, and network latency to their endpoints, typically 100–500ms per call. That means: never call it synchronously in a user request path if you can queue it, batch list operations where the API allows, and put a shared rate limiter (Laravel's RateLimiter, Redis-backed) in front of the adapter so parallel workers cannot collectively blow the quota. Watch for N+1 patterns in list-then-detail flows, which generated clients make easy to write.
Failure modes.
Ramp-up. The SDK itself is a half-day to learn. The real ramp is the mittwald domain model — projects, virtual hosts, domains, mail addresses, and how they relate — plus your adapter's error semantics. Budget one engineer for a week to production-ready, and write the adapter's usage guide as you go so the second engineer does not have to reverse-engineer it. Because the surrounding community is empty, that internal documentation is the only onboarding material you will have.
How can I help you explore Laravel packages today?