PHPackages                             openpublicmedia/pbs-membership-vault-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. openpublicmedia/pbs-membership-vault-php

ActiveLibrary[API Development](/categories/api)

openpublicmedia/pbs-membership-vault-php
========================================

PHP client for interacting with the PBS Membership Vault (MVault) API.

v2.0.0(4y ago)1511Apache-2.0PHPPHP ^8.0

Since Jul 11Pushed 3y ago1 watchersCompare

[ Source](https://github.com/OpenPublicMedia/pbs-membership-vault-php)[ Packagist](https://packagist.org/packages/openpublicmedia/pbs-membership-vault-php)[ RSS](/packages/openpublicmedia-pbs-membership-vault-php/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependencies (6)Versions (6)Used By (0)

PBS Membership Vault PHP Library
================================

[](#pbs-membership-vault-php-library)

This library abstracts interactions with the [PBS Membership Vault API](https://docs.pbs.org/display/MV/Membership+Vault+API).

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

[](#installation)

Install via composer:

```
composer require openpublicmedia/pbs-membership-vault-php
```

Use
---

[](#use)

The primary class provided by this library is `OpenPublicMedia\PbsMembershipVault\Client`. A `Client` instance can be used to interact with membership data in various ways.

### Response data structures

[](#response-data-structures)

Responses from the `Client` class will return a Generator when querying for multiple memberships (e.g. with `getMemberships`) or a single `stdClass` object when querying for a specific membership record (e.g. with `getMembershipById($id)`).

### Examples

[](#examples)

#### Creating a client

[](#creating-a-client)

```
use OpenPublicMedia\PbsMembershipVault\Client;

$api_key = 'xxxxxxxxxxxxxx';
$api_secret = 'xxxxxxxxxxx';
$station_id = 'xxxxxxxxxxx';

$client = new Client($api_key, $api_secret, $station_id);
```

#### Getting a Membership by ID

[](#getting-a-membership-by-id)

```
$id = 'xxxxxxxxxxx';
$membership = $client->getMembershipById($id);
var_dump($membership);
class stdClass#34 (18) {
  public $grace_period => string
  public $update_date => string
  public $first_name => string
  public $last_name => string
  public $create_date => string
  public $offer => string
  public $notes => string
  public $current_state =>
  class stdClass#28 (2) {
    public $explanation =>
    class stdClass#35 (3) {
      public $status => string
      public $timing => string
      public $token_activated bool
    }
    public $has_access => bool
  }
  public $membership_id => string
  public $start_date => string
  public $status => string
  public $token => string
  public $additional_metadata => string
  public $activation_date => string
  public $provisional => bool
  public $expire_date => string
  public $pbs_profile =>
  class stdClass#24 (7) {
    public $first_name => string
    public $last_name => string
    public $UID => string
    public $birth_date => string
    public $retrieval_status =>
    class stdClass#23 (2) {
      public $status => int
      public $message => string
    }
    public $email => string
    public $login_provider => string
  }
  public $email => string
}
```

#### Getting all activated Memberships

[](#getting-all-activated-memberships)

```
$memberships = $client->getActivatedMemberships();
var_dump(count($memberships));
int(51763)
foreach ($memberships as $membership) {
    var_dump($membership);
    class stdClass#29 (18) {...}
}
```

#### Adding a new Membership

[](#adding-a-new-membership)

```
$start_date = new DateTime();
$expire_date = clone($start_date);
$expire_date->add(new DateInterval('P1Y'));

$membership = $client->addMembership(
    'membership_id',
    'first_name',
    'last_name',
    'offer',
    $start_date
    $expire_date
);

var_dump($membership);
class stdClass#29 (18) {...}
```

#### Updating an existing Membership

[](#updating-an-existing-membership)

```
$membership_id = 'xxxxxxxx';

$membership = $client->getMembershipById($membership_id);
var_dump($membership->notes);
string(0) ""

$result = $client->updateMembership($membership_id, ['notes' => 'Updated notes']);
var_dump($result);
bool(true)

$membership = $client->getMembershipById($membership_id);
var_dump($membership->notes);
string(13) "Updated notes"
```

#### Handling exceptions

[](#handling-exceptions)

Most `Client` methods can throw `OpenPublicMedia\PbsMembershipVault\Exception\BadRequestException`. This exception will include a JSON encoded message that can be used to determine follow-up actions.

```
$start_date = new DateTime();
$expire_date = clone($start_date);
$expire_date->add(new DateInterval('P1Y'));

try {
    $membership = $client->addMembership(
        'membership_id',
        '',
        '',
        'offer',
        $start_date,
        $end_date
    );
} catch (BadRequestException $e) {
    $errors = json_decode($e->getMessage());
    var_dump($errors);
    class stdClass#31 (2) {
      public $first_name =>
      array(1) {
        [0] =>
        string(23) "This field is required."
      }
      public $last_name =>
      array(1) {
        [0] =>
        string(23) "This field is required."
      }
    }
}
```

The exception `OpenPublicMedia\PbsMembershipVault\Exception\MembershipNotFoundException`indicates a Membership has not been found for a provided ID.

```
$membership_id = 'does_not_exist';
try {
    $membership = $client->getMembershipById($membership_id);
} catch (MembershipNotFoundException $e) {
    $response = json_decode($e->getMessage());
    var_dump($response);
    class stdClass#29 (2) {
      public $type =>
      string(2) "id"
      public $value =>
      string(17) "does_not_exist"
    }
}
```

The exception `\OpenPublicMedia\PbsMembershipVault\Exception\MembershipActivatedException`indicates a Membership has already been activated by a PBS Account other than the one request.

```
$membership_id = 'ALREADY_ACTIVATED';
$uid = '11111111-2222-3333-4444-555555555555'
try {
    $membership = $client->activateMembership($membership_id, $uid);
} catch (MembershipActivatedException $e) {
    $response = json_decode($e->getMessage());
    var_dump($response);
    object(stdClass)#31 (3) {
      ["message"]=>
      string(101) "The membership ALREADY_ACTIVATED was already activated with UID 11111111-2222-3333-4444-555555555555"
      ["id"]=>
      string(18) "ALREADY_ACTIVATED"
      ["uid"]=>
      string(36) "11111111-2222-3333-4444-555555555555"
    }
    var_dump($e->getMembershipId());
    string(18) "ALREADY_ACTIVATED"
    var_dump($e->getPbsAccountUid());
    string(36) "11111111-2222-3333-4444-555555555555"

}
```

The exception `\OpenPublicMedia\PbsMembershipVault\Exception\AnotherMembershipActivatedException`indicates a PBS Account has already activated a different membership.

```
$membership_id = '0123456789ABCDEF';
$uid = '11111111-2222-3333-4444-555555555555'
try {
    $membership = $client->activateMembership($membership_id, $uid);
} catch (MembershipActivatedException $e) {
    $response = json_decode($e->getMessage());
    var_dump($response);
    object(stdClass)#31 (3) {
      ["message"]=>
      string(96) "The UID 11111111-2222-3333-4444-555555555555 has already activated membership 0123456789ABCDEF"
      ["id"]=>
      string(18) "0123456789ABCDEF"
      ["uid"]=>
      string(36) "11111111-2222-3333-4444-555555555555"
    }
    var_dump($e->getMembershipId());
    string(18) "0123456789ABCDEF"
    var_dump($e->getPbsAccountUid());
    string(36) "11111111-2222-3333-4444-555555555555"

}
```

Development goals
-----------------

[](#development-goals)

See [CONTRIBUTING](CONTRIBUTING.md) for information about contributing to this project.

### v1

[](#v1)

- API authentication (`OpenPublicMedia\PbsMembershipVault\Client`)
- API direct querying (`$client->request()`)
- Result/error handling
- Transparent paged response handling (`OpenPublicMedia\PbsMembershipVault\Response\PagedResponse`)
- Membership
    - Membership:get
    - Membership:list\_token (this "list" endpoint returns a single result)
    - Membership:put
    - Membership:update (PATCH)
    - Membership:delete
- Memberships
    - Membership:list
    - Memberships:last\_updated\_since
    - Memberships:active?
    - Memberships:email
    - Membership:deleted
    - Membership:deleted?since
    - Membership:list\_activated
    - Membership:list\_activated/?since
    - Membership:list\_provisional
    - Membership:list\_provisional/?since
    - Membership:list\_grace\_period
    - Membership:list\_uid
- Examples/detailed documentation

### v2

[](#v2)

- PHP 8 support

### v3.x

[](#v3x)

- Membership entity (to replace stdClass)
- Improved handling of API error responses
- Improved handling of activation specifically
- Get membership by MVault ID

###  Health Score

30

—

LowBetter than 62% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity68

Established project with proven stability

 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 ~334 days

Total

5

Last Release

1207d ago

Major Versions

v1.0.1 → v2.0.02021-12-14

v2.0.0 → 3.0.0-alpha12023-02-15

PHP version history (3 changes)v1.0.0PHP &gt;=7.1

v1.0.1PHP &gt;=7.2

v2.0.0PHP ^8.0

### Community

Maintainers

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

---

Top Contributors

[![cdubz](https://avatars.githubusercontent.com/u/10456740?v=4)](https://github.com/cdubz "cdubz (18 commits)")

---

Tags

api-clientphp

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/openpublicmedia-pbs-membership-vault-php/health.svg)

```
[![Health](https://phpackages.com/badges/openpublicmedia-pbs-membership-vault-php/health.svg)](https://phpackages.com/packages/openpublicmedia-pbs-membership-vault-php)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.8k532.1M19.4k](/packages/laravel-framework)[craftcms/cms

Craft CMS

3.6k3.6M2.9k](/packages/craftcms-cms)[tencentcloud/tencentcloud-sdk-php

TencentCloudApi php sdk

3661.2M46](/packages/tencentcloud-tencentcloud-sdk-php)[php-soap/wsdl

Deals with WSDLs

183.8M18](/packages/php-soap-wsdl)[eslazarev/wildberries-sdk

Wildberries OpenAPI clients (generated).

252.5k](/packages/eslazarev-wildberries-sdk)[files.com/files-php-sdk

Files.com PHP SDK

2478.1k](/packages/filescom-files-php-sdk)

PHPackages © 2026

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