smsapi.pl/php-client
Official PHP client for SMSAPI.pl for sending SMS, MMS and VMS messages, managing contacts, groups, templates and sender names, with bulk sending, delivery reports and easy Laravel integration.
The package is a first-party PHP SDK for SMSAPI.pl, a Polish SMS/MMS gateway, intended to wrap REST communication with the provider into typed client objects. It is a library rather than a framework component: there is no service provider, no configuration file, no facade, and no Laravel-specific integration surface. For a Laravel codebase this means adoption is a thin wrapper exercise — you construct the client with credentials and call it from a job, notification channel, or service class. That is architecturally clean and keeps vendor code at the edge of the domain, but it also means the package contributes no Laravel idioms (no queue-aware transport, no event hooks, no config publishing), so the team owns the glue.
Integration feasibility is high where SMSAPI.pl is already the chosen provider. Composer install is straightforward, the API surface is conventional (contacts, groups, messages, senders, short URLs), and the operations map onto the typical notification use cases: transactional sends, bulk campaigns, delivery status polling, and inbound message retrieval. The dependency tree is small — largely a PSR HTTP client and PSR-7/PSR-18 abstractions — which means low collision risk in an existing vendor/ graph and reasonably simple auditing. The absence of Laravel coupling also means it will not fight the framework's container or config lifecycle.
The technical risks are concentrated in three places. First, licensing: the repository declares NOASSERTION, which is a licence-detection failure rather than a clean permissive grant. Before this enters a commercial codebase, legal needs the actual licence text confirmed — a package that cannot state its terms is a procurement blocker, not a code-quality nit. Second, health signals are weak: 66 stars and zero dependents indicate a narrowly-used SDK whose real-world exposure is mostly the vendor's own customers. That is not disqualifying for a provider-published client — the vendor maintains it precisely because their business depends on it — but it means community troubleshooting is thin and you should expect to read the source rather than find answers on Stack Overflow. Third, the stated last release date of 2026-04-09 warrants verification; if that is accurate it suggests active maintenance, if it is metadata noise it should not be used to justify a confidence claim. Note also that the package is Poland-focused: sender-name registration, message content, and regulatory expectations (Polish/EU marketing-consent rules) carry locality assumptions that will not transfer if the product later expands to other markets.
Key questions to resolve before proceeding: What is the actual licence, and does it permit closed-source commercial use and redistribution in a Docker image? Does the client expose delivery-report/status callbacks or only synchronous send responses, and does it support the async/bulk endpoints we would need at volume? How are errors surfaced — typed exceptions versus raw HTTP responses — and can we distinguish retryable from terminal failures? Does it support HTTP client injection (PSR-18) so we can route through our existing Guzzle middleware for logging, tracing, and timeouts? Is there a documented rate-limit and a bulk-send path, or must we throttle ourselves? And critically: is SMSAPI.pl a provider we are already contracted with, or is this evaluation implicitly a provider-selection decision? If the latter, the SDK's quality is secondary to the vendor's pricing, deliverability, and coverage.
Stack fit is good if the target application is PHP 8.x on Laravel 10/11/12. The package imposes no framework-version constraints of its own, so the effective compatibility question is its PHP floor and its PSR dependency versions against whatever your composer.lock already pins. Run composer why-not on the candidate version against the current lockfile before anything else; a PSR-7 major-version disagreement is the most likely friction and is usually resolvable but can cascade.
The natural integration shape is a small adapter layer owned by the application, not direct SDK calls scattered through controllers. Concretely: a SmsProvider interface in the domain, an SmsapiProvider implementation that wraps the vendor client, a dedicated config entry fed from environment variables, and the client bound as a singleton in a service provider. Wrap sends in a queued job with retry and backoff policy so that provider latency never sits in a request cycle. Add a Laravel notification channel if SMS is a first-class user-facing concern, which gives you a clean via() surface and keeps the vendor type out of your models. Persist an outbound message record with the provider's message ID so delivery callbacks or status polls can be reconciled later — this is the piece teams most often skip and most often regret.
Migration path is short because there is nothing to migrate. There is no existing Laravel binding to replace, no config to publish, no published assets. The realistic sequencing is: (1) confirm licence, (2) spike a single transactional send in a throwaway branch against a sandbox account, (3) validate error taxonomy and timeout behaviour by deliberately sending to an invalid number and a bad credential, (4) build the adapter and queue job, (5) add delivery-status reconciliation, (6) only then migrate real traffic. Steps 1 and 2 are cheap and should gate everything after them — do not let a licence unknown reach a production dependency graph.
Compatibility caveats worth sequencing early: confirm the SDK's HTTP transport can be swapped or at least configured with your own client instance, since corporate egress often requires proxy settings and per-service timeouts that a hardcoded transport will not respect. Confirm timezone and encoding handling for Polish diacritics in message bodies and sender names, and confirm whether the account's default sender name must be pre-registered with the provider — an unregistered sender failing at 2am is a classic launch-week incident. If the application must eventually support multiple SMS providers, define the adapter interface now even if only one implementation exists; retrofitting provider abstraction after the vendor types have leaked into twenty call sites is the expensive version of this work.
Maintenance burden is low-to-moderate but concentrated in the adapter, not the package. The SDK itself changes on the vendor's schedule; because it is first-party, breaking changes are usually documented and infrequent, but they arrive without a Laravel-style deprecation runway. Pin the version, read the changelog on bumps, and treat the adapter as the only place that needs to change when the vendor's surface shifts. Budget a recurring review — quarterly is proportionate — to check for a newer release and confirm the package is still maintained rather than abandoned. The NOASSERTION licence should be re-checked on major upgrades in case the vendor formalises terms.
Support is the weakest dimension. Sixty-six stars and zero dependents means effectively no community; your escalation path is SMSAPI's own support desk, which is fine for account and deliverability issues and less fine for SDK-level bugs. Expect to debug from source. That is acceptable given the codebase is small, but it should be an explicit expectation set with whoever carries the pager, not a surprise at the first failure.
Scaling is a vendor-capacity question more than a code question. The SDK will not be your bottleneck; throughput is governed by SMSAPI's rate limits and your account tier. Design for bulk sends as batched queued jobs with concurrency caps you control, so you can tune pressure without redeploying. Two failure modes dominate. First, partial failure in bulk sends — the SDK will not make a hundred-message batch atomic, so the job must be idempotent per message and record per-message outcomes, otherwise a retry double-sends and burns budget while annoying recipients. Second, ambiguous timeouts: a send that times out on the client may still have been accepted by the provider, and without idempotency keys or a reconciliation pass against message IDs you cannot tell success from failure. Treat every send as at-least-once and make downstream effects safe to repeat. Secondary modes: credential rotation causing silent 401s (alert on auth failures explicitly rather than on generic error rate), sender-name rejection at launch, and cost drift from retry storms — cap retries and set a daily spend alert on the account, not just a metric dashboards nobody watches.
Ramp-up is genuinely quick for a mid-level Laravel developer: the SDK is a thin HTTP wrapper with conventional nouns, so a competent engineer can send a message within an hour and have a production-grade queued path with reconciliation in two to three days. The non-obvious work is the surrounding discipline — idempotency, status reconciliation, cost guardrails, credential handling — not the integration. Plan the onboarding around those concerns; the SDK will not teach them, and a naive integration that merely works in staging will pass review and fail in production.
How can I help you explore Laravel packages today?