nowo-tech / api-studio-bundle
Symfony bundle for managing, documenting, and testing REST, SOAP, and GraphQL APIs — your own Postman/Apidog inside Symfony.
Package info
github.com/nowo-tech/ApiStudioBundle
Type:symfony-bundle
pkg:composer/nowo-tech/api-studio-bundle
Requires
- php: >=8.2 <8.6
- ext-json: *
- doctrine/doctrine-bundle: ^2.10 || ^3.0
- doctrine/orm: ^3.7
- nowo-tech/form-kit-bundle: ^2.14
- nowo-tech/ui-kit-bundle: ^2.17.2
- symfony/asset: ^7.4 || ^8.0
- symfony/config: ^7.4 || ^8.0
- symfony/dependency-injection: ^7.4 || ^8.0
- symfony/form: ^7.4 || ^8.0
- symfony/framework-bundle: ^7.4 || ^8.0
- symfony/http-client: ^7.4 || ^8.0
- symfony/http-kernel: ^7.4 || ^8.0
- symfony/mime: ^7.4 || ^8.0
- symfony/routing: ^7.4 || ^8.0
- symfony/security-bundle: ^7.4 || ^8.0
- symfony/security-csrf: ^7.4 || ^8.0
- symfony/translation: ^7.4 || ^8.0
- symfony/twig-bundle: ^7.4 || ^8.0
- symfony/validator: ^7.4 || ^8.0
- symfony/var-exporter: ^7.4 || ^8.0
- symfony/yaml: ^7.4.23 || ^8.1.11
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- igor-php/igor-php: ^0.10.0
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^10.0 || ^11.0
- rector/rector: ^2.0
- symfony/browser-kit: ^7.4 || ^8.0
- symfony/css-selector: ^7.4 || ^8.0
- symfony/dotenv: ^7.4 || ^8.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- ext-soap: Required for SOAP endpoint execution
- symfony/flex: For automatic recipe installation
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v1.11.0
- v1.10.1
- v1.10.0
- v1.9.2
- v1.9.1
- v1.9.0
- v1.8.1
- v1.8.0
- v1.7.0
- v1.6.1
- v1.6.0
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.1
- v1.4.0
- v1.3.1
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.23
- v1.0.22
- v1.0.21
- v1.0.20
- v1.0.19
- v1.0.18
- v1.0.17
- v1.0.16
- v1.0.15
- v1.0.14
- v1.0.13
- v1.0.12
- v1.0.11
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-feat/1.11.0-tenancy
- dev-chore/symfony-security-2026-11-04
- dev-fix/1.10.1-slugs-secrets
- dev-fix/req-twig-005
This package is auto-updated.
Last update: 2026-11-04 20:53:34 UTC
README
⭐ Found this useful? Install from Packagist and give the repo a star on GitHub.
Manage, document, and test REST, SOAP, and GraphQL APIs from a built-in dashboard — your own Postman / Apidog inside Symfony.
This bundle is FrankenPHP worker mode friendly.
Workspace catalogue — REST and SOAP services with their endpoints |
Request console — live POST with the 201 response body |
Features
- Workspaces — group services, environments, and endpoints
- Services — third-party or internal APIs (REST, SOAP, GraphQL)
- Environments & variables —
{{base_url}}, tokens, secrets per environment - Endpoints — method, path, headers, body templates, SOAP actions
- Multilingual docs — per-endpoint translations (title, description, notes)
- Request/response examples — document sample payloads
- Request console — execute and inspect live responses from the UI
- History — last executions persisted per endpoint
- Import / Export — OpenAPI 3 & Swagger 2, Postman collections, environment variables (JSON/YAML/.env)
- Browser scripts — pre/post-request JavaScript in the console (
pm.environment.set,pm.response.json, tests)
Installation
composer require nowo-tech/api-studio-bundle
Register the bundle and hard dependencies (Flex usually does this):
// config/bundles.php Nowo\ApiStudioBundle\ApiStudioBundle::class => ['all' => true], Nowo\UiKitBundle\NowoUiKitBundle::class => ['all' => true], Nowo\FormKitBundle\NowoFormKitBundle::class => ['all' => true], Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
Install the Asset component (required for Twig asset() in the request console):
composer require symfony/asset
Import routes:
# config/routes.yaml nowo_api_studio: resource: '@ApiStudioBundle/Resources/config/routes.yaml'
Configure:
# config/packages/nowo_api_studio.yaml nowo_api_studio: enabled: true ui: path: '/api-studio' locales: [en, es] security: access_roles: [ROLE_ADMIN]
Sync schema and optional demo data:
php bin/console nowo:api-studio:sync-schema php bin/console nowo:api-studio:seed-demo make assets php bin/console assets:install
Open /api-studio in your browser.
Requirements
- PHP >= 8.2 < 8.6
- Symfony 7.4+ or 8.x
- Doctrine ORM
^3.7 ext-jsonext-soap(optional, for SOAP execution)- UiKitBundle
^1.4 - FormKitBundle
^2.0 twig/extra-bundle+twig/string-extra^3.12(REQ-TWIG-004)
Browser scripts (pre/post-request)
Scripts run in the browser before and after each test request — ideal for chaining auth flows and updating environment variables without server-side code execution.
// Pre-request — set timestamp or override token before send pm.environment.set('timestamp', Date.now().toString()); // Post-request — extract token from response for next call const data = pm.response.json(); if (data && data.data && data.data.token) { pm.environment.set('access_token', data.data.token); } pm.test('Status is 200', function () { pm.expect(pm.response.code).to.equal(200); });
- Tabs: Pre-request / Post-request in the endpoint console (editable per session; save via endpoint edit form to persist)
- Service scripts: optional pre/post at service level (always run first/last)
- Runtime variables: stored in
sessionStoragefor the tab session; preview URL updates immediately - Persist: checkbox Persist variable changes saves script-modified keys to the selected environment in the database
API available: pm.environment.get/set, pm.variables, pm.request.body, pm.response.json(), pm.test(), pm.console.log().
Import & Export
From any workspace (/api-studio/workspaces/{id} → Import / Export):
| Action | Formats |
|---|---|
| Import API spec | OpenAPI 3.x, Swagger 2.0 (.json, .yaml) |
| Import Postman | Collection v2.x (.json), optional collection variables |
| Import variables | JSON, YAML, .env (merge or replace) |
| Export OpenAPI | Workspace or single service → JSON |
| Export variables | Per environment or whole workspace → JSON, YAML, .env |
Service-level import adds endpoints to an existing service. Workspace-level import creates a new REST service.
Frontend assets (TypeScript)
Browser scripts live in src/Resources/assets/src/ and compile to src/Resources/public/ with pnpm + Vite:
make assets # pnpm install && pnpm run build (inside Docker) pnpm run build # compile only (host, if pnpm is installed) pnpm run typecheck # tsc --noEmit
Entry points: api-tester, api-body-tools, api-script-runtime, api-studio-shell, api-endpoint-doc.
Demo
make -C demo up-symfony8
Default URL: http://localhost:8023 (override with PORT).
Playwright e2e: make -C demo/symfony8 test-e2e; refresh the README screenshots with make -C demo/symfony8 demo-screenshots (see CONTRIBUTING).
Optional FrankenPHP mode via FRANKENPHP_MODE=worker|classic in demo/symfony8/.env (see demo/README.md and docs/DEMO-FRANKENPHP.md).
Documentation
- Installation
- Configuration
- Usage
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
Tests and coverage
make test
make test-coverage
- PHP: 99.93% lines (4413/4416) of the whole
src/tree (phpunit.xml.distexcludes onlysrc/Resources, measured 2026-10-30). CI andmake test-coveragefail below 99% (composer coverage-check,scripts/check-coverage.php, REQ-TEST-003). The 3 uncovered lines are defensive branches that cannot be reached in-process:RequestExecutorwithout ext-soap (the test image ships it) and theGuardedWsdlLoadertemp-file failures (tempnam()/file_put_contents()returningfalse). - UI: the page contract test (
tests/Integration/Contract/PageContractTest.php) renders every page against the UiKit stub host fornone,bootstrap5andtailwind. - TS/JS: N/A (assets are built with Vite; no Vitest suite yet)
- Python: N/A
PHP coverage is reported in CI and via make test-coverage (see README badge and release-check).
License
MIT — see LICENSE.


