gigerit/bexio-api-client
Bexio API Laravel Package
A Laravel package for the Bexio API, built with saloonphp/saloon as API connector and spatie/laravel-data for DTOs.
Requirements
- PHP 8.2+
- Laravel 10.x, 11.x, 12.x, or 13.x
Installation
composer require gigerit/bexio-api-client
The package will automatically register its service provider.
Publish Configuration
php artisan vendor:publish --tag=bexio-config
This will create a config/bexio.php configuration file.
Environment Variables
Add your Bexio API credentials to your .env file:
# For Personal Access Token (simplest method)
BEXIO_ACCESS_TOKEN=your-access-token
# For OAuth2 (user-based authentication)
BEXIO_CLIENT_ID=your-client-id
BEXIO_CLIENT_SECRET=your-client-secret
BEXIO_REDIRECT_URI=https://your-app.com/bexio/callback
# Optional: persisted OAuth tokens
BEXIO_OAUTH_ACCESS_TOKEN=your-oauth-access-token
BEXIO_OAUTH_REFRESH_TOKEN=your-oauth-refresh-token
Quick Start
Using Dependency Injection
use Bexio\BexioClient;
use Bexio\Resources\Contacts\Contacts\Contact;
class ContactController extends Controller
{
public function index(BexioClient $client)
{
$contacts = Contact::useClient($client)->all();
return view('contacts.index', compact('contacts'));
}
public function show(BexioClient $client, int $id)
{
$contact = Contact::useClient($client)->find($id);
return view('contacts.show', compact('contact'));
}
}
Using the Facade
use Bexio\Facades\Bexio;
use Bexio\Resources\Contacts\Contacts\Contact;
// Get all contacts
$contacts = Contact::useClient(Bexio::getFacadeRoot())->all();
// Or resolve the client directly
$client = app('bexio');
$contacts = Contact::useClient($client)->all();
Resource Guides
Detailed resource usage is documented in segmented guides under docs/resources/ so this README stays high-level.
OAuth2 Authentication
For user-based authentication where users authenticate with their own Bexio account:
1. Generate Authorization URL
use Bexio\BexioAuth;
use Illuminate\Support\Str;
class BexioAuthController extends Controller
{
public function redirect()
{
$auth = new BexioAuth(
config('bexio.oauth.client_id'),
config('bexio.oauth.client_secret'),
config('bexio.oauth.redirect_uri')
);
$state = Str::random(40);
session()->put('bexio_state', $state);
$url = $auth->getAuthorizationUrl(
scopes: config('bexio.scopes'),
state: $state
);
return redirect($url);
}
}
2. Handle Callback
use Bexio\BexioAuth;
public function callback(Request $request)
{
$code = $request->get('code');
$state = $request->get('state');
if ($state !== session('bexio_state')) {
abort(403, 'Invalid state');
}
$auth = new BexioAuth(
config('bexio.oauth.client_id'),
config('bexio.oauth.client_secret'),
config('bexio.oauth.redirect_uri')
);
$authenticator = $auth->getAccessToken($code, $state, session('bexio_state'));
// Store the tokens (serialize the $authenticator or store individual values)
auth()->user()->update([
'bexio_access_token' => $authenticator->getAccessToken(),
'bexio_refresh_token' => $authenticator->getRefreshToken(),
'bexio_expires_at' => $authenticator->getExpiresAt(),
]);
return redirect()->route('dashboard');
}
3. Use with Per-User Authentication
use Bexio\BexioAuth;
use DateTimeImmutable;
use Bexio\Resources\Contacts\Contacts\Contact;
use Bexio\BexioClient;
use Saloon\Http\Auth\AccessTokenAuthenticator;
public function getContacts()
{
$user = auth()->user();
$authService = new BexioAuth(
config('bexio.oauth.client_id'),
config('bexio.oauth.client_secret'),
config('bexio.oauth.redirect_uri')
);
$auth = new AccessTokenAuthenticator(
$user->bexio_access_token,
$user->bexio_refresh_token,
new DateTimeImmutable($user->bexio_expires_at)
);
if ($auth->hasExpired()) {
$auth = $authService->refreshAccessToken($auth);
$user->update([
'bexio_access_token' => $auth->getAccessToken(),
'bexio_refresh_token' => $auth->getRefreshToken(),
'bexio_expires_at' => $auth->getExpiresAt(),
]);
}
$client = new BexioClient($auth->getAccessToken());
return Contact::useClient($client)->all();
}
4. Disconnect OAuth
Revoke the stored refresh token before clearing the locally persisted OAuth values. revokeToken() throws when Bexio rejects the request, so the local values are cleared only after a successful revocation:
use Bexio\BexioAuth;
public function disconnect()
{
$user = auth()->user();
$auth = new BexioAuth(
config('bexio.oauth.client_id'),
config('bexio.oauth.client_secret'),
);
$auth->revokeToken($user->bexio_refresh_token, 'refresh_token');
$user->update([
'bexio_access_token' => null,
'bexio_refresh_token' => null,
'bexio_expires_at' => null,
]);
}
Revoking only an OAuth access token invalidates that token but does not disconnect the renewable refresh-token session. For a full disconnect, revoke the refresh token as shown above. The optional token_type_hint (access_token or refresh_token) helps the authorization server locate the token but is advisory. This method is for tokens issued through the OAuth flow; it does not revoke Bexio personal access tokens.
Documentation
For detailed documentation and advanced usage examples, see:
Resource Guides
- Resource Guides Index - Entry point for segmented per-resource documentation
- Contacts Guides - Contacts, Contact Relations, Contact Groups, Contact Sectors, Additional Addresses, Salutations, and Titles
- Orders Guide - Order CRUD, search endpoint usage, and status helpers
- Endpoint Status Overview - Current implementation status by Bexio endpoint
- Legacy Contacts Redirect - Compatibility landing page pointing to the segmented contacts guides
Additional Resources
- Tests - Unit tests with practical examples
Data Transfer Objects
DTOs provide type hinting and autocompletion in the IDE, for a better development experience.

