lai3221 / aspire-laravel-sdk
Laravel 11 SDK for the Aspire API, covering sandbox and production environments.
Requires
- php: ^8.2
- illuminate/contracts: ^11.0|^12.0
- illuminate/http: ^11.0|^12.0
- illuminate/support: ^11.0|^12.0
Requires (Dev)
- laravel/pint: ^1.18
- mockery/mockery: ^1.6
- orchestra/testbench: ^9.0|^10.0
- phpunit/phpunit: ^10.5|^11.0
README
A Laravel 11 friendly SDK for Aspire's REST APIs. It supports sandbox and production environments, API-key and bearer-token authentication, typed resources, webhook verification, and an editable endpoint map for partner-specific Swagger/OpenAPI paths.
Important: Aspire may provide partner-specific API routes in Swagger during onboarding. This package keeps all endpoint paths in
config/aspire.php, so you can adjust paths without changing application code.
Installation
composer require aspireapp/aspire-laravel-sdk php artisan vendor:publish --tag=aspire-config
Environment
ASPIRE_ENVIRONMENT=sandbox ASPIRE_SANDBOX_BASE_URL=https://sandbox-api.aspireapp.com ASPIRE_PRODUCTION_BASE_URL=https://api.aspireapp.com ASPIRE_API_VERSION=v1 ASPIRE_CLIENT_ID=your-client-id ASPIRE_CLIENT_SECRET=your-client-secret ASPIRE_API_KEY=your-api-key ASPIRE_ACCESS_TOKEN=your-oauth-access-token ASPIRE_PROXY_URL=socks5h://username:password@127.0.0.1:1080 ASPIRE_WEBHOOK_SECRET=your-webhook-secret
Switch to production by setting:
ASPIRE_ENVIRONMENT=production
If Aspire gives you a region-specific or account-specific host, set:
ASPIRE_BASE_URL=https://your-onboarded-host.example
Quick start
use Aspire\Sdk\Facades\Aspire; $accounts = Aspire::accounts()->list(); $balances = Aspire::accounts()->balances('account_id'); $payout = Aspire::payouts()->create([ 'source_account_id' => 'account_id', 'recipient_id' => 'recipient_id', 'amount' => 10000, 'currency' => 'SGD', 'reference' => 'INV-1001', ]);
OAuth
$url = Aspire::oauth()->authorizationUrl( redirectUri: route('aspire.callback'), scopes: ['accounts.read', 'transactions.read', 'payouts.write'] ); $token = Aspire::oauth()->token($request->get('code'), route('aspire.callback')); $refreshed = Aspire::oauth()->refresh($token['refresh_token']);
Resources
Accounts
Aspire::accounts()->list(['currency' => 'SGD']); Aspire::accounts()->retrieve('account_id'); Aspire::accounts()->balances('account_id'); Aspire::accounts()->details('account_id');
Transactions and bank feeds
Aspire::transactions()->list(['from' => '2026-01-01', 'to' => '2026-01-31']); Aspire::transactions()->retrieve('transaction_id'); Aspire::bankFeeds()->accounts(); Aspire::bankFeeds()->transactions(['account_id' => 'account_id']); Aspire::bankFeeds()->sync(['account_id' => 'account_id']);
Recipients and payouts
Aspire::recipients()->create([...]); Aspire::recipients()->validate([...]); Aspire::payouts()->quote([...]); Aspire::payouts()->create([...]); Aspire::payouts()->bulkCreate(['items' => [[...], [...]]]); Aspire::payouts()->cancel('payout_id'); Aspire::payouts()->paymentLink([...]);
FX
Aspire::fx()->quote([ 'source_currency' => 'SGD', 'target_currency' => 'USD', 'source_amount' => 10000, ]); Aspire::fx()->convert(['quote_id' => 'quote_id']);
Cards and users
Aspire::users()->create([...]); Aspire::cards()->create([...]); Aspire::cards()->freeze('card_id'); Aspire::cards()->unfreeze('card_id'); Aspire::cards()->updateLimits('card_id', [...]); Aspire::cards()->transactions('card_id');
Account opening
Aspire::accountOpening()->createApplication([...]); Aspire::accountOpening()->updateApplication('application_id', [...]); Aspire::accountOpening()->uploadDocument('application_id', [...]); Aspire::accountOpening()->submitApplication('application_id');
Webhooks
$payload = $request->getContent(); $signature = $request->header(config('aspire.webhook.signature_header')); $timestamp = $request->header(config('aspire.webhook.timestamp_header')); abort_unless(Aspire::webhooks()->verify($payload, $signature, $timestamp), 403); $event = json_decode($payload, true);
Generic requests
Use this when Aspire adds an endpoint before this SDK adds a typed method:
$response = Aspire::request('POST', '/custom/path', payload: ['key' => 'value']);
Endpoint coverage
The endpoint map in config/aspire.php covers:
- OAuth authorization, token refresh, token revocation
- Accounts, balances, account details
- Transactions and transaction attachments
- Bank Feed accounts, transactions, sync
- Recipients creation, validation, CRUD
- Payouts, bulk payouts, payout quote, cancellation, payment links
- FX quotes and conversions
- Card issuance, card update, freeze, unfreeze, cancellation, limits, card transactions
- Users/employees access lifecycle
- Account-opening applications and document uploads
- Webhook endpoint management and local signature verification
Publishing to GitHub and Packagist
- Create a public GitHub repository, for example
aspire-laravel-sdk. - Commit this package.
- Add a semantic version tag:
git tag v0.1.0 git push origin main --tags
- Submit the repository URL on Packagist.
- Enable Packagist GitHub hook or GitHub Actions auto-update.
Suggested first release: v0.1.0, then promote to v1.0.0 after confirming Aspire's partner Swagger paths and response schemas in sandbox.
Testing
composer install
composer test
Code style
composer format
License
MIT
Multi-account runtime credentials and per-account proxy
API reference: https://docs.api.aspireapp.com/api
For applications that manage several Aspire registered accounts in one Laravel project, do not rely on a single .env credential set. Store each account's client_id, client_secret, token and proxy settings in your database, then build a runtime client from the account selected by the frontend.
use App\Models\AspireAccount; use Aspire\Sdk\Facades\Aspire; $account = AspireAccount::query() ->whereKey($request->integer('aspire_account_id')) ->where('company_id', $request->user()->company_id) ->where('is_active', true) ->firstOrFail(); $balance = Aspire::forAccount($account) ->accounts() ->balances($request->string('account_id')->toString());
The SDK reads these model or array attributes when using Aspire::forAccount() or Aspire::forCredentials():
environment:sandboxorproductionbase_url: optional Aspire account-specific or region-specific base URLclient_id: Aspire Client ID for the selected registered accountclient_secret: Aspire Client Secret for the selected registered accountapi_key: optional API key, when your Aspire integration uses API-key authenticationaccess_token: optional OAuth access tokenproxy_urlorproxy: preferred per-account full proxy URL, for examplesocks5h://username:password@127.0.0.1:1080proxy_scheme,proxy_host,proxy_port,proxy_username,proxy_password: backward-compatible split proxy settings
$client = Aspire::forCredentials([ 'environment' => 'production', 'client_id' => $account->client_id, 'client_secret' => $account->client_secret, 'access_token' => $account->access_token, 'proxy_url' => 'socks5h://proxy-user:proxy-pass@127.0.0.1:1080', ]); $payout = $client->payouts()->create($payload);
See MULTI_ACCOUNT_USAGE.md for migration, Eloquent model, SOCKS5 proxy string support, token refresh and controller examples.
Transfer helper example:
$transfer = Aspire::forAccount($account)->transfers()->create($payload);