PHPackages                             texhub/moy-sklad - 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. texhub/moy-sklad

ActiveLibrary[API Development](/categories/api)

texhub/moy-sklad
================

Full-featured MoySklad (МойСклад) JSON API 1.2 SDK for any PHP framework with first-class Laravel &amp; multi-tenant support: products, stock, images, counterparties, orders, reports and webhooks.

v1.1.1(1mo ago)00MITPHPPHP ^8.2

Since Jun 1Pushed 1mo agoCompare

[ Source](https://github.com/TexhubPro/moy-sklad)[ Packagist](https://packagist.org/packages/texhub/moy-sklad)[ Docs](https://texhub.pro)[ RSS](/packages/texhub-moy-sklad/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (4)Versions (4)Used By (0)

TexHub · MoySklad
=================

[](#texhub--moysklad)

**English** · [Русский](README.ru.md)

[![License: MIT](https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667)](LICENSE)[![PHP](https://camo.githubusercontent.com/d91d3d1139cf0d8faaa80eeeeac7d3c59c9319e56960ef81c948e4160be4c4c1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253545382e322d3737376262342e737667)](composer.json)[![Laravel](https://camo.githubusercontent.com/3e9242504354dbb5afd360f9a1ec114126b2caddb73d9e789d9102c3285d2b05/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d3131253230253743253230313225323025374325323031332d6666326432302e737667)](#laravel)

A full-featured, framework-agnostic PHP SDK for the **MoySklad (МойСклад) JSON API 1.2** — products, stock, images, counterparties, orders, reports and webhooks — with first-class **Laravel** and **multi-tenant** support.

Reference:

---

Features
--------

[](#features)

- **Products** — full CRUD with name, code, article, description, prices, attributes
- **Images** — list, upload (file/base64), delete
- **Stock** — `report/stock/all`, by store, short stock, assortment
- **Generic entity client** — reach *any* entity (`counterparty`, `customerorder`, `demand`, …)
- **Webhooks** — manage subscriptions + parse incoming events (with `accountId` for tenant routing)
- **Multi-tenant** — one client per account via token; `forToken()` switching
- **Query builder** — pagination, filters, search, order, `expand`
- Token or login/password auth · gzip · typed responses · fully tested

---

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

[](#installation)

```
composer require texhub/moy-sklad
```

Requirements: **PHP ≥ 8.2** with `curl`, `json`.

---

Quick start
-----------

[](#quick-start)

```
use TexHub\MoySklad\MoySklad;
use TexHub\MoySklad\Query;

$ms = MoySklad::withToken('YOUR_ACCESS_TOKEN');
// or: MoySklad::withLogin('login', 'password');

// List products with stock-friendly query:
$products = $ms->products()->list(
    Query::make()->limit(50)->filter('archived', '=', 'false')->expand('images')->search('iphone')
);

foreach ($products->rows() as $product) {
    echo $product['name'] . ' — ' . ($product['code'] ?? '') . PHP_EOL;
}
```

### Get a token from login/password

[](#get-a-token-from-loginpassword)

```
$token = MoySklad::withLogin('login', 'password')->tokens()->create();
// store $token and reuse it
```

---

Products, descriptions &amp; images
-----------------------------------

[](#products-descriptions--images)

```
// Create with description and a sale price:
$product = $ms->products()->create([
    'name' => 'Смартфон X',
    'code' => 'SKU-001',
    'article' => 'ART-001',
    'description' => 'Полное описание товара…',
    'salePrices' => [['value' => 999000, 'priceType' => ['meta' => ['href' => $priceTypeHref, 'type' => 'pricetype', 'mediaType' => 'application/json']]]],
]);

// Update:
$ms->products()->update($product->id(), ['description' => 'Обновлённое описание']);

// Images:
$ms->products()->images($product->id());                       // list
$ms->products()->addImageFromFile($product->id(), '/path/photo.jpg');
$ms->products()->addImage($product->id(), 'photo.jpg', $binary); // base64 handled for you
$ms->products()->deleteImage($product->id(), $imageId);
```

---

Stock (количество) &amp; assortment
-----------------------------------

[](#stock-количество--assortment)

```
$ms->reports()->stockAll();                 // отчёт «Остатки» по всем товарам
$ms->reports()->stockByStore();             // остатки по складам
$ms->reports()->assortment(Query::make()->limit(100)); // товары+модификации+услуги со складскими данными
```

Each stock row contains `stock`, `reserve`, `inTransit`, `quantity`, plus the linked product `meta`.

---

Any entity
----------

[](#any-entity)

```
$ms->counterparties()->list();
$ms->customerOrders()->get($orderId, Query::make()->expand('positions', 'agent'));
$ms->entity('demand')->create([...]);       // any MoySklad entity type
$ms->entity('store')->metadata();
```

Built-in helpers: `products()`, `variants()`, `services()`, `bundles()`, `productFolders()`, `counterparties()`, `organizations()`, `stores()`, `customerOrders()`, `demands()`, `reports()`, `webhooks()`.

---

Webhooks
--------

[](#webhooks)

**Subscribe** (so MoySklad notifies your URL):

```
$ms->webhooks()->subscribe('https://shop.tj/moysklad/webhook', 'product', 'UPDATE');
$ms->webhooks()->subscribe('https://shop.tj/moysklad/webhook', 'customerorder', 'CREATE');
```

**Receive** (parse the incoming POST):

```
foreach ($ms->webhookHandler()->parse(file_get_contents('php://input')) as $event) {
    $event->action;         // CREATE | UPDATE | DELETE
    $event->entityType;     // product, customerorder, …
    $event->entityId();     // parsed from href
    $event->updatedFields;  // changed fields (UPDATE)
    $event->accountId;      // → which tenant this belongs to
}
http_response_code(200);
```

---

Multi-tenant / SaaS
-------------------

[](#multi-tenant--saas)

Each customer connects their own MoySklad account. Store their token (or login/password → token) and build a per-tenant client:

```
// Onboard once:
$token = MoySklad::withLogin($tenant->ms_login, $tenant->ms_password)->tokens()->create();

// Act as any tenant:
$ms->forToken($tenant->ms_token)->products()->list();

// Route incoming webhooks by account:
$accountId = $ms->webhookHandler()->accountId($raw);
$tenant = Tenant::where('ms_account_id', $accountId)->first();
```

---

Error handling
--------------

[](#error-handling)

```
use TexHub\MoySklad\Exceptions\ApiException;

try {
    $ms->products()->create($data);
} catch (ApiException $e) {
    $e->httpStatus;
    $e->errorCode();   // MoySklad error code
    $e->errors;        // [['error' => ..., 'code' => ..., 'parameter' => ...]]
    $e->isUnauthorized();
}
```

---

 Laravel
-------------------------------------------

[](#-laravel)

Auto-discovered. Publish config:

```
php artisan vendor:publish --tag=moy-sklad-config
```

`.env`:

```
MOYSKLAD_TOKEN=your_token
# or
MOYSKLAD_LOGIN=login
MOYSKLAD_PASSWORD=password
```

Facade:

```
use TexHub\MoySklad\Laravel\MoySklad;

MoySklad::products()->list();
MoySklad::forToken($tenant->ms_token)->reports()->stockAll();   // multi-tenant
```

> Exclude your webhook route from CSRF (`VerifyCsrfToken::$except`).

---

Testing
-------

[](#testing)

```
use TexHub\MoySklad\MoySklad;
use TexHub\MoySklad\Config;
use TexHub\MoySklad\Tests\Support\FakeTransport;

$t = (new FakeTransport())->push(['rows' => [['id' => 'p1']], 'meta' => ['size' => 1]]);
$ms = new MoySklad(new Config(token: 'TOKEN'), $t);
$ms->products()->list();  // assert on $t->last()
```

```
composer install && composer test
```

---

Architecture
------------

[](#architecture)

```
src/
├── MoySklad.php             # entry — products()/reports()/webhooks()/entity()/forToken()
├── Config.php               # token or login/password auth, multi-tenant withToken()
├── Query.php                # filters / search / order / expand / pagination
├── Http/                    # Transport, CurlTransport (gzip), HttpClient, RawResponse
├── Resources/               # EntityClient (generic CRUD), Products, Reports, Webhooks, Token
├── Webhook/                 # WebhookHandler + WebhookEvent (accountId routing)
├── Responses/               # Response (ArrayAccess), ListResponse (rows + meta)
├── Exceptions/              # ApiException, TransportException, …
└── Laravel/                 # ServiceProvider + Facade

```

---

License
-------

[](#license)

MIT © TexHub Pro — built by Mahmudi Shodmehr.

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance93

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

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

Total

3

Last Release

34d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/217647751?v=4)[TexHub Pro](/maintainers/TexhubPro)[@TexhubPro](https://github.com/TexhubPro)

---

Top Contributors

[![TexhubPro](https://avatars.githubusercontent.com/u/217647751?v=4)](https://github.com/TexhubPro "TexhubPro (3 commits)")

---

Tags

erpinventorylaravelmoyskladphpsdkwarehousewebhooksphplaravelwebhooksERPmulti-tenantinventorywarehousemoy skladmoyskladtexhub

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/texhub-moy-sklad/health.svg)

```
[![Health](https://phpackages.com/badges/texhub-moy-sklad/health.svg)](https://phpackages.com/packages/texhub-moy-sklad)
```

###  Alternatives

[joisarjignesh/bigbluebutton

BigBlueButton Server API Library for Laravel

162155.1k1](/packages/joisarjignesh-bigbluebutton)[octw/aramex

A Library to integrate with Aramex APIs

2927.7k](/packages/octw-aramex)[wxm/pdd-sdk

拼多多 SDK 封装, 调用简单、语义化增强。支持 Laravel/Lumen。

154.8k](/packages/wxm-pdd-sdk)

PHPackages © 2026

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