Available Resources
Endpoint coverage is derived from docs/bexio-api-docs.md. Implemented means a matching request method and endpoint exists in src/Resources/**/Requests.
CONTACTS
See contact title/address payloads.
| Resource | Endpoint | Implemented |
|---|---|---|
| Contacts | GET /2.0/contact |
✅ |
POST /2.0/contact |
✅ | |
POST /2.0/contact/search |
✅ | |
GET /2.0/contact/{contact_id} |
✅ | |
POST /2.0/contact/{contact_id} |
✅ | |
DELETE /2.0/contact/{contact_id} |
✅ | |
POST /2.0/contact/_bulk_create |
✅ | |
PATCH /2.0/contact/{contact_id}/restore |
✅ | |
| Contact Relations | GET /2.0/contact_relation |
✅ |
POST /2.0/contact_relation |
✅ | |
POST /2.0/contact_relation/search |
✅ | |
GET /2.0/contact_relation/{contact_relation_id} |
✅ | |
POST /2.0/contact_relation/{contact_relation_id} |
✅ | |
DELETE /2.0/contact_relation/{contact_relation_id} |
✅ | |
| Contact Groups | GET /2.0/contact_group |
✅ |
POST /2.0/contact_group |
✅ | |
POST /2.0/contact_group/search |
✅ | |
GET /2.0/contact_group/{contact_group_id} |
✅ | |
POST /2.0/contact_group/{contact_group_id} |
✅ | |
DELETE /2.0/contact_group/{contact_group_id} |
✅ | |
| Contact Sectors | GET /2.0/contact_branch |
✅ |
GET /2.0/contact_branch/{contact_branch_id} |
✅ | |
POST /2.0/contact_branch/search |
✅ | |
| Additional Addresses | GET /2.0/contact/{contact_id}/additional_address |
✅ Name additions and contact context |
POST /2.0/contact/{contact_id}/additional_address |
✅ | |
POST /2.0/contact/{contact_id}/additional_address/search |
✅ | |
GET /2.0/contact/{contact_id}/additional_address/{additional_address_id} |
✅ | |
POST /2.0/contact/{contact_id}/additional_address/{additional_address_id} |
✅ | |
DELETE /2.0/contact/{contact_id}/additional_address/{additional_address_id} |
✅ | |
| Salutations | GET /2.0/salutation |
✅ |
POST /2.0/salutation |
✅ | |
POST /2.0/salutation/search |
✅ | |
GET /2.0/salutation/{salutation_id} |
✅ | |
POST /2.0/salutation/{salutation_id} |
✅ | |
DELETE /2.0/salutation/{salutation_id} |
✅ | |
| Titles | GET /2.0/title |
✅ |
POST /2.0/title |
✅ | |
POST /2.0/title/search |
✅ | |
GET /2.0/title/{title_id} |
✅ | |
POST /2.0/title/{title_id} |
✅ | |
DELETE /2.0/title/{title_id} |
✅ |
SALES ORDER MANAGEMENT
See manual quote addresses and position metadata and writes.
| Resource | Endpoint | Implemented |
|---|---|---|
| Quotes | GET /2.0/kb_offer |
✅ |
POST /2.0/kb_offer |
✅ | |
POST /2.0/kb_offer/search |
✅ | |
GET /2.0/kb_offer/{quote_id} |
✅ | |
POST /2.0/kb_offer/{quote_id} |
✅ | |
DELETE /2.0/kb_offer/{quote_id} |
✅ | |
POST /2.0/kb_offer/{quote_id}/issue |
✅ | |
POST /2.0/kb_offer/{quote_id}/revertIssue |
✅ | |
POST /2.0/kb_offer/{quote_id}/accept |
✅ | |
POST /2.0/kb_offer/{quote_id}/reject |
✅ | |
POST /2.0/kb_offer/{quote_id}/reissue |
✅ | |
POST /2.0/kb_offer/{quote_id}/mark_as_sent |
✅ | |
GET /2.0/kb_offer/{quote_id}/pdf |
✅ | |
POST /2.0/kb_offer/{quote_id}/send |
✅ | |
POST /2.0/kb_offer/{quote_id}/copy |
✅ | |
POST /2.0/kb_offer/{quote_id}/order |
✅ | |
POST /2.0/kb_offer/{quote_id}/invoice |
✅ | |
| Orders | GET /2.0/kb_order |
✅ |
POST /2.0/kb_order |
✅ | |
POST /2.0/kb_order/search |
✅ | |
GET /2.0/kb_order/{order_id} |
✅ | |
POST /2.0/kb_order/{order_id} |
✅ | |
DELETE /2.0/kb_order/{order_id} |
✅ | |
POST /2.0/kb_order/{order_id}/delivery |
✅ | |
POST /2.0/kb_order/{order_id}/invoice |
✅ | |
GET /2.0/kb_order/{order_id}/pdf |
✅ | |
GET /2.0/kb_order/{order_id}/repetition |
✅ | |
POST /2.0/kb_order/{order_id}/repetition |
✅ | |
DELETE /2.0/kb_order/{order_id}/repetition |
✅ | |
| Deliveries | GET /2.0/kb_delivery |
✅ |
GET /2.0/kb_delivery/{delivery_id} |
✅ | |
POST /2.0/kb_delivery/{delivery_id}/issue |
✅ | |
| Invoices | GET /2.0/kb_invoice |
✅ |
POST /2.0/kb_invoice |
✅ Explicit net/gross pricing | |
POST /2.0/kb_invoice/search |
✅ | |
GET /2.0/kb_invoice/{invoice_id} |
✅ | |
POST /2.0/kb_invoice/{invoice_id} |
✅ | |
DELETE /2.0/kb_invoice/{invoice_id} |
✅ | |
GET /2.0/kb_invoice/{invoice_id}/pdf |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/copy |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/issue |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/revert_issue |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/cancel |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/mark_as_sent |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/send |
✅ | |
GET /2.0/kb_invoice/{invoice_id}/payment |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/payment |
✅ | |
GET /2.0/kb_invoice/{invoice_id}/payment/{payment_id} |
✅ | |
DELETE /2.0/kb_invoice/{invoice_id}/payment/{payment_id} |
✅ | |
GET /2.0/kb_invoice/{invoice_id}/kb_reminder |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/kb_reminder |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/kb_reminder/search |
✅ | |
GET /2.0/kb_invoice/{invoice_id}/kb_reminder/{reminder_id} |
✅ | |
DELETE /2.0/kb_invoice/{invoice_id}/kb_reminder/{reminder_id} |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/kb_reminder/{reminder_id}/mark_as_sent |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/kb_reminder/{reminder_id}/mark_as_unsent |
✅ | |
POST /2.0/kb_invoice/{invoice_id}/kb_reminder/{reminder_id}/send |
✅ | |
GET /2.0/kb_invoice/{invoice_id}/kb_reminder/{reminder_id}/pdf |
✅ | |
| Document Settings | GET /2.0/kb_item_setting |
✅ |
| Comments | GET /2.0/{kb_document_type}/{document_id}/comment |
✅ |
POST /2.0/{kb_document_type}/{document_id}/comment |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/comment/{comment_id} |
✅ | |
| Default positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_custom |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_custom |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_custom/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_custom/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_custom/{position_id} |
✅ | |
| Item positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_article |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_article |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_article/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_article/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_article/{position_id} |
✅ | |
| Text positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_text |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_text |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_text/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_text/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_text/{position_id} |
✅ | |
| Subtotal positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_subtotal |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_subtotal |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_subtotal/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_subtotal/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_subtotal/{position_id} |
✅ | |
| Discount positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_discount |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_discount |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_discount/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_discount/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_discount/{position_id} |
✅ | |
| Pagebreak positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_pagebreak |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_pagebreak |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_pagebreak/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_pagebreak/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_pagebreak/{position_id} |
✅ | |
| Sub positions | GET /2.0/{kb_document_type}/{document_id}/kb_position_subposition |
✅ |
POST /2.0/{kb_document_type}/{document_id}/kb_position_subposition |
✅ | |
GET /2.0/{kb_document_type}/{document_id}/kb_position_subposition/{position_id} |
✅ | |
POST /2.0/{kb_document_type}/{document_id}/kb_position_subposition/{position_id} |
✅ | |
DELETE /2.0/{kb_document_type}/{document_id}/kb_position_subposition/{position_id} |
✅ | |
| Document templates | GET /3.0/document_templates |
✅ Template slugs |
PURCHASE
See current purchase OAuth scope requirements, response metadata, and bill-scoped outgoing payments.
| Resource | Endpoint | Implemented |
|---|---|---|
| Bills | GET /4.0/purchase/bills |
✅ |
POST /4.0/purchase/bills |
✅ | |
GET /4.0/purchase/bills/{id} |
✅ | |
PUT /4.0/purchase/bills/{id} |
✅ | |
DELETE /4.0/purchase/bills/{id} |
✅ | |
PUT /4.0/purchase/bills/{id}/bookings/{status} |
✅ | |
POST /4.0/purchase/bills/{id}/actions |
✅ | |
GET /4.0/purchase/documentnumbers/bills |
✅ | |
| Expenses | GET /4.0/expenses |
✅ |
POST /4.0/expenses |
✅ | |
GET /4.0/expenses/{id} |
✅ | |
PUT /4.0/expenses/{id} |
✅ | |
DELETE /4.0/expenses/{id} |
✅ | |
PUT /4.0/expenses/{id}/bookings/{status} |
✅ | |
POST /4.0/expenses/{id}/actions |
✅ | |
GET /4.0/expenses/documentnumbers |
✅ | |
| Purchase Orders | GET /3.0/purchase_orders |
✅ |
POST /3.0/purchase_orders |
✅ | |
GET /3.0/purchase_orders/{purchase_order_id} |
✅ | |
PUT /3.0/purchase_orders/{purchase_order_id} |
✅ | |
DELETE /3.0/purchase_orders/{purchase_order_id} |
✅ | |
| Outgoing Payment | GET /4.0/purchase/outgoing-payments |
✅ |
PUT /4.0/purchase/outgoing-payments |
✅ | |
POST /4.0/purchase/outgoing-payments |
✅ | |
GET /4.0/purchase/outgoing-payments/{id} |
✅ | |
DELETE /4.0/purchase/outgoing-payments/{id} |
✅ |
ACCOUNTING
See manual entry metadata and attachments.
| Resource | Endpoint | Implemented |
|---|---|---|
| Accounts | GET /2.0/accounts |
✅ Response metadata |
POST /2.0/accounts/search |
✅ | |
| Account Groups | GET /2.0/account_groups |
✅ |
GET /2.0/account_groups/{account_group_id} |
✅ | |
| Calendar Years | GET /3.0/accounting/calendar_years |
✅ Response metadata |
POST /3.0/accounting/calendar_years |
✅ | |
POST /3.0/accounting/calendar_years/search |
✅ | |
GET /3.0/accounting/calendar_years/{calendar_year_id} |
✅ | |
| Business Years | GET /3.0/accounting/business_years |
✅ |
GET /3.0/accounting/business_years/{business_year_id} |
✅ | |
| Currencies | GET /3.0/currencies |
✅ |
POST /3.0/currencies |
✅ | |
GET /3.0/currencies/{currency_id} |
✅ | |
DELETE /3.0/currencies/{currency_id} |
✅ | |
PATCH /3.0/currencies/{currency_id} |
✅ | |
GET /3.0/currencies/{currency_id}/exchange_rates |
✅ | |
GET /3.0/currencies/codes |
✅ | |
| Manual Entries | GET /3.0/accounting/manual_entries |
✅ |
POST /3.0/accounting/manual_entries |
✅ | |
PUT /3.0/accounting/manual_entries/{manual_entry_id} |
✅ | |
DELETE /3.0/accounting/manual_entries/{manual_entry_id} |
✅ | |
GET /3.0/accounting/manual_entries/next_ref_nr |
✅ | |
GET /3.0/accounting/manual_entries/{manual_entry_id}/entries/{entry_id}/files |
✅ | |
POST /3.0/accounting/manual_entries/{manual_entry_id}/entries/{entry_id}/files |
✅ | |
GET /3.0/accounting/manual_entries/{manual_entry_id}/entries/{entry_id}/files/{file_id} |
✅ | |
DELETE /3.0/accounting/manual_entries/{manual_entry_id}/entries/{entry_id}/files/{file_id} |
✅ | |
GET /3.0/accounting/manual_entries/{manual_entry_id}/files |
✅ | |
POST /3.0/accounting/manual_entries/{manual_entry_id}/files |
✅ | |
GET /3.0/accounting/manual_entries/{manual_entry_id}/files/{file_id} |
✅ | |
DELETE /3.0/accounting/manual_entries/{manual_entry_id}/files/{file_id} |
✅ | |
| Reports | GET /3.0/accounting/journal |
✅ Currency amounts and references |
| Taxes | GET /3.0/taxes |
✅ Response metadata |
GET /3.0/taxes/{tax_id} |
✅ | |
DELETE /3.0/taxes/{tax_id} |
✅ | |
| Vat Periods | GET /3.0/accounting/vat_periods |
✅ Dates and annual reporting periods |
GET /3.0/accounting/vat_periods/{vat_period_id} |
✅ |
BANKING
See v4 payment creation and updates.
| Resource | Endpoint | Implemented |
|---|---|---|
| Bank Accounts | GET /3.0/banking/accounts |
✅ Identifiers |
GET /3.0/banking/accounts/{bank_account_id} |
✅ | |
| IBAN Payments | POST /3.0/banking/bank_accounts/{bank_account_id}/iban_payments |
✅ |
GET /3.0/banking/bank_accounts/{bank_account_id}/iban_payments/{payment_id} |
✅ | |
PATCH /3.0/banking/bank_accounts/{bank_account_id}/iban_payments/{payment_id} |
✅ | |
| QR Payments | POST /3.0/banking/bank_accounts/{bank_account_id}/qr_payments |
✅ |
GET /3.0/banking/bank_accounts/{bank_account_id}/qr_payments/{payment_id} |
✅ | |
PATCH /3.0/banking/bank_accounts/{bank_account_id}/qr_payments/{payment_id} |
✅ | |
| Payments | GET /3.0/banking/payments |
✅ |
POST /3.0/banking/payments/{payment_id}/cancel |
✅ | |
DELETE /3.0/banking/payments/{payment_id} |
✅ | |
GET /4.0/banking/payments |
✅ | |
POST /4.0/banking/payments |
✅ | |
GET /4.0/banking/payments/{payment_id} |
✅ | |
PUT /4.0/banking/payments/{payment_id} |
✅ | |
DELETE /4.0/banking/payments/{payment_id} |
✅ | |
POST /4.0/banking/payments/{payment_id}/cancel |
✅ |
ITEMS & PRODUCTS
| Resource | Endpoint | Implemented |
|---|---|---|
| Items | GET /2.0/article |
✅ |
POST /2.0/article |
✅ | |
POST /2.0/article/search |
✅ | |
GET /2.0/article/{article_id} |
✅ | |
POST /2.0/article/{article_id} |
✅ | |
DELETE /2.0/article/{article_id} |
✅ | |
| Stock locations | GET /2.0/stock |
✅ |
POST /2.0/stock/search |
✅ | |
| Stock Areas | GET /2.0/stock_place |
✅ |
POST /2.0/stock_place/search |
✅ |
PROJECTS & TIME TRACKING
See timesheet tracking payloads.
| Resource | Endpoint | Implemented |
|---|---|---|
| Projects | GET /2.0/pr_project |
✅ Project numbering |
POST /2.0/pr_project |
✅ | |
POST /2.0/pr_project/search |
✅ | |
GET /2.0/pr_project/{project_id} |
✅ | |
POST /2.0/pr_project/{project_id} |
✅ | |
DELETE /2.0/pr_project/{project_id} |
✅ | |
POST /2.0/pr_project/{project_id}/archive |
✅ | |
POST /2.0/pr_project/{project_id}/reactivate |
✅ | |
GET /2.0/pr_project_state |
✅ | |
GET /2.0/pr_project_type |
✅ | |
GET /3.0/projects/{project_id}/milestones |
✅ | |
POST /3.0/projects/{project_id}/milestones |
✅ | |
GET /3.0/projects/{project_id}/milestones/{milestone_id} |
✅ | |
POST /3.0/projects/{project_id}/milestones/{milestone_id} |
⚠️ Documented method returns 404; use PATCH | |
PATCH /3.0/projects/{project_id}/milestones/{milestone_id} |
✅ Verified live update method | |
DELETE /3.0/projects/{project_id}/milestones/{milestone_id} |
✅ | |
GET /3.0/projects/{project_id}/packages |
✅ | |
POST /3.0/projects/{project_id}/packages |
✅ | |
GET /3.0/projects/{project_id}/packages/{package_id} |
✅ | |
DELETE /3.0/projects/{project_id}/packages/{package_id} |
✅ | |
PATCH /3.0/projects/{project_id}/packages/{package_id} |
✅ | |
| Timesheets | GET /2.0/timesheet |
✅ |
POST /2.0/timesheet |
✅ | |
POST /2.0/timesheet/search |
✅ | |
GET /2.0/timesheet/{timesheet_id} |
✅ | |
POST /2.0/timesheet/{timesheet_id} |
✅ | |
DELETE /2.0/timesheet/{timesheet_id} |
✅ | |
GET /2.0/timesheet_status |
✅ | |
| Business Activities | GET /2.0/client_service |
✅ |
GET /2.0/client_service/{client_service_id} |
✅ | |
POST /2.0/client_service |
✅ | |
POST /2.0/client_service/search |
✅ | |
| Communication Types | GET /2.0/communication_kind |
✅ |
GET /2.0/communication_kind/{communication_kind_id} |
✅ | |
POST /2.0/communication_kind/search |
✅ |
FILES
| Resource | Endpoint | Implemented |
|---|---|---|
| Files | GET /3.0/files |
✅ |
POST /3.0/files |
✅ | |
POST /3.0/files/search |
✅ | |
GET /3.0/files/{file_id} |
✅ | |
DELETE /3.0/files/{file_id} |
✅ | |
PATCH /3.0/files/{file_id} |
✅ | |
GET /3.0/files/{file_id}/download |
✅ | |
GET /3.0/files/{file_id}/preview |
✅ | |
GET /3.0/files/{file_id}/usage |
✅ |
PAYROLL
See employee and absence contracts.
| Resource | Endpoint | Implemented |
|---|---|---|
| Employees | GET /4.0/payroll/employees |
✅ |
POST /4.0/payroll/employees |
✅ | |
GET /4.0/payroll/employees/{employeeId} |
✅ | |
PATCH /4.0/payroll/employees/{employeeId} |
✅ | |
| Absences | GET /4.0/payroll/employees/{employeeId}/absences |
✅ |
POST /4.0/payroll/employees/{employeeId}/absences |
✅ | |
GET /4.0/payroll/employees/{employeeId}/absences/{absenceId} |
✅ | |
PUT /4.0/payroll/employees/{employeeId}/absences/{absenceId} |
✅ | |
DELETE /4.0/payroll/employees/{employeeId}/absences/{absenceId} |
✅ | |
| Documents | GET /4.0/payroll/employees/{employeeId}/paystub-pdf/{year}/{month} |
✅ Deprecated upstream; migration |
GET /4.0/payroll/employees/{employeeId}/paystub-pdf-download/{year}/{month} |
✅ Direct PDF download (trial account: contract-tested) |
OTHER
| Resource | Endpoint | Implemented |
|---|---|---|
| Company Profile | GET /2.0/company_profile |
✅ |
GET /2.0/company_profile/{profile_id} |
✅ | |
| Countries | GET /2.0/country |
✅ |
POST /2.0/country |
✅ | |
POST /2.0/country/search |
✅ | |
GET /2.0/country/{country_id} |
✅ | |
POST /2.0/country/{country_id} |
✅ | |
DELETE /2.0/country/{country_id} |
✅ | |
| Languages | GET /2.0/language |
✅ |
POST /2.0/language/search |
✅ | |
| Notes | GET /2.0/note |
✅ Project reference mapping |
POST /2.0/note |
✅ | |
POST /2.0/note/search |
✅ | |
GET /2.0/note/{note_id} |
✅ | |
POST /2.0/note/{note_id} |
✅ | |
DELETE /2.0/note/{note_id} |
✅ | |
| Payment Types | GET /2.0/payment_type |
✅ |
POST /2.0/payment_type/search |
✅ | |
| Permissions | GET /3.0/permissions |
✅ |
| Tasks | GET /2.0/task |
✅ Project and reminder mappings |
POST /2.0/task |
✅ | |
POST /2.0/task/search |
✅ | |
GET /2.0/task/{task_id} |
✅ | |
POST /2.0/task/{task_id} |
✅ | |
DELETE /2.0/task/{task_id} |
✅ | |
GET /2.0/todo_priority |
✅ | |
GET /2.0/todo_status |
✅ | |
| Units | GET /2.0/unit |
✅ |
POST /2.0/unit |
✅ | |
POST /2.0/unit/search |
✅ | |
GET /2.0/unit/{unit_id} |
✅ | |
POST /2.0/unit/{unit_id} |
✅ | |
DELETE /2.0/unit/{unit_id} |
✅ | |
| User Management | GET /3.0/users |
✅ |
GET /3.0/users/{user_id} |
✅ | |
GET /3.0/users/me |
✅ | |
GET /3.0/fictional_users |
✅ | |
POST /3.0/fictional_users |
✅ | |
GET /3.0/fictional_users/{fictional_user_id} |
✅ | |
DELETE /3.0/fictional_users/{fictional_user_id} |
✅ | |
PATCH /3.0/fictional_users/{fictional_user_id} |
✅ |
Testing
composer test
For a known trial test account, set BEXIO_TEST_ACCOUNT_PLAN=trial in .env.
This explicitly skips live payroll, legacy IBAN/QR writes, and purchase-order
writes unavailable on that account; their request/DTO contract tests still run. Leave the setting
empty for full accounts so authorization failures surface. Data-dependent skips
and trial exclusions do not constitute successful live verification.
CI defaults to the shared trial account; set the repository variable
BEXIO_TEST_ACCOUNT_PLAN to full when using an account with the required access.
License
MIT, as declared in composer.json.
Related Packages
An http library developed for the laravel framework. aliases itself as HttpClien...
An elegant and smart Rest API Client with OAuth2 authentication support. Build f...
Version History
| Version | Released | PHP | Laravel | License |
|---|---|---|---|---|
| v4.10.5 | ^8.2 | ^10.0| | MIT | |
| v4.10.4 | ^8.2 | ^10.0| | MIT | |
| v4.10.3 | ^8.2 | ^10.0| | MIT | |
| v4.10.2 | ^8.2 | ^10.0| | MIT | |
| v4.10.1 | ^8.2 | ^10.0| | MIT | |
| v4.10.0 | ^8.2 | ^10.0| | MIT | |
| v4.9.1 | ^8.2 | ^10.0| | MIT | |
| v4.9.0 | ^8.2 | ^10.0| | MIT | |
| v4.8.3 | ^8.2 | ^10.0| | MIT | |
| v4.8.2 | ^8.2 | ^10.0| | MIT | |
| v4.8.1 | ^8.2 | ^10.0| | MIT | |
| v4.8.0 | ^8.2 | ^10.0| | MIT | |
| v4.7.0 | ^8.2 | ^10.0| | MIT | |
| v4.6.0 | ^8.2 | ^10.0| | MIT | |
| v4.5.1 | ^8.2 | ^10.0| | MIT | |
| v4.5.0 | ^8.2 | ^10.0| | MIT | |
| v4.4.0 | ^8.2 | ^10.0| | MIT | |
| v4.3.0 | ^8.2 | ^10.0| | MIT | |
| v4.2.1 | ^8.2 | ^10.0| | MIT | |
| v4.2.0 | ^8.2 | ^10.0| | MIT | |
| v4.1.0 | ^8.2 | ^10.0| | MIT | |
| v4.0.0 | ^8.2 | ^10.0| | MIT | |
| 3.3.1 | ^8.4 | ^11| | MIT | |
| 3.3.0 | ^8.4 | ^11| | MIT | |
| 3.2.0 | ^8.4 | ^11| | MIT | |
| 3.1.1 | ^11| | MIT | ||
| 3.1.0 | ^11| | MIT | ||
| 3.0.2 | ^11| | MIT | ||
| 3.0.1 | ^11| | MIT | ||
| 2.3.0 | ^11| | MIT |
Showing the latest 30 of 40. See every release on Packagist