PHPackages                             visitor-analytics/3as-sdk - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. visitor-analytics/3as-sdk

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

visitor-analytics/3as-sdk
=========================

PHP SDK for 3AS Companies

3.0.4(1y ago)04.1k↓33.3%PHP

Since Apr 18Pushed 1mo ago2 watchersCompare

[ Source](https://github.com/twipla/visa-3as-php-sdk)[ Packagist](https://packagist.org/packages/visitor-analytics/3as-sdk)[ RSS](/packages/visitor-analytics-3as-sdk/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (7)Versions (37)Used By (0)

TWIPLA PHP SDK
==============

[](#twipla-php-sdk)

A simple API wrapper for integrating the Analysis as a Service (3AS) APIs provided by TWIPLA

Getting started
---------------

[](#getting-started)

1. [Create an RSA Key Pair (PEM format)](#creating-an-rsa-key-pair)
2. Send the resulting public key (`jwtRS256.key.pub`) to the TWIPLA Dev Team
3. [Install the library](#installation)
4. [Use the SDK instance](#how-to-use-the-library) to interract with the API

Creating an RSA Key pair
------------------------

[](#creating-an-rsa-key-pair)

1. Create the keypair: `ssh-keygen -t rsa -b 2048 -m PEM -f jwtRS256.key`
2. Convert the public key to PEM: `openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub`

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

[](#installation)

### Composer

[](#composer)

#### Install via Composer

[](#install-via-composer)

```
composer require visitor-analytics/3as-sdk

```

How to use the library
----------------------

[](#how-to-use-the-library)

```
$visa = new VisitorAnalytics([
     'intp' => [
         'id' => {INTP_ID},
         'privateKey' => {INTP_RS256_PRIVATE_KEY}
     ],
     'env' => 'stage'
]);
```

Concepts
--------

[](#concepts)

### Terms

[](#terms)

- **INTP (Integration Partner)**
    The company that is integrating the analytics as a service solution (3AS)
- **STPs (Server Touchpoints)**
    Credits used to measure data usage for a given website
- **Intpc (INTPC integration partner customer)**
    One user of the INTP, can have many websites
- **Website**
    The website where data will be tracked. It has a subscription with a package with a certain limit of STPs. This subscription can be upgraded or downgraded. When the website is created a tracking code snippet is returned that must be embedded within the websites HTML.
- **Package**
    A package has a price and contains a certain number of STPs. They are used when upgrading/downgrading the subscription of a website.

### General

[](#general)

Most endpoints that deal with customers or websites support some form of an ID which can be provided and then used for all following requests.

For example creating a new customer with a website requires an `intpCustomerId`|`intpcId` and an `intpWebsiteId`. These must be provided by the INTP and are intended to make integrations easier because there is no need to save any external IDs. Then when getting data about a customer the request is done using the same `intpCustomerId` provided on creation.

### Subscription Types

[](#subscription-types)

There are currently **two types of subscription** available:

#### 1. `Website` Subscription

[](#1-website-subscription)

- Applies to a **single website**.
- Created using an **`intp` package**, which defines the subscription plan.
- Can be billed **monthly** or **yearly**.
- Each `website` subscription is tied to an **`intpc`**, which is the entity responsible for creating the website.

#### 2. `Intpc` Subscription

[](#2-intpc-subscription)

- Covers **one or more websites** under a single subscription.
- Created using an **`intp` package**, which defines the subscription plan.
- Can be billed **monthly** or **yearly**.
- The **touchpoint limit** defined by the package is **shared across all associated websites**.
- The `intpc` can **monitor individual usage** per website, providing detailed insights into how each site consumes touchpoints.
- Ideal for managing multiple websites with a **centralized billing**.

### Example implementation flow

[](#example-implementation-flow)

1. Create a new intpc with a website
2. Inject the resulting tracking code in the website's HTML
3. Use the SDK's [generate iframe url](#generate-the-visitoranalytics-dashboard-iframe-url) method to create an url
4. Show an iframe to the user with the url created previously
5. Show a modal to the user to upgrade his subscription
6. Display all the available packages using the SDK
7. After the payment is complete, use the SDK to upgrade the subscription of the website

Available APIs
--------------

[](#available-apis)

- [INTPCs](#intpcs-api)
- [INTPC](#intpc-api)
- [Package](#package-api)
- [Packages](#packages-api)
- [Website](#website-api)
- [Websites](#websites-api)
- [Utils](#utils-api)

### INTPCs API

[](#intpcs-api)

Integration partners (INTP) are able to get data about their customers (INTPc).

#### Register and start an INTPc level subscription. This will allow subsequently added websites to consume from the same `touchpoint` pool provided by the `package` used during setup.

[](#register-and-start-an-intpc-level-subscription-this-will-allow-subsequently-added-websites-to-consume-from-the-same-touchpoint-pool-provided-by-the-package-used-during-setup)

```
$visa->intpcs->create([
        'intpCustomerId' => {INTP_CUSTOMER_ID},
        'email' => {INTP_CUSTOMER_EMAIL},
        'packageId' => {PACKAGE_UUID},
        'billingDate' => {ISO_DATE_STRING} (optional, defaults to current time)
        'website' => [
            'intpWebsiteId' => {INTP_WEBSITE_ID},
            'domain' => {INTP_WEBSITE_DOMAIN_URI},
        ]
]);
```

#### Register an INTPc and start a website level subscription. Each added website will have its own subscription.

[](#register-an-intpc-and-start-a-website-level-subscription-each-added-website-will-have-its-own-subscription)

```
$visa->intpcs->create([
        'intpCustomerId' => {INTP_CUSTOMER_ID},
        'email' => {INTP_CUSTOMER_EMAIL},
        'website' => [
            'intpWebsiteId' => {INTP_WEBSITE_ID},
            'domain' => {INTP_WEBSITE_DOMAIN_URI},
            'packageId' => {PACKAGE_UUID},
            'billingDate' => {ISO_DATE_STRING} (optional, defaults to current time)
        ]
]);
```

#### Register an INTPc without register a website. Websites can be added further using the [Add Website](#create-a-website-with-its-own-subscription-and-attach-it-to-an-existing-intpc) endpoint.

[](#register-an-intpc-without-register-a-website-websites-can-be-added-further-using-the-add-website-endpoint)

```
$visa->intpcs->create([
        'intpCustomerId' => {INTP_CUSTOMER_ID},
        'email' => {INTP_CUSTOMER_EMAIL},
]);
```

#### List all available customers

[](#list-all-available-customers)

```
$visa->intpcs->list();
```

#### Get a single intpc by its INTP given id

[](#get-a-single-intpc-by-its-intp-given-id)

```
$visa->intpcs->getByIntpCustomerId({INTP_CUSTOMER_ID});
```

### INTPC API

[](#intpc-api)

#### List all websites belonging to an INTP Customer

[](#list-all-websites-belonging-to-an-intp-customer)

```
$visa->intpc({INTP_CUSTOMER_ID})->listWebsites();
```

#### Delete a Customer belonging to an INTP

[](#delete-a-customer-belonging-to-an-intp)

```
$visa->intpc({INTP_CUSTOMER_ID})->delete();
```

#### Generate the VisitorAnalytics Dashboard IFrame Url

[](#generate-the-visitoranalytics-dashboard-iframe-url)

This is one of the essential methods to use when using the iframe appoach 3AS. It creates an URL for a given customer and website combination that shows the TWIPLA dashboard in the theme configured by the INTP.

```
$visa->intpc({INTP_CUSTOMER_ID})->generateIFrameDashboardUrl({INTP_WEBSITE_ID});
```

### Packages API

[](#packages-api)

An Integration Partner (INTP) is able to get data about their packages

#### List all available packages

[](#list-all-available-packages)

Returns all packages available within the company. Filtering options: INTP\_WEBSITE\_ID - Filters the response to return only packages visible to this website — all public packages plus any custom ones assigned to it. INTP\_CUSTOMER\_ID - Filters the response to return only packages visible to this customer — all public packages plus any custom ones assigned to it.

```
$visa->packages->list({INTP_WEBSITE_ID}, {INTP_CUSTOMER_ID});
```

#### Get a single package by ID

[](#get-a-single-package-by-id)

```
$visa->packages->getById({PACKAGE_UUID});
```

#### Create a package

[](#create-a-package)

```
$visa->packages->create([
    'name' => {PACKAGE_NAME},
    'touchpoints' => {TOUCHPOINT_LIMIT},
    'price' => {FLOAT},
    'currency' => {CURRENCY_CODE}, // ex: EUR, USD, RON
    'period' => {PERIOD}, // ex: monthly, yearly
    'visibility' => {'public'|'restricted'}, // controls who can access the package. 'public' packages are available to all clients; 'restricted' packages can be assigned to specific clients only.
]);
```

### Package API

[](#package-api)

#### An INTP can update its packages

[](#an-intp-can-update-its-packages)

```
$visa->package({PACKAGE_UUID})->update([
    'name' => {UPDATED_PACKAGE_NAME}
]);
```

#### An INTP can assign a package to a target

[](#an-intp-can-assign-a-package-to-a-target)

Assign a custom package to a specific client {TARGET\_ID} - this is a website ID or a customer ID depending on your subscription type.

Note: Only packages with visibility = restricted can be used.

Steps:

```
1. Create the customer or website (if they don't already exist). They will initially use the free or unlimited free plan.
2. Create a custom package with visibility = restricted.
3. Assign the package to the specific customer or website using this endpoint.
4. Upgrade the subscription to this custom package.

```

```
$visa->package({PACKAGE_UUID})->assign({TARGET_ID});
```

#### An INTP can unassign a package to a target

[](#an-intp-can-unassign-a-package-to-a-target)

Unassign a custom package from a specific client {TARGET\_ID} - this is a website ID or a customer ID depending on your subscription type.

Note: If an active subscription exists for this package, unassigning it will not cancel the subscription — it will continue to run as normal until the package is explicitly changed.

```
$visa->package({PACKAGE_UUID})->unassign({TARGET_ID});
```

### Websites API

[](#websites-api)

#### List all websites

[](#list-all-websites)

```
$visa->websites->list();
```

#### Get a single website by its INTP given id

[](#get-a-single-website-by-its-intp-given-id)

```
$visa->websites->getByIntpWebsiteId({INTP_WEBSITE_ID});
```

#### Create a website with its own subscription and attach it to an existing INTPc

[](#create-a-website-with-its-own-subscription-and-attach-it-to-an-existing-intpc)

```
$visa->websites->create([
    'website' => [
        'id' => {INTP_WEBSITE_ID|STRING},
        'domain' => {INTP_WEBSITE_DOMAIN},
        'package' => [
            'id' => {UUID},
            'billingDate' => {ISO_DATE_STRING} (optional, defaults to current time)
        ]
    ],
    'intpc' => [
        'id' => {INTP_CUSTOMER_ID|STRING}
    ],
]);
```

#### Create a website and attach it to an existing INTPc subscription. This website, alongside other pre-existing website will consume `touchpoints` from the same pool.

[](#create-a-website-and-attach-it-to-an-existing-intpc-subscription-this-website-alongside-other-pre-existing-website-will-consume-touchpoints-from-the-same-pool)

```
$visa->websites->create([
    'website' => [
        'id' => {INTP_WEBSITE_ID|STRING},
        'domain' => {INTP_WEBSITE_DOMAIN},
    ],
    'intpc' => [
        'id' => {INTP_CUSTOMER_ID|STRING}
    ],
]);
```

#### Create a website with its own `30 day, unlimited free trial` subscription and attach it to an INTPc. After the 30 day free trial ends, the subscription will be downgraded to the `free` package.

[](#create-a-website-with-its-own-30-day-unlimited-free-trial-subscription-and-attach-it-to-an-intpc-after-the-30-day-free-trial-ends-the-subscription-will-be-downgraded-to-the-free-package)

```
$visa->websites->create([
    'website' => [
        'id' => {INTP_WEBSITE_ID|STRING},
        'domain' => {INTP_WEBSITE_DOMAIN},
    ],
    'intpc' => [
        'id' => {INTP_CUSTOMER_ID|STRING}
    ],
    'opts' => [
        'uft' => true
    ]
]);
```

### Website API

[](#website-api)

#### Delete a website by its INTP given id

[](#delete-a-website-by-its-intp-given-id)

```
$visa->website({INTP_WEBSITE_ID})->delete());
```

#### Add a whitelisted domain

[](#add-a-whitelisted-domain)

```
visa->website({INTP_WEBSITE_ID})->addWhitelistedDomain(STRING);
```

#### Delete a whitelisted domain

[](#delete-a-whitelisted-domain)

```
visa->website({INTP_WEBSITE_ID})->deleteWhitelistedDomain(STRING);
```

#### List all whitelisted domains

[](#list-all-whitelisted-domains)

```
visa->website({INTP_WEBSITE_ID})->listWhitelistedDomains();
```

#### Create an api key for a website

[](#create-an-api-key-for-a-website)

```
$visa->website({INTP_WEBSITE_ID})->createApiKey([
    'name' => {STRING}, // Name to identify the API key
    'comment' => {STRING|OPTIONAL}, // Optional description or notes
    'expiresAt' => {ISO_STRING|OPTIONAL} // Expiration timestamp (ISO 8601); unlimited if omitted
]);

[
    'id' => {UUID_STRING}, // Unique ID of the API key
    'name' => {STRING}, // Name of the API key
    'apiKey' => {STRING}, // The actual API key (only returned once — save it immediately!)
    'comment' => {STRING},
    'createdAt' => {ISO_STRING},
    'expiresAt' => {ISO_STRING},
    'intpWebsiteId' => {STRING},
    'intpCustomerId' => {STRING}
]

⚠️ Note: apiKey is only returned at creation time. Make sure to store it securely — it cannot be retrieved again.
```

#### List api keys for a website

[](#list-api-keys-for-a-website)

```
$visa->website({INTP_WEBSITE_ID})->listApiKeys();

[
    [
        'id' => {UUID_STRING},
        'name' => {STRING},
        'comment' => {STRING},
        'createdAt' => {ISO_STRING},
        'expiresAt' => {ISO_STRING},
        'intpWebsiteId' => {STRING},
        'intpCustomerId' => {STRING}
    ]
]
```

#### Delete an api key for a website

[](#delete-an-api-key-for-a-website)

```
$visa->website({INTP_WEBSITE_ID})->deleteApiKey({ID});
```

### Website Contributors API

[](#website-contributors-api)

Manage contributors for a website and control their level of access. Any existing customer can be added as a contributor. If the customer doesn't exist yet, create them first before adding them as a contributor — no website is required at creation time. Once added, the contributor can access the dashboard normally via the dashboard iframe URL, where the website ID is the ID of the website they contribute to. If the website selector is enabled within the dashboard, the contributor will also see the website listed there, alongside any websites they own.

Each contributor is assigned one of the following roles:

RoleConstantAccess**Editor**`editor`Full edit access, including content updates and structural changes.**Watcher**`watcher`View-only access to website data. Cannot make any edits.**Custom Dashboard Contributor**`dashboard`View-only access to custom dashboards explicitly shared with them. No access to any other platform content or settings. Access to specific dashboards is granted by the website owner from within the dashboard.---

#### Add contributor for a website

[](#add-contributor-for-a-website)

The contributor will gain access to the dashboard with restricted permissions. The level of access and available actions depend on the assigned role.

A contributor can be assigned only one role at a time.

Roles follow a permission hierarchy, where higher-level roles automatically include the permissions granted by lower-level roles.

This endpoint can also be used to update a contributor's role. If the same contributor is added again with a different role, the previous role will be replaced with the new one.

```
$visa->website({INTP_WEBSITE_ID})->addContributor([
    "intpCustomerId" => "{INTP_CUSTOMER_ID}",
    "role" => "editor"|"watcher"|"dashboard",
]);
```

#### List contributors for a website

[](#list-contributors-for-a-website)

List all contributors of a website

```
$visa->website({INTP_WEBSITE_ID})->listContributors();

[
    "owner" => [
        "intpCustomerId" => "{INTP_CUSTOMER_ID}",
        "email" => "owner_email_string",
    ],
    "contributors" => [
        "editor" => [
            [
            "intpCustomerId" => "{INTP_CUSTOMER_ID}",
            "email" => "editor1_email_string",
            ],
            [
                "intpCustomerId" => "{INTP_CUSTOMER_ID}",
                "email" => "editor2_email_string",
            ],
        ],
        "watcher" => [
            [
                "intpCustomerId" => "{INTP_CUSTOMER_ID}",
                "email" => "watcher_email_string",
            ],
        ],
        "dashboard" => [
            [
                "intpCustomerId" => "{INTP_CUSTOMER_ID}",
                "email" => "dashboard_email_string",
            ],
        ],
    ],
]
```

#### Delete contributor for a website

[](#delete-contributor-for-a-website)

Remove a contributor from a website.

The contributor will immediately lose access to the dashboard and all associated resources.

```
$visa->website({INTP_WEBSITE_ID})->deleteContributor({INTP_CUSTOMER_ID});
```

### API for managing a subscription of type `website`

[](#api-for-managing-a-subscription-of-type-website)

#### Upgrade - immediately applies a higher stp count package to the subscription

[](#upgrade---immediately-applies-a-higher-stp-count-package-to-the-subscription)

```
$visa->websiteSubscription->upgrade([
    "intpWebsiteId" => {INTP_WEBSITE_ID},
    "packageId" => {PACKAGE_UUID},
    "trial" => {true|false},
    "proRate" => {true|false}
])
```

#### Downgrade - auto-renew the subscription at the end of the current billing interval to a new lower stp count package

[](#downgrade---auto-renew-the-subscription-at-the-end-of-the-current-billing-interval-to-a-new-lower-stp-count-package)

```
$visa->websiteSubscription->downgrade([
    "intpWebsiteId" => {INTP_WEBSITE_ID},
    "packageId" => {PACKAGE_UUID}
])
```

#### Cancel - disable the subscription auto-renewal at the end of the current billing interval

[](#cancel---disable-the-subscription-auto-renewal-at-the-end-of-the-current-billing-interval)

```
$visa->websiteSubscription->cancel([
    "intpWebsiteId" => {INTP_WEBSITE_ID},
])
```

#### Resume - re-enable the subscription auto-renewal at the end of the current billing interval

[](#resume---re-enable-the-subscription-auto-renewal-at-the-end-of-the-current-billing-interval)

```
$visa->websiteSubscription->resume([
    "intpWebsiteId" => {INTP_WEBSITE_ID},
])
```

#### Deactivate - immediately disables the subscription

[](#deactivate---immediately-disables-the-subscription)

```
$visa->websiteSubscription->deactivate([
    "intpWebsiteId" => {INTP_WEBSITE_ID},
])
```

### API for managing a subscription of type `intpc`

[](#api-for-managing-a-subscription-of-type-intpc)

#### Upgrade - immediately applies a higher stp count package to the subscription

[](#upgrade---immediately-applies-a-higher-stp-count-package-to-the-subscription-1)

```
$visa->intpcSubscription->upgrade([
    "intpcId" => {INTP_CUSTOMER_ID},
    "packageId" => {PACKAGE_UUID},
    "trial" => {true|false},
    "proRate" => {true|false}
])
```

#### Downgrade - auto-renew the subscription at the end of the current billing interval to a new lower stp count package

[](#downgrade---auto-renew-the-subscription-at-the-end-of-the-current-billing-interval-to-a-new-lower-stp-count-package-1)

```
$visa->intpcSubscription->downgrade([
    "intpcId" => {INTP_CUSTOMER_ID},
    "packageId" => {PACKAGE_UUID}
])
```

#### Cancel - disable the subscription auto-renewal at the end of the current billing interval

[](#cancel---disable-the-subscription-auto-renewal-at-the-end-of-the-current-billing-interval-1)

```
$visa->intpcSubscription->cancel([
    "intpcId" => {INTP_CUSTOMER_ID},
])
```

#### Resume - re-enable the subscription auto-renewal at the end of the current billing interval

[](#resume---re-enable-the-subscription-auto-renewal-at-the-end-of-the-current-billing-interval-1)

```
$visa->intpcSubscription->resume([
    "intpcId" => {INTP_CUSTOMER_ID},
])
```

#### Deactivate - immediately disables the subscription

[](#deactivate---immediately-disables-the-subscription-1)

```
$visa->intpcSubscription->deactivate([
    "intpcId" => {INTP_CUSTOMER_ID},
])
```

### Utils API

[](#utils-api)

#### Generate a valid access token for the current INTP configuration.

[](#generate-a-valid-access-token-for-the-current-intp-configuration)

```
$visa->auth->generateINTPAccessToken();
```

#### Generate a valid access token for the current INTPc configuration.

[](#generate-a-valid-access-token-for-the-current-intpc-configuration)

```
$visa->auth->generateINTPcAccessToken({INTP_CUSTOMER_ID});
```

Dashboard IFrame
----------------

[](#dashboard-iframe)

The IFrame is one of the main ways a user can interract with the data gathered for his website. The URL of the IFrame is [generated using the SDK](#generate-the-visitoranalytics-dashboard-iframe-url)

The resulting URL can be further enhanced with query parameters:

1. `allowUpgrade=true` - Show upgrade CTAs

Upgrade buttons will be added to the Dashboard for all features that require a certain minimum package. Once the upgrade button is clicked, the iframe posts a message to the parent frame, containing the following payload:

```
{
  "type": "UPGRADE_BUTTON_CLICKED",
  "data": {
    "intpWebsiteId": "", // string; external website id
    "intpCustomerId": "", // string; customer id
    "packageName": "", // string; current package name
    "packageId": "", // string; current package id
    "inTrial": true|false, // boolean;
    "expiresAt": "", // string; expiry date in ISO 8601 format
    "billingInterval": "monthly"|"yearly" // string;
  }
}
```

Pagination
----------

[](#pagination)

`list` methods support pagination options as follows:

```
$visa->customers->list(['page' => 0, 'pageSize' => 5])
```

If no pagination options are provided, the `pageSize` defaults to 10 items.

The `page` count starts from 0.

###  Health Score

44

—

FairBetter than 92% of packages

Maintenance72

Regular maintenance activity

Popularity23

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 73.7% 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 ~31 days

Recently: every ~1 days

Total

25

Last Release

365d ago

Major Versions

1.4.3 → 2.0.02024-11-15

2.1.0 → 3.0.02025-05-16

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5690709?v=4)[Mihai Muresan](/maintainers/mihaicj)[@mihaicj](https://github.com/mihaicj)

![](https://www.gravatar.com/avatar/46970b0b067549b829c0f89f8a4d5a9eb2981b7ee32b93fc76a37b8e81b9b3af?d=identicon)[visa\_oliviu\_sivu](/maintainers/visa_oliviu_sivu)

---

Top Contributors

[![svoliviu](https://avatars.githubusercontent.com/u/7670013?v=4)](https://github.com/svoliviu "svoliviu (28 commits)")[![mihaicj](https://avatars.githubusercontent.com/u/5690709?v=4)](https://github.com/mihaicj "mihaicj (7 commits)")[![adrianaapetrei](https://avatars.githubusercontent.com/u/15968880?v=4)](https://github.com/adrianaapetrei "adrianaapetrei (2 commits)")[![AlexVasiluta](https://avatars.githubusercontent.com/u/16223925?v=4)](https://github.com/AlexVasiluta "AlexVasiluta (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/visitor-analytics-3as-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/visitor-analytics-3as-sdk/health.svg)](https://phpackages.com/packages/visitor-analytics-3as-sdk)
```

###  Alternatives

[aporat/store-receipt-validator

PHP receipt validator for Apple App Store and Amazon Appstore

6503.9M9](/packages/aporat-store-receipt-validator)[ashallendesign/favicon-fetcher

A Laravel package for fetching website's favicons.

190272.4k3](/packages/ashallendesign-favicon-fetcher)[flarum/core

Delightfully simple forum software.

211.3M1.9k](/packages/flarum-core)[oat-sa/lib-lti1p3-core

OAT LTI 1.3 Core Library

36341.9k10](/packages/oat-sa-lib-lti1p3-core)[concrete5/core

Concrete core subtree split

19159.3k48](/packages/concrete5-core)[ralphjsmit/laravel-helpers

A package containing handy helpers for your Laravel-application.

13704.6k2](/packages/ralphjsmit-laravel-helpers)

PHPackages © 2026

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