PHPackages                             n1ebieski/ksef-php-client - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. n1ebieski/ksef-php-client

ActiveLibrary[API Development](/categories/api)

n1ebieski/ksef-php-client
=========================

PHP API client that allows you to interact with the API Krajowego Systemu e-Faktur

0.34.0(2mo ago)7228.4k↑30.2%24MITPHPPHP ^8.1.0CI passing

Since May 24Pushed 1mo ago15 watchersCompare

[ Source](https://github.com/N1ebieski/ksef-php-client)[ Packagist](https://packagist.org/packages/n1ebieski/ksef-php-client)[ RSS](/packages/n1ebieski-ksef-php-client/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (48)Versions (153)Used By (0)

[![1920x810](https://private-user-images.githubusercontent.com/14810714/447278346-7db28b6a-80fc-4651-9d07-f04aad6ec8c7.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NjYzNDgsIm5iZiI6MTc3NDY2NjA0OCwicGF0aCI6Ii8xNDgxMDcxNC80NDcyNzgzNDYtN2RiMjhiNmEtODBmYy00NjUxLTlkMDctZjA0YWFkNmVjOGM3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI4VDAyNDcyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY2Mzk0ZjIwZjU2YzQ2OGIzZWU4YWQ2ZDAwODlmNDg5MzhmMzE0ODQ1MDkxNWYxYWExNGEyOGUxMGY3YjFjZmMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.UUEumbgHdwCnyboyR22LGD8wsXmbjZk3bfbAZsyT3b0)](https://private-user-images.githubusercontent.com/14810714/447278346-7db28b6a-80fc-4651-9d07-f04aad6ec8c7.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NjYzNDgsIm5iZiI6MTc3NDY2NjA0OCwicGF0aCI6Ii8xNDgxMDcxNC80NDcyNzgzNDYtN2RiMjhiNmEtODBmYy00NjUxLTlkMDctZjA0YWFkNmVjOGM3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI4VDAyNDcyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY2Mzk0ZjIwZjU2YzQ2OGIzZWU4YWQ2ZDAwODlmNDg5MzhmMzE0ODQ1MDkxNWYxYWExNGEyOGUxMGY3YjFjZmMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.UUEumbgHdwCnyboyR22LGD8wsXmbjZk3bfbAZsyT3b0)

KSEF PHP Client
===============

[](#ksef-php-client)

> **This package is not production ready yet!**

PHP API client that allows you to interact with the [KSEF API](https://api-test.ksef.mf.gov.pl/docs/v2/index.html) Krajowy System e-Faktur

Main features:

- Support for authorization using qualified certificates, KSeF certificates, KSeF tokens, and trusted ePUAP signatures (manual mode)
- Support for signatures with both RSA and EC keys
- Support for async batch send multiple invoices
- Logical FA (3) and FA\_RR (1) invoices structure mapped to DTOs and ValueObjects
- Automatic access token refresh
- Automatic XML document validation based on XSD schemas
- CSR (Certificate Signing Request) handling
- KSeF exception handling
- PDF invoice nad UPO generation
- QR codes generation

KSEF VersionBranchRelease Version2.0main^1.01.00.2.x0.2.\*Table of Contents
-----------------

[](#table-of-contents)

- [Get Started](#get-started)

    - [Client configuration](#client-configuration)
    - [Auto mapping](#auto-mapping)
- [Authorization](#authorization)

    - [Auto authorization via KSEF Token](#auto-authorization-via-ksef-token)
    - [Auto authorization via certificate .p12](#auto-authorization-via-certificate-p12)
    - [Manual authorization](#manual-authorization)
- [Resources](#resources)

    - [Auth](#auth)
        - [Auth Challenge](#auth-challenge)
        - [Auth Xades Signature](#auth-xades-signature)
        - [Auth Status](#auth-status)
        - [Auth Token](#auth-token)
            - [Auth Token Redeem](#auth-token-redeem)
            - [Auth Token Refresh](#auth-token-refresh)
        - [Auth Sessions](#auth-sessions)
            - [Auth Session List](#auth-sessions-list)
            - [Auth Session Revoke Current](#auth-sessions-revoke-current)
            - [Auth Session Revoke](#auth-sessions-revoke)
    - [Limits](#limits)
        - [Limits Context](#limits-context)
        - [Limits Subject](#limits-subject)
    - [Rate Limits](#rate-limits)
    - [Security](#security)
        - [Security Public Key Certificates](#security-public-key-certificates)
    - [Sessions](#sessions)
        - [Sessions List](#sessions-list)
        - [Sessions Invoices](#sessions-invoices)
            - [Sessions Invoices List](#sessions-invoices-list)
            - [Sessions Invoices Failed](#sessions-invoices-failed)
            - [Sessions Invoices Upo](#sessions-invoices-upo)
            - [Sessions Invoices Ksef Upo](#sessions-invoices-ksef-upo)
            - [Sessions Invoices Status](#sessions-invoices-status)
        - [Sessions Online](#sessions-online)
            - [Sessions Online Open](#sessions-online-open)
            - [Sessions Online Close](#sessions-online-close)
            - [Sessions Online Send invoices](#sessions-online-send-invoices)
        - [Sessions Batch](#sessions-batch)
            - [Sessions Batch Open (and send multiple invoices)](#sessions-batch-open-and-send-multiple-invoices)
            - [Sessions Batch Close](#sessions-batch-close)
        - [Sessions Status](#sessions-status)
        - [Sessions Upo](#sessions-upo)
    - [Invoices](#invoices)
        - [Invoices Download](#invoices-download)
        - [Invoices Query](#invoices-query)
            - [Invoices Query Metadata](#invoices-query-metadata)
        - [Invoices Exports](#invoices-exports)
            - [Invoices Exports Init](#invoices-exports-init)
            - [Invoices Exposts Status](#invoices-exports-status)
    - [Permissions](#permissions)
        - [Permissions Persons](#permissions-persons)
            - [Permissions Persons Grants](#permissions-persons-grants)
        - [Permissions Entities](#permissions-entities)
            - [Permissions Entities Grants](#permissions-entities-grants)
        - [Permissions Authorizations](#permissions-authorizations)
            - [Permissions Authorizations Grants](#permissions-authorizations-grants)
            - [Permissions Authorizations Grants Revoke](#permissions-authorizations-grants-revoke)
        - [Permissions Indirect](#permissions-indirect)
            - [Permissions Indirect Grants](#permissions-indirect-grants)
        - [Permissions Subunits](#permissions-subunits)
            - [Permissions Subunits Grants](#permissions-subunits-grants)
        - [Permissions EuEntities](#permissions-euentities)
            - [Permissions EuEntities Administration](#permissions-euentities-administration)
                - [Permissions EuEntities Administration Grants](#permissions-euentities-administration-grants)
            - [Permissions EuEntities Grants](#permissions-euentities-grants)
        - [Permissions Common](#permissions-common)
            - [Permissions Common Grants Revoke](#permissions-common-grants-revoke)
        - [Permissions Query](#permissions-query)
            - [Permissions Query Authorizations](#permissions-query-authorizations)
                - [Permissions Query Authorizations Grants](#permissions-query-authorizations-grants)
            - [Permissions Query Entities](#permissions-query-entities)
                - [Permissions Query Entities Grants](#permissions-query-entities-grants)
                - [Permissions Query Entities Roles](#permissions-query-entities-roles)
            - [Permissions Query EuEntities](#permissions-query-euentities)
                - [Permissions Query EuEntities Grants](#permissions-query-euentities-grants)
            - [Permissions Query Personal](#permissions-query-personal)
                - [Permissions Query Personal Grants](#permissions-query-personal-grants)
            - [Permissions Query Persons](#permissions-query-persons)
                - [Permissions Query Persons Grants](#permissions-query-persons-grants)
            - [Permissions Query Subunits](#permissions-query-subunits)
                - [Permissions Query Subunits Grants](#permissions-query-subunits-grants)
            - [Permissions Query SubordinateEntities](#permissions-query-subordinateentities)
                - [Permissions Query SubordinateEntities Roles](#permissions-query-subordinateentities-roles)
        - [Permissions Operations](#permissions-operations)
            - [Permissions Operations Status](#permissions-operations-status)
        - [Permissions Attachments](#permissions-attachments)
            - [Permissions Attachments Status](#permissions-attachments-status)
    - [Certificates](#certificates)
        - [Certificates Limits](#certificates-limits)
        - [Certificates Enrollments](#certificates-enrollments)
            - [Certificates Enrollments Data](#certificates-enrollments-data)
            - [Certificates Enrollments Send](#certificates-enrollments-send)
            - [Certificates Enrollments Status](#certificates-enrollments-status)
        - [Certificates Retrieve](#certificates-retrieve)
        - [Certificates Revoke](#certificates-revoke)
        - [Certificates Query](#certificates-query)
    - [Tokens](#tokens)
        - [Tokens Create](#tokens-create)
        - [Tokens List](#tokens-list)
        - [Tokens Status](#tokens-status)
        - [Tokens Revoke](#tokens-revoke)
    - [Peppol](#peppol)
        - [Peppol Query](#peppol-query)
    - [Testdata](#testdata)
        - [Testdata Attachment](#testdata-attachment)
            - [Testdata Attachment Approve](#testdata-attachment-approve)
            - [TestData Attachment Revoke](#testdata-attachment-revoke)
        - [Testdata Person](#testdata-person)
            - [Testdata Person Create](#testdata-person-create)
            - [Testdata Person Remove](#testdata-person-remove)
        - [Testdata Context](#testdata-context)
            - [Testdata Context Block](#testdata-context-block)
            - [Testdata Context Unblock](#testdata-context-unblock)
        - [Testdata Permissions](#testdata-permissions)
            - [Testdata Permissions Grants](#testdata-permissions-grants)
            - [Testdata Permissions Revoke](#testdata-permissions-revoke)
        - [Testdata Limits](#testdata-limits)
            - [Testdata Limits Context](#testdata-limits-context)
                - [Testdata Limits Context Session](#testdata-limits-context-session)
                    - [Testdata Limits Context Session Limits](#testdata-limits-context-session-limits)
                    - [Testdata Limits Context Session Reset](#testdata-limits-context-session-reset)
            - [Testdata Limits Subject](#testdata-limits-subject)
                - [Testdata Limits Subject Certificate](#testdata-limits-subject-certificate)
                    - [Testdata Limits Subject Certificate Limits](#testdata-limits-subject-certificate-limits)
                    - [Testdata Limits Subject Certificate Reset](#testdata-limits-subject-certificate-reset)
        - [Testdata Rate Limits](#testdata-rate-limits)
            - [Testdata Rate Limits Limits](#testdata-rate-limits-limits)
            - [Testdata Rate Limits Reset](#testdata-rate-limits-reset)
            - [Testdata Rate Limits Production](#testdata-rate-limits-production)
    - [Latarnia](#latarnia)
        - [Latarnia Status](#latarnia-status)
        - [Latarnia Messages](#latarnia-messages)
- [Examples](#examples)

    - [Integration with a frontend application using certificate-based authentication](#integration-with-a-frontend-application-using-certificate-based-authentication)
    - [Conversion of the KSEF certificate and private key from MCU to a .p12 file](#conversion-of-the-ksef-certificate-and-private-key-from-mcu-to-a-p12-file)
    - [Generate a KSEF certificate and convert to .p12 file](#generate-a-ksef-certificate-and-convert-to-a-p12-file)
    - [Send an invoice, check for UPO and generate QR code](#send-an-invoice-check-for-upo-and-generate-qr-code)
    - [Generate PDF for the invoice and the UPO file](#generate-pdf-for-the-invoice-and-the-upo-file)
    - [Generate PDF for the transaction confirmation with both QR codes](#generate-pdf-for-the-transaction-confirmation-with-both-qr-codes)
    - [Batch async send multiple invoices and check for UPO](#batch-async-send-multiple-invoices-and-check-for-upo)
    - [Create an offline invoice and generate both QR codes](#create-an-offline-invoice-and-generate-both-qr-codes)
    - [Generate PDF for the offline invoice file with both QR codes](#generate-pdf-for-the-offline-invoice-file-with-both-qr-codes)
    - [Download and decrypt invoices using the encryption key](#download-and-decrypt-invoices-using-the-encryption-key)
- [Testing](#testing)
- [Roadmap](#roadmap)
- [Special thanks](#special-thanks)

Get Started
-----------

[](#get-started)

> **Requires [PHP 8.1+](https://www.php.net/releases/)**

First, install `ksef-php-client` via the [Composer](https://getcomposer.org/) package manager:

```
composer require n1ebieski/ksef-php-client:^1.0
```

Ensure that the `php-http/discovery` composer plugin is allowed to run or install a client manually if your project does not already have a PSR-18 client integrated.

```
composer require guzzlehttp/guzzle
```

### Client configuration

[](#client-configuration)

```
use N1ebieski\KSEFClient\ClientBuilder;
use N1ebieski\KSEFClient\ValueObjects\Mode;
use N1ebieski\KSEFClient\Factories\ValinorCacheFactory;
use N1ebieski\KSEFClient\Factories\EncryptionKeyFactory;

$client = (new ClientBuilder())
    ->withMode(Mode::Production) // Choice between: Test, Demo, Production
    ->withApiUrl($_ENV['KSEF_API_URL']) // Optional, default is set by Mode selection
    ->withLatarniaApiUrl($_ENV['KSEF_LATARNIA_API_URL']) // Optional, default is set by Mode selection
    ->withHttpClient(new \GuzzleHttp\Client(...)) // Optional PSR-18 implementation, default is set by Psr18ClientDiscovery::find()
    ->withCache(new \Symfony\Component\Cache\Psr16Cache(...), $_ENV['CACHE_TTL']) // Optional PSR-16 implementation, default is null
    ->withValinorCache(ValinorCacheFactory::make()) // Optional CuyZ\Valinor\Cache\Cache implementation for caching auto-mapping DTO, default is null, more information: https://valinor-php.dev/2.3/other/performance-and-caching/
    ->withLogger(new \Monolog\Logger(...)) // Optional PSR-3 implementation, default is set by PsrDiscovery\Discover::log()
    ->withLogPath($_ENV['PATH_TO_LOG_FILE'], $_ENV['LOG_LEVEL']) // Optional, level: null disables logging
    ->withExceptionHandler(new \ExceptionHandler(...)) // Optional N1ebieski\KSEFClient\Contracts\Exception\ExceptionHandlerInterface implmentation
    ->withAccessToken($_ENV['ACCESS_TOKEN'], $_ENV['VALID_UNTIL']) // Optional, if present, auto authorization is skipped
    ->withRefreshToken($_ENV['REFRESH_TOKEN'], $_ENV['VALID_UNTIL']) // Optional, if present, auto refresh access token is enabled
    ->withKsefToken($_ENV['KSEF_TOKEN']) // Required for API Token authorization. Optional otherwise
    ->withCertificate($_ENV['CERTIFICATE'], $_ENV['CERTIFICATE_PASSPHRASE']) // Required .p12 contents for Certificate authorization. Optional otherwise
    ->withCertificatePath($_ENV['PATH_TO_CERTIFICATE'], $_ENV['CERTIFICATE_PASSPHRASE']) // Required path to .p12 file for Certificate authorization. Optional otherwise
    ->withVerifyCertificateChain(true) // Optional. Explanation https://api-test.ksef.mf.gov.pl/docs/v2/index.html#tag/Uzyskiwanie-dostepu/paths/~1auth~1xades-signature/post
    ->withEncryptionKey(EncryptionKeyFactory::makeRandom()) // Required for invoice resources. Remember to save this value!
    ->withIdentifier('NIP_NUMBER') // Required for authorization. Optional otherwise
    ->withAsyncMaxConcurrency(8) // Optional. Maximum concurrent send operations during asynchronous sending
    ->withValidateXml(true) // Optional. XML document validation based on XSD schemas
    ->withRetryTiming(10, 120) // Optional. Authorization status retry timing: backoff in seconds and max wait time in seconds
    ->build();
```

### Auto mapping

[](#auto-mapping)

Each resource supports mapping through both an array and a DTO, for example:

```
use N1ebieski\KSEFClient\Requests\Auth\Status\StatusRequest;
use N1ebieski\KSEFClient\Requests\ValueObjects\ReferenceNumber;

$authorisationStatusResponse = $client->auth()->status(new StatusRequest(
    referenceNumber: ReferenceNumber::from('20250508-EE-B395BBC9CD-A7DB4E6095-BD')
))->object();
```

or:

```
$authorisationStatusResponse = $client->auth()->status([
    'referenceNumber' => '20250508-EE-B395BBC9CD-A7DB4E6095-BD'
])->object();
```

For best performance, it is recommended to use caching:

```
use N1ebieski\KSEFClient\ClientBuilder;
use N1ebieski\KSEFClient\Factories\ValinorCacheFactory;

$client = (new ClientBuilder())
    ->withValinorCache(ValinorCacheFactory::make()) // Or other CuyZ\Valinor\Cache\Cache implementation
```

or directly for a DTO:

```
use N1ebieski\KSEFClient\DTOs\Requests\Sessions\Faktura;

$faktura = Faktura::from([...], ValinorCacheFactory::make())
```

Important

If you are using caching, remember to clear the cache after updating this package!

More information:

Authorization
-------------

[](#authorization)

 ### Auto authorization via KSEF Token

[](#auto-authorization-via-ksef-token)

 ```
use N1ebieski\KSEFClient\ClientBuilder;

$client = (new ClientBuilder())
    ->withKsefToken($_ENV['KSEF_KEY'])
    ->withIdentifier('NIP_NUMBER')
    ->build();

// Do something with the available resources
```

 ### Auto authorization via certificate .p12

[](#auto-authorization-via-certificate-p12)

 ```
use N1ebieski\KSEFClient\ClientBuilder;

$client = (new ClientBuilder())
    ->withCertificatePath($_ENV['PATH_TO_CERTIFICATE'], $_ENV['CERTIFICATE_PASSPHRASE'])
    ->withIdentifier('NIP_NUMBER')
    ->build();

// Do something with the available resources
```

or:

```
use N1ebieski\KSEFClient\ClientBuilder;

$client = (new ClientBuilder())
    ->withCertificate($_ENV['CERTIFICATE'], $_ENV['CERTIFICATE_PASSPHRASE'])
    ->withIdentifier('NIP_NUMBER')
    ->build();

// Do something with the available resources
```

 ### Manual authorization

[](#manual-authorization)

 ```
use N1ebieski\KSEFClient\ClientBuilder;
use N1ebieski\KSEFClient\Support\Utility;
use N1ebieski\KSEFClient\Requests\Auth\DTOs\XadesSignature;
use N1ebieski\KSEFClient\Requests\Auth\XadesSignature\XadesSignatureXmlRequest;

$client = (new ClientBuilder())->build();

$nip = 'NIP_NUMBER';

$authorisationChallengeResponse = $client->auth()->challenge()->object();

$xml = XadesSignature::from([
    'challenge' => $authorisationChallengeResponse->challenge,
    'contextIdentifierGroup' => [
        'identifierGroup' => [
            'nip' => $nip
        ]
    ],
    'subjectIdentifierType' => 'certificateSubject'
])->toXml();

$signedXml = 'SIGNED_XML_DOCUMENT'; // Sign a xml document via Szafir, ePUAP etc.

$authorisationAccessResponse = $client->auth()->xadesSignature(
    new XadesSignatureXmlRequest($signedXml)
)->object();

$client = $client->withAccessToken($authorisationAccessResponse->authenticationToken->token);

$authorisationStatusResponse = Utility::retry(function () use ($client, $authorisationAccessResponse) {
    $authorisationStatusResponse = $client->auth()->status([
        'referenceNumber' => $authorisationAccessResponse->referenceNumber
    ])->object();

    if ($authorisationStatusResponse->status->code === 200) {
        return $authorisationStatusResponse;
    }

    if ($authorisationStatusResponse->status->code >= 400) {
        throw new RuntimeException(
            $authorisationStatusResponse->status->description,
            $authorisationStatusResponse->status->code
        );
    }
});

$authorisationTokenResponse = $client->auth()->token()->redeem()->object();

$client = $client
    ->withAccessToken(
        token: $authorisationTokenResponse->accessToken->token,
        validUntil: $authorisationTokenResponse->accessToken->validUntil
    )
    ->withRefreshToken(
        token: $authorisationTokenResponse->refreshToken->token,
        validUntil: $authorisationTokenResponse->refreshToken->validUntil
    );

// Do something with the available resources
```

Resources
---------

[](#resources)

### Auth

[](#auth)

 #### Auth Challenge

[](#auth-challenge)

```
$response = $client->auth()->challenge()->object();
```

 #### Auth Xades Signature

[](#auth-xades-signature)

```
use N1ebieski\KSEFClient\Requests\Auth\XadesSignature\XadesSignatureRequest;

$response = $client->auth()->xadesSignature(
    new XadesSignatureRequest(...)
)->object();
```

or:

```
use N1ebieski\KSEFClient\Requests\Auth\XadesSignature\XadesSignatureXmlRequest;

$response = $client->auth()->xadesSignature(
    new XadesSignatureXmlRequest(...)
)->object();
```

 #### Auth Status

[](#auth-status)

```
use N1ebieski\KSEFClient\Requests\Auth\Status\StatusRequest;

$response = $client->auth()->status(
    new StatusRequest(...)
)->object();
```

#### Auth Token

[](#auth-token)

 ##### Auth Token Redeem

[](#auth-token-redeem)

```
$response = $client->auth()->token()->redeem()->object();
```

 ##### Auth Token Refresh

[](#auth-token-refresh)

```
$response = $client->auth()->token()->refresh()->object();
```

#### Auth Sessions

[](#auth-sessions)

 ##### Auth Sessions list

[](#auth-sessions-list)

```
use N1ebieski\KSEFClient\Requests\Auth\Sessions\List\ListRequest;

$response = $client->auth()->sessions()->list(
    new ListRequest(...)
)->object();
```

 ##### Auth Sessions revoke current

[](#auth-sessions-revoke-current)

```
$response = $client->auth()->sessions()->revokeCurrent()->status();
```

 ##### Auth Sessions revoke

[](#auth-sessions-revoke)

```
use N1ebieski\KSEFClient\Requests\Auth\Sessions\Revoke\RevokeRequest;

$response = $client->auth()->sessions()->revoke(
    new RevokeRequest(...)
)->status();
```

### Limits

[](#limits)

 #### Limits Context

[](#limits-context)

```
use N1ebieski\KSEFClient\Requests\Limits\Context\ContextRequest;

$response = $client->limits()->context(
    new ContextRequest(...)
)->object();
```

 #### Limits Subject

[](#limits-subject)

```
use N1ebieski\KSEFClient\Requests\Limits\Subject\SubjectRequest;

$response = $client->limits()->subject(
    new SubjectRequest(...)
)->object();
```

 ### Rate Limits

[](#rate-limits)

```
$response = $client->rateLimits()->object();
```

### Security

[](#security)

 #### Security Public Key Certificates

[](#security-public-key-certificates)

```
$response = $client->security()->publicKeyCertificates()->object();
```

### Sessions

[](#sessions)

 #### Sessions List

[](#sessions-list)

```
use N1ebieski\KSEFClient\Requests\Sessions\List\ListRequest;

$response = $client->sessions()->list(
    new ListRequest(...)
)->object();
```

#### Sessions Invoices

[](#sessions-invoices)

 ##### Sessions Invoices List

[](#sessions-invoices-list)

```
use N1ebieski\KSEFClient\Requests\Sessions\Invoices\List\ListRequest;

$response = $client->sessions()->invoices()->list(
    new ListRequest(...)
)->object();
```

 ##### Sessions Invoices Failed

[](#sessions-invoices-failed)

```
use N1ebieski\KSEFClient\Requests\Sessions\Invoices\Failed\FailedRequest;

$response = $client->sessions()->invoices()->failed(
    new FailedRequest(...)
)->object();
```

 ##### Sessions Invoices Upo

[](#sessions-invoices-upo)

```
use N1ebieski\KSEFClient\Requests\Sessions\Invoices\Upo\UpoRequest;

$response = $client->sessions()->invoices()->upo(
    new UpoRequest(...)
)->body();
```

 ##### Sessions Invoices Ksef Upo

[](#sessions-invoices-ksef-upo)

```
use N1ebieski\KSEFClient\Requests\Sessions\Invoices\KsefUpo\KsefUpoRequest;

$response = $client->sessions()->invoices()->ksefUpo(
    new KsefUpoRequest(...)
)->body();
```

 ##### Sessions Invoices Status

[](#sessions-invoices-status)

```
use N1ebieski\KSEFClient\Requests\Sessions\Invoices\Status\StatusRequest;

$response = $client->sessions()->invoices()->status(
    new StatusRequest(...)
)->object();
```

#### Sessions Online

[](#sessions-online)

 ##### Sessions Online Open

[](#sessions-online-open)

```
use N1ebieski\KSEFClient\Requests\Sessions\Online\Open\OpenRequest;

$response = $client->sessions()->online()->open(
    new OpenRequest(...)
)->object();
```

 ##### Sessions Online Close

[](#sessions-online-close)

```
use N1ebieski\KSEFClient\Requests\Sessions\Online\Close\CloseRequest;

$response = $client->sessions()->online()->close(
    new CloseRequest(...)
)->status();
```

 ##### Sessions Online Send invoices

[](#sessions-online-send-invoices)

for DTO invoice:

```
use N1ebieski\KSEFClient\Requests\Sessions\Online\Send\SendRequest;

$response = $client->sessions()->online()->send(
    new SendRequest(...)
)->object();
```

for XML invoice:

```
use N1ebieski\KSEFClient\Requests\Sessions\Online\Send\SendXmlRequest;

$response = $client->sessions()->online()->send(
    new SendXmlRequest(...)
)->object();
```

#### Sessions Batch

[](#sessions-batch)

 ##### Sessions Batch Open (and send multiple invoices)

[](#sessions-batch-open-and-send-multiple-invoices)

for DTOs invoices:

```
use N1ebieski\KSEFClient\Requests\Sessions\Batch\OpenAndSend\OpenAndSendRequest;

$response = $client->sessions()->batch()->openAndSend(
    new OpenAndSendRequest(...)
)->object();
```

for XMLs invoices:

```
use N1ebieski\KSEFClient\Requests\Sessions\Batch\OpenAndSend\OpenAndSendXmlRequest;

$response = $client->sessions()->batch()->openAndSend(
    new OpenAndSendXmlRequest(...)
)->object();
```

for ZIP invoices:

```
use N1ebieski\KSEFClient\Requests\Sessions\Batch\OpenAndSend\OpenAndSendZipRequest;

$response = $client->sessions()->batch()->openAndSend(
    new OpenAndSendZipRequest(...)
)->object();
```

 ##### Sessions Batch Close

[](#sessions-batch-close)

```
use N1ebieski\KSEFClient\Requests\Sessions\Batch\Close\CloseRequest;

$response = $client->sessions()->batch()->close(
    new CloseRequest(...)
)->status();
```

 #### Sessions Status

[](#sessions-status)

```
use N1ebieski\KSEFClient\Requests\Sessions\Status\StatusRequest;

$response = $client->sessions()->status(
    new StatusRequest(...)
)->object();
```

 #### Sessions Upo

[](#sessions-upo)

```
use N1ebieski\KSEFClient\Requests\Sessions\Upo\UpoRequest;

$response = $client->sessions()->upo(
    new UpoRequest(...)
)->body();
```

### Invoices

[](#invoices)

 #### Invoices Download

[](#invoices-download)

```
use N1ebieski\KSEFClient\Requests\Invoices\Download\DownloadRequest;

$response = $client->invoices()->download(
    new DownloadRequest(...)
)->body();
```

#### Invoices Query

[](#invoices-query)

 ##### Invoices Query Metadata

[](#invoices-query-metadata)

```
use N1ebieski\KSEFClient\Requests\Invoices\Query\Metadata\MetadataRequest;

$response = $client->invoices()->query()->metadata(
    new MetadataRequest(...)
)->object();
```

#### Invoices Exports

[](#invoices-exports)

 ##### Invoices Exports Init

[](#invoices-exports-init)

```
use N1ebieski\KSEFClient\Requests\Invoices\Exports\Init\InitRequest;

$response = $client->invoices()->exports()->init(
    new InitRequest(...)
)->object();
```

 ##### Invoices Exports Status

[](#invoices-exports-status)

```
use N1ebieski\KSEFClient\Requests\Invoices\Exports\Status\StatusRequest;

$response = $client->invoices()->exports()->status(
    new StatusRequest(...)
)->object();
```

### Permissions

[](#permissions)

#### Permissions Persons

[](#permissions-persons)

 ##### Permissions Persons Grants

[](#permissions-persons-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Persons\Grants\GrantsRequest;

$response = $client->permissions()->persons()->grants(
    new GrantsRequest(...)
)->object();
```

#### Permissions Entities

[](#permissions-entities)

 ##### Permissions Entities Grants

[](#permissions-entities-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Entities\Grants\GrantsRequest;

$response = $client->permissions()->entities()->grants(
    new GrantsRequest(...)
)->object();
```

#### Permissions Authorizations

[](#permissions-authorizations)

 ##### Permissions Authorizations Grants

[](#permissions-authorizations-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Authorizations\Grants\GrantsRequest;

$response = $client->permissions()->authorizations()->grants(
    new GrantsRequest(...)
)->object();
```

 ##### Permissions Authorizations Grants Revoke

[](#permissions-authorizations-grants-revoke)

```
use N1ebieski\KSEFClient\Requests\Permissions\Authorizations\Revoke\RevokeRequest;

$response = $client->permissions()->authorizations()->revoke(
    new RevokeRequest(...)
)->object();
```

#### Permissions Indirect

[](#permissions-indirect)

 ##### Permissions Indirect Grants

[](#permissions-indirect-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Indirect\Grants\GrantsRequest;

$response = $client->permissions()->indirect()->grants(
    new GrantsRequest(...)
)->object();
```

#### Permissions Subunits

[](#permissions-subunits)

 ##### Permissions Subunits Grants

[](#permissions-subunits-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Subunits\Grants\GrantsRequest;

$response = $client->permissions()->subunits()->grants(
    new GrantsRequest(...)
)->object();
```

#### Permissions EuEntities

[](#permissions-euentities)

 ##### Permissions EuEntities Grants

[](#permissions-euentities-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\EuEntities\Grants\GrantsRequest;

$response = $client->permissions()->euEntities()->grants(
    new GrantsRequest(...)
)->object();
```

##### Permissions EuEntities Administration

[](#permissions-euentities-administration)

 ##### Permissions EuEntities Administration Grants

[](#permissions-euentities-administration-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\EuEntities\Administration\Grants\GrantsRequest;

$response = $client->permissions()->euEntities()->administration()->grants(
    new GrantsRequest(...)
)->object();
```

#### Permissions Common

[](#permissions-common)

 ##### Permissions Common Grants Revoke

[](#permissions-common-grants-revoke)

```
use N1ebieski\KSEFClient\Requests\Permissions\Common\Revoke\RevokeRequest;

$response = $client->permissions()->common()->revoke(
    new RevokeRequest(...)
)->object();
```

#### Permissions Query

[](#permissions-query)

##### Permissions Query Authorizations

[](#permissions-query-authorizations)

 ##### Permissions Query Authorizations Grants

[](#permissions-query-authorizations-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\Authorizations\Grants\GrantsRequest;

$response = $client->permissions()->query()->authorizations()->grants(
    new GrantsRequest(...)
)->object();
```

##### Permissions Query Entities

[](#permissions-query-entities)

 ##### Permissions Query Entities Grants

[](#permissions-query-entities-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\Entities\Grants\GrantsRequest;

$response = $client->permissions()->query()->entities()->grants(
    new GrantsRequest(...)
)->object();
```

 ##### Permissions Query Entities Roles

[](#permissions-query-entities-roles)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\Entities\Roles\RolesRequest;

$response = $client->permissions()->query()->entities()->roles(
    new RolesRequest(...)
)->object();
```

##### Permissions Query EuEntities

[](#permissions-query-euentities)

 ##### Permissions Query EuEntities Grants

[](#permissions-query-euentities-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\EuEntities\Grants\GrantsRequest;

$response = $client->permissions()->query()->euEntities()->grants(
    new GrantsRequest(...)
)->object();
```

##### Permissions Query Personal

[](#permissions-query-personal)

 ##### Permissions Query Personal Grants

[](#permissions-query-personal-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\Personal\Grants\GrantsRequest;

$response = $client->permissions()->query()->personal()->grants(
    new GrantsRequest(...)
)->object();
```

##### Permissions Query Persons

[](#permissions-query-persons)

 ##### Permissions Query Persons Grants

[](#permissions-query-persons-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\Persons\Grants\GrantsRequest;

$response = $client->permissions()->query()->persons()->grants(
    new GrantsRequest(...)
)->object();
```

##### Permissions Query Subunits

[](#permissions-query-subunits)

 ##### Permissions Query Subunits Grants

[](#permissions-query-subunits-grants)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\Subunits\Grants\GrantsRequest;

$response = $client->permissions()->query()->subunits()->grants(
    new GrantsRequest(...)
)->object();
```

##### Permissions Query SubordinateEntities

[](#permissions-query-subordinateentities)

 ##### Permissions Query SubordinateEntities Roles

[](#permissions-query-subordinateentities-roles)

```
use N1ebieski\KSEFClient\Requests\Permissions\Query\SubordinateEntities\Roles\RolesRequest;

$response = $client->permissions()->query()->subordinateEntities()->roles(
    new RolesRequest(...)
)->object();
```

#### Permissions Operations

[](#permissions-operations)

 ##### Permissions Operations Status

[](#permissions-operations-status)

```
use N1ebieski\KSEFClient\Requests\Permissions\Operations\Status\StatusRequest;

$response = $client->permissions()->operations()->status(
    new StatusRequest(...)
)->object();
```

#### Permissions Attachments

[](#permissions-attachments)

 ##### Permissions Attachments Status

[](#permissions-attachments-status)

```
use N1ebieski\KSEFClient\Requests\Permissions\Attachments\Status\StatusRequest;

$response = $client->permissions()->attachments()->status(
    new StatusRequest(...)
)->object();
```

### Certificates

[](#certificates)

 #### Certificates Limits

[](#certificates-limits)

```
$response = $client->certificates()->limits()->object();
```

#### Certificates Enrollments

[](#certificates-enrollments)

 ##### Certificates Enrollments Data

[](#certificates-enrollments-data)

```
$response = $client->certificates()->enrollments()->data()->object();
```

 ##### Certificates Enrollments Send

[](#certificates-enrollments-send)

```
use N1ebieski\KSEFClient\Requests\Certificates\Enrollments\Send\SendRequest;

$response = $client->certificates()->enrollments()->send(
    new SendRequest(...)
)->object();
```

 ##### Certificates Enrollments Status

[](#certificates-enrollments-status)

```
use N1ebieski\KSEFClient\Requests\Certificates\Enrollments\Status\StatusRequest;

$response = $client->certificates()->enrollments()->status(
    new StatusRequest(...)
)->object();
```

 #### Certificates Retrieve

[](#certificates-retrieve)

```
use N1ebieski\KSEFClient\Requests\Certificates\Retrieve\RetrieveRequest;

$response = $client->certificates()->retrieve(
    new RetrieveRequest(...)
)->object();
```

 #### Certificates Revoke

[](#certificates-revoke)

```
use N1ebieski\KSEFClient\Requests\Certificates\Revoke\RevokeRequest;

$response = $client->certificates()->revoke(
    new RevokeRequest(...)
)->status();
```

 #### Certificates Query

[](#certificates-query)

```
use N1ebieski\KSEFClient\Requests\Certificates\Query\QueryRequest;

$response = $client->certificates()->query(
    new QueryRequest(...)
)->object();
```

### Tokens

[](#tokens)

 #### Tokens Create

[](#tokens-create)

```
use N1ebieski\KSEFClient\Requests\Tokens\Create\CreateRequest;

$response = $client->tokens()->create(
    new CreateRequest(...)
)->object();
```

 #### Tokens List

[](#tokens-list)

```
use N1ebieski\KSEFClient\Requests\Tokens\List\ListRequest;

$response = $client->tokens()->list(
    new ListRequest(...)
)->object();
```

 #### Tokens Status

[](#tokens-status)

```
use N1ebieski\KSEFClient\Requests\Tokens\Status\StatusRequest;

$response = $client->tokens()->list(
    new StatusRequest(...)
)->object();
```

 #### Tokens Revoke

[](#tokens-revoke)

```
use N1ebieski\KSEFClient\Requests\Tokens\Revoke\RevokeRequest;

$response = $client->tokens()->revoke(
    new RevokeRequest(...)
)->status();
```

### Peppol

[](#peppol)

 #### Peppol Query

[](#peppol-query)

```
use N1ebieski\KSEFClient\Requests\Peppol\Query\QueryRequest;

$response = $client->peppol()->query(
    new QueryRequest(...)
)->object();
```

### Testdata

[](#testdata)

#### Testdata Attachment

[](#testdata-attachment)

 ##### Testdata Attachment Approve

[](#testdata-attachment-approve)

```
use N1ebieski\KSEFClient\Requests\Testdata\Attachment\Grant\ApproveRequest;

$response = $client->testdata()->attachment()->approve(
    new ApproveRequest(...)
)->status();
```

 ##### Testdata Attachment Revoke

[](#testdata-attachment-revoke)

```
use N1ebieski\KSEFClient\Requests\Testdata\Attachment\Revoke\RevokeRequest;

$response = $client->testdata()->attachment()->revoke(
    new RevokeRequest(...)
)->status();
```

#### Testdata Person

[](#testdata-person)

 ##### Testdata Person Create

[](#testdata-person-create)

```
use N1ebieski\KSEFClient\Requests\Testdata\Person\Create\CreateRequest;

$response = $client->testdata()->person()->create(
    new CreateRequest(...)
)->status();
```

 ##### Testdata Person Remove

[](#testdata-person-remove)

```
use N1ebieski\KSEFClient\Requests\Testdata\Person\Remove\RemoveRequest;

$response = $client->testdata()->person()->remove(
    new RemoveRequest(...)
)->status();
```

#### Testdata Context

[](#testdata-context)

 ##### Testdata Context Block

[](#testdata-context-block)

```
use N1ebieski\KSEFClient\Requests\Testdata\Context\Block\BlockRequest;

$response = $client->testdata()->context()->block(
    new BlockRequest(...)
)->status();
```

 ##### Testdata Context Unblock

[](#testdata-context-unblock)

```
use N1ebieski\KSEFClient\Requests\Testdata\Context\Unblock\UnblockRequest;

$response = $client->testdata()->context()->unblock(
    new UnblockRequest(...)
)->status();
```

#### Testdata Permissions

[](#testdata-permissions)

 ##### Testdata Permissions Grants

[](#testdata-permissions-grants)

```
use N1ebieski\KSEFClient\Requests\Testdata\Permissions\Grants\GrantsRequest;

$response = $client->testdata()->permissions()->grants(
    new GrantsRequest(...)
)->status();
```

 ##### Testdata Permissions Revoke

[](#testdata-permissions-revoke)

```
use N1ebieski\KSEFClient\Requests\Testdata\Permissions\Revoke\RevokeRequest;

$response = $client->testdata()->permissions()->revoke(
    new RevokeRequest(...)
)->status();
```

#### Testdata Limits

[](#testdata-limits)

##### Testdata Limits Context

[](#testdata-limits-context)

###### Testdata Limits Context Session

[](#testdata-limits-context-session)

 ##### Testdata Limits Context Session Limits

[](#testdata-limits-context-session-limits)

```
use N1ebieski\KSEFClient\Requests\Testdata\Limits\Context\Session\Limits\LimitsRequest;

$response = $client->testdata()->limits()->context()->session()->limits(
    new LimitsRequest(...)
)->status();
```

 ##### Testdata Limits Context Session Reset

[](#testdata-limits-context-session-reset)

```
use N1ebieski\KSEFClient\Requests\Testdata\Limits\Context\Session\Reset\ResetRequest;

$response = $client->testdata()->limits()->context()->session()->reset(
    new ResetRequest(...)
)->status();
```

##### Testdata Limits Subject

[](#testdata-limits-subject)

###### Testdata Limits Subject Certificate

[](#testdata-limits-subject-certificate)

 ##### Testdata Limits Subject Certificate Limits

[](#testdata-limits-subject-certificate-limits)

```
use N1ebieski\KSEFClient\Requests\Testdata\Limits\Subject\Certificate\Limits\LimitsRequest;

$response = $client->testdata()->limits()->subject()->certificate()->limits(
    new LimitsRequest(...)
)->status();
```

 ##### Testdata Limits Subject Certificate Reset

[](#testdata-limits-subject-certificate-reset)

```
use N1ebieski\KSEFClient\Requests\Testdata\Limits\Subject\Certificate\Reset\ResetRequest;

$response = $client->testdata()->limits()->subject()->certificate()->reset(
    new ResetRequest(...)
)->status();
```

#### Testdata Rate Limits

[](#testdata-rate-limits)

 ##### Testdata Rate Limits Limits

[](#testdata-rate-limits-limits)

```
use N1ebieski\KSEFClient\Requests\Testdata\RateLimits\Limits\LimitsRequest;

$response = $client->testdata()->rateLimits()->limits(
    new LimitsRequest(...)
)->status();
```

 ##### Testdata Rate Limits Reset

[](#testdata-rate-limits-reset)

```
use N1ebieski\KSEFClient\Requests\Testdata\RateLimits\Reset\ResetRequest;

$response = $client->testdata()->rateLimits()->reset(
    new ResetRequest(...)
)->status();
```

 ##### Testdata Rate Limits Production

[](#testdata-rate-limits-production)

```
use N1ebieski\KSEFClient\Requests\Testdata\RateLimits\Production\ProductionRequest;

$response = $client->testdata()->rateLimits()->production(
    new ProductionRequest(...)
)->status();
```

### Latarnia

[](#latarnia)

 #### Latarnia Status

[](#latarnia-status)

```
$response = $client->latarnia()->status()->object();
```

 #### Latarnia Messages

[](#latarnia-messages)

```
$response = $client->latarnia()->messages()->object();
```

Examples
--------

[](#examples)

### Integration with a frontend application using certificate-based authentication

[](#integration-with-a-frontend-application-using-certificate-based-authentication)

 ### Conversion of the KSEF certificate and private key from MCU to a .p12 file

[](#conversion-of-the-ksef-certificate-and-private-key-from-mcu-to-a-p12-file)

 ```
use N1ebieski\KSEFClient\Actions\ConvertCertificateToPkcs12\ConvertCertificateToPkcs12Action;
use N1ebieski\KSEFClient\Actions\ConvertCertificateToPkcs12\ConvertCertificateToPkcs12Handler;
use N1ebieski\KSEFClient\Support\Utility;
use N1ebieski\KSEFClient\Factories\CertificateFactory;

$certificate = file_get_contents(Utility::basePath('config/certificates/certificate.crt'));

$privateKey = file_get_contents(Utility::basePath('config/certificates/privateKey.key'));

$certificateToPkcs12 = (new ConvertCertificateToPkcs12Handler())->handle(
    new ConvertCertificateToPkcs12Action(
        certificate: CertificateFactory::makeFromPkcs8($certificate, $privateKey, 'password'),
        passphrase: 'password'
    )
);

file_put_contents(Utility::basePath('config/certificates/ksef-certificate.p12'), $certificateToPkcs12);
```

 ### Generate a KSEF certificate and convert to a .p12 file

[](#generate-a-ksef-certificate-and-convert-to-a-p12-file)

 ```
