PHPackages                             lukapeharda/kourses-php - 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. lukapeharda/kourses-php

ActiveLibrary[API Development](/categories/api)

lukapeharda/kourses-php
=======================

Kourses API PHP library

1.3.5(10mo ago)01.9k↓50%MITPHPPHP &gt;=5.6.0

Since Apr 22Pushed 10mo ago1 watchersCompare

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

READMEChangelog (1)Dependencies (2)Versions (17)Used By (0)

Kourses PHP bindings
====================

[](#kourses-php-bindings)

The Kourses PHP library provides access to Kourses API from applications written in PHP. It includes a pre-defined set of classes for API resources such as `members`, `memberships` and `permissions`.

Requirements
------------

[](#requirements)

PHP 5.6.0 and later.

Installation
------------

[](#installation)

You can install the library via [Composer](http://getcomposer.org/). Run the following command:

```
composer require lukapeharda/kourses-php
```

To use the library, use Composer's [autoload](https://getcomposer.org/doc/01-basic-usage.md#autoloading):

```
require_once('vendor/autoload.php');
```

Getting Started
---------------

[](#getting-started)

Visit Kourses [Settings / API keys](https://app.kourses.com/settings/api-keys) page and generate API key. Each key is tied to only one of your website. Copy your API key as you won't be able to access the token later on.

API key should go in HTTP `Authorization` header as a bearer token:

```
Authorization: Bearer GENERATED_API_TOKEN

```

### First initialize a client and set the token

[](#first-initialize-a-client-and-set-the-token)

```
$kourses = new KoursesPhp\Client();
$kourses->setApiKey('GENERATED_API_TOKEN');
```

If you want to access beta environment of Kourses app, use `setApiBaseUrl` method to change the URL:

```
$kourses->setApiBaseUrl('https://app.kourses-beta.com/api/');
```

### Fetching memberships

[](#fetching-memberships)

To fetch all published memberships use `memberships` resource and the `all` method:

```
$memberships = $kourses->memberships->all();
```

Returned data will be paginated (default number of memberships per page is 100). In order to change number of memberships per page or current page use `page` and `per_page` params (respectively):

```
$memberships = $kourses->memberships->all([
    'per_page' => 10,
    'page' => 2,
]);
```

You can iterate over `$memberships` to get `KoursesPhp\Membership` entities.

There are several helpful methods to handle pagination:

```
$memberships->getCurrentPage(); // returns current page number
$memberships->getLastPage(); // returns last page number
$memberships->getTotal(); // returns total number of memberships
$memberships->getFrom(); // returns current page items range start
$memberships->getTo(); // returns current page items range end
$memberships->getPerPage(); // returns number of memberships per page
```

### Creating members

[](#creating-members)

Use `create` method on the `members` resource:

```
$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
]);
```

If member was found (based on their email address) they will be updated with the rest of the given data.

You may set a list of `memberships` for which the member should get access to in the same API call:

```
$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => ['MEMBERSHIP#1', 'MEMBERSHIP#2'],
]);

// or

$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => [
        [
            'id' => 'MEMBERSHIP#1'
        ], [
            'id' => 'MEMBERSHIP#2'
        ]
    ],
]);
```

#### Sending activation email

[](#sending-activation-email)

By default, when new member is created they will be sent an activation email.

To disable this set `send_activation_notification` to `0`:

```
$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'send_activation_notification' => 0,
]);
```

#### Setting permission expiry dates

[](#setting-permission-expiry-dates)

For each membership you can set future expiry date using `memberships_ends_at` param or nested `memberships[0][ends_at]`. Date given needs to be in `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` format:

```
$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => ['MEMBERSHIP#1', 'MEMBERSHIP#2'],
    'memberships_ends_at' => [
        'MEMBERSHIP#1' => '2030-04-05',
    ],
]);

// or

$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => [
        [
            'id' => 'MEMBERSHIP#1',
            'ends_at' => '2030-04-05'
        ], [
            'id' => 'MEMBERSHIP#2'
        ]
    ],
]);
```

#### Skipping drip schedule

[](#skipping-drip-schedule)

For each membership you can disable drip schedule using `memberships_skip_drip_schedule` param or nested `memberships[0][skip_drip_schedule]`:

```
$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => ['MEMBERSHIP#1', 'MEMBERSHIP#2'],
    'memberships_skip_drip_schedule' => [
        'MEMBERSHIP#1' => 0,
    ],
]);

// or

$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => [
        [
            'id' => 'MEMBERSHIP#1',
            'skip_drip_schedule' => 0
        ], [
            'id' => 'MEMBERSHIP#2'
        ]
    ],
]);
```

By default it will honor the set drip schedule.

#### Running membership's email integrations

[](#running-memberships-email-integrations)

For each membership you can enable running of email integrations using `memberships_run_email_integrations` param (or nested `memberships[0][run_email_integrations]`):

```
$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => ['MEMBERSHIP#1', 'MEMBERSHIP#2'],
    'memberships_run_email_integrations' => [
        'MEMBERSHIP#1' => 1,
    ],
]);

// or

$member = $kourses->members->create([
    'email' => 'john.doe@example.com',
    'first_name' => 'John',
    'last_name' => 'Doe',
    'memberships' => [
        [
            'id' => 'MEMBERSHIP#1',
            'run_email_integrations' => 1
        ], [
            'id' => 'MEMBERSHIP#2'
        ]
    ],
]);
```

### Fetching allowed memberships for a member

[](#fetching-allowed-memberships-for-a-member)

Use `memberMemberships` resource and `all` method to fetch a list of all memberships that member was granted access to:

```
$memberships = $kourses->memberMemberships->all([
    'member' => 'MEMBER#1',
]);
```

You can even use member's email address to fetch the memberships:

```
$memberships = $kourses->memberMemberships->all([
    'member' => 'john.doe@example.com',
]);
```

Returned data will be paginated (default number of memberships per page is 100). In order to change number of memberships per page or current page use `page` and `per_page` params (respectively):

```
$memberships = $kourses->memberMemberships->all([
    'member' => 'MEMBER#1',
    'per_page' => 10,
    'page' => 2,
]);
```

### Generate one-click login link for a member

[](#generate-one-click-login-link-for-a-member)

Use `memberLoginLink` resource and its `create` method to generate temporary signed login link.

```
$loginLink = $koures->memberLoginLink->create([
    'member' => 'MEMBER#1',
]);
```

Returned `$loginLink` object will have a `login_link` property which you can serve to your user in order for them to log in. `expires_at` property which holds the timestamp (ISO-8601) then the login link will expire.

Signed link will expired in 5 mins (300 seconds).

You can even use member's email address to generate the link:

```
$loginLink = $kourses->memberLoginLink->create([
    'member' => 'john.doe@example.com',
]);
```

If you wish to redirect the member after successful login specify a `redirect` param with relative path:

```
$loginLink = $kourses->memberLoginLink->create([
    'member' => 'john.doe@example.com',
    'redirect' => 'account/profile',
]);
```

### Grant a permission

[](#grant-a-permission)

To grant a permission you need to call `create` method on `permissions` resource and provide a member ID (or their email address) and a membership ID:

```
$status = $kourses->permissions->create([
    'member' => 'MEMBER#1',
    'membership' => 'MEMBERSHIP#1',
]);
```

You can add and extra `ends_at` param to specify permission expiry date. Date given needs to be in `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` format:

```
$status = $kourses->permissions->create([
    'member' => 'MEMBER#1',
    'membership' => 'MEMBERSHIP#1',
    'ends_at' => '2030-04-05',
]);
```

If you wish to skip drip schedule set for a given membership use `skip_drip_schedule` and set it to `0`:

```
$status = $kourses->permissions->create([
    'member' => 'MEMBER#1',
    'membership' => 'MEMBERSHIP#1',
    'skip_drip_schedule' => 0,
]);
```

If you wish to run email integrations for a given membership use `run_email_intgrations` and set it to `1`:

```
$status = $kourses->permissions->create([
    'member' => 'MEMBER#1',
    'membership' => 'MEMBERSHIP#1',
    'run_email_intgrations' => 0,
]);
```

By default the set drip schedule will be honored.

### Revoke a permission

[](#revoke-a-permission)

To revoke a permission you need to call `delete` method on `permissions` resource and provide a member ID (or their email address) and a membership ID:

```
$status = $kourses->permissions->delete([
    'member' => 'MEMBER#1',
    'membership' => 'MEMBERSHIP#1',
]);
```

You can add and extra `ends_at` param to specify permission expiry date. Date given needs to be in `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` format:

```
$status = $kourses->permissions->delete([
    'member' => 'MEMBER#1',
    'membership' => 'MEMBERSHIP#1',
    'ends_at' => '2030-04-05',
]);
```

Documentation
-------------

[](#documentation)

Check out [examples](https://github.com/lukapeharda/kourses-php/tree/main/examples) folder for some basic use cases. Full documentation is available on [developer.kourses.com](https://developer.kourses.com).

###  Health Score

37

—

LowBetter than 83% of packages

Maintenance53

Moderate activity, may be stable

Popularity19

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity55

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~102 days

Recently: every ~163 days

Total

16

Last Release

326d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/cd692eb7c3ea730aae6d7dbce5e8cb641011c0e23002fd991667df87d63019b6?d=identicon)[lpeharda](/maintainers/lpeharda)

---

Top Contributors

[![lukapeharda](https://avatars.githubusercontent.com/u/2076692?v=4)](https://github.com/lukapeharda "lukapeharda (20 commits)")

---

Tags

apimembershipkourses

### Embed Badge

![Health badge](/badges/lukapeharda-kourses-php/health.svg)

```
[![Health](https://phpackages.com/badges/lukapeharda-kourses-php/health.svg)](https://phpackages.com/packages/lukapeharda-kourses-php)
```

###  Alternatives

[smodav/mpesa

M-Pesa API implementation

16363.7k1](/packages/smodav-mpesa)[ardakilic/mutlucell

Mutlucell SMS API wrapper for sending sms text messages for Laravel

457.3k](/packages/ardakilic-mutlucell)[dariusiii/tmdb-laravel

Laravel Package for TMDB ( The Movie Database ) API. Provides easy access to the wtfzdotnet/php-tmdb-api library.

1821.1k](/packages/dariusiii-tmdb-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
