{"id":659,"date":"2025-09-05T11:59:17","date_gmt":"2025-09-05T11:59:17","guid":{"rendered":"https:\/\/1v0.net\/blog\/?p=659"},"modified":"2025-09-05T11:59:19","modified_gmt":"2025-09-05T11:59:19","slug":"building-a-simple-saas-billing-system-with-laravel-and-cashier","status":"publish","type":"post","link":"https:\/\/1v0.net\/blog\/building-a-simple-saas-billing-system-with-laravel-and-cashier\/","title":{"rendered":"Building a Simple SaaS Billing System with Laravel and Cashier"},"content":{"rendered":"\n<p>Billing is at the heart of every SaaS application. Laravel provides a powerful integration with Stripe and Paddle via <strong>Laravel Cashier<\/strong>, making it easy to implement subscriptions, handle invoices, manage trials, and process payments. In this article, you\u2019ll learn how to build a simple SaaS billing system with Cashier, starting from installation and environment setup to building UI components for subscription management. We\u2019ll also cover migrations, controllers, Blade templates, and testing to ensure a production-ready billing system.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Installing Laravel Cashier<\/strong><\/h2>\n\n\n\n<p>First, install Cashier for Stripe (most common) or Paddle. We\u2019ll use Stripe in this example.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">composer require laravel\/cashier<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, add Stripe environment keys to your <code>.env<\/code> file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">STRIPE_KEY=pk_test_123\nSTRIPE_SECRET=sk_test_123<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ensure you\u2019ve configured webhooks in your Stripe dashboard to point to <code>\/stripe\/webhook<\/code>. Cashier will handle these automatically.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>User Model &amp; Database Setup<\/strong><\/h2>\n\n\n\n<p>Add the <code>Billable<\/code> trait to your <code>User<\/code> model so it can manage subscriptions and payment methods.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Models\/User.php<\/span>\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Laravel<\/span>\\<span class=\"hljs-title\">Cashier<\/span>\\<span class=\"hljs-title\">Billable<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Authenticatable<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Billable<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Publish and run Cashier\u2019s migrations:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">php artisan vendor:publish --tag=<span class=\"hljs-string\">\"cashier-migrations\"<\/span>\nphp artisan migrate<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This creates the necessary tables (<code>subscriptions<\/code>, <code>subscription_items<\/code>, etc.) to track active subscriptions and payments.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Controller for Subscription Management<\/strong><\/h2>\n\n\n\n<p>Create a controller to handle showing the billing page, starting a subscription, and canceling subscriptions.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">php artisan make:controller SubscriptionController<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/SubscriptionController.php<\/span>\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubscriptionController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">index<\/span><span class=\"hljs-params\">(Request $request)<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'billing.index'<\/span>, &#91;\n            <span class=\"hljs-string\">'intent'<\/span> =&gt; $request-&gt;user()-&gt;createSetupIntent()\n        ]);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">subscribe<\/span><span class=\"hljs-params\">(Request $request)<\/span>\n    <\/span>{\n        $request-&gt;validate(&#91;<span class=\"hljs-string\">'paymentMethod'<\/span> =&gt; <span class=\"hljs-string\">'required'<\/span>]);\n\n        $request-&gt;user()-&gt;newSubscription(<span class=\"hljs-string\">'default'<\/span>, <span class=\"hljs-string\">'price_basic'<\/span>)\n            -&gt;create($request-&gt;paymentMethod);\n\n        <span class=\"hljs-keyword\">return<\/span> redirect()-&gt;route(<span class=\"hljs-string\">'billing.index'<\/span>)\n            -&gt;with(<span class=\"hljs-string\">'success'<\/span>, <span class=\"hljs-string\">'Subscription started!'<\/span>);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">cancel<\/span><span class=\"hljs-params\">(Request $request)<\/span>\n    <\/span>{\n        $request-&gt;user()-&gt;subscription(<span class=\"hljs-string\">'default'<\/span>)?-&gt;cancel();\n        <span class=\"hljs-keyword\">return<\/span> back()-&gt;with(<span class=\"hljs-string\">'success'<\/span>,<span class=\"hljs-string\">'Subscription canceled.'<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This controller allows users to subscribe to a Stripe price ID (<code>price_basic<\/code>) and cancel their subscriptions. Replace with your Stripe product price IDs.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Routes &amp; Middleware<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ routes\/web.php<\/span>\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">SubscriptionController<\/span>;\n\nRoute::middleware(&#91;<span class=\"hljs-string\">'auth'<\/span>])-&gt;group(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">()<\/span> <\/span>{\n    Route::get(<span class=\"hljs-string\">'\/billing'<\/span>, &#91;SubscriptionController::class,<span class=\"hljs-string\">'index'<\/span>])-&gt;name(<span class=\"hljs-string\">'billing.index'<\/span>);\n    Route::post(<span class=\"hljs-string\">'\/billing\/subscribe'<\/span>, &#91;SubscriptionController::class,<span class=\"hljs-string\">'subscribe'<\/span>])-&gt;name(<span class=\"hljs-string\">'billing.subscribe'<\/span>);\n    Route::post(<span class=\"hljs-string\">'\/billing\/cancel'<\/span>, &#91;SubscriptionController::class,<span class=\"hljs-string\">'cancel'<\/span>])-&gt;name(<span class=\"hljs-string\">'billing.cancel'<\/span>);\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Restrict billing routes to authenticated users so each subscription ties to a user account.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Blade Billing UI<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;!-- resources\/views\/billing\/index.blade.php --&gt;\n&lt;h2&gt;Billing&lt;\/h2&gt;\n\n@<span class=\"hljs-keyword\">if<\/span>(session(<span class=\"hljs-string\">'success'<\/span>))\n    &lt;p style=<span class=\"hljs-string\">\"color:green\"<\/span>&gt;{{ session(<span class=\"hljs-string\">'success'<\/span>) }}&lt;\/p&gt;\n@<span class=\"hljs-keyword\">endif<\/span>\n\n@<span class=\"hljs-keyword\">if<\/span>(! auth()-&gt;user()-&gt;subscribed(<span class=\"hljs-string\">'default'<\/span>))\n    &lt;form id=<span class=\"hljs-string\">\"subscribe-form\"<\/span> method=<span class=\"hljs-string\">\"POST\"<\/span> action=<span class=\"hljs-string\">\"{{ route('billing.subscribe') }}\"<\/span>&gt;\n        @csrf\n        &lt;label&gt;Card&lt;\/label&gt;\n        &lt;div id=<span class=\"hljs-string\">\"card-element\"<\/span>&gt;&lt;\/div&gt;\n        &lt;input type=<span class=\"hljs-string\">\"hidden\"<\/span> name=<span class=\"hljs-string\">\"paymentMethod\"<\/span> id=<span class=\"hljs-string\">\"payment-method\"<\/span> \/&gt;\n        &lt;button type=<span class=\"hljs-string\">\"submit\"<\/span>&gt;Subscribe&lt;\/button&gt;\n    &lt;\/form&gt;\n@<span class=\"hljs-keyword\">else<\/span>\n    &lt;p&gt;You are subscribed.&lt;\/p&gt;\n    &lt;form method=<span class=\"hljs-string\">\"POST\"<\/span> action=<span class=\"hljs-string\">\"{{ route('billing.cancel') }}\"<\/span>&gt;\n        @csrf\n        &lt;button&gt;Cancel Subscription&lt;\/button&gt;\n    &lt;\/form&gt;\n@<span class=\"hljs-keyword\">endif<\/span>\n\n&lt;script src=<span class=\"hljs-string\">\"https:\/\/js.stripe.com\/v3\/\"<\/span>&gt;&lt;\/script&gt;\n&lt;script&gt;\n<span class=\"hljs-keyword\">const<\/span> stripe = Stripe(<span class=\"hljs-string\">'{{ config('<\/span>cashier.key<span class=\"hljs-string\">') }}'<\/span>);\n<span class=\"hljs-keyword\">const<\/span> elements = stripe.elements();\n<span class=\"hljs-keyword\">const<\/span> card = elements.create(<span class=\"hljs-string\">'card'<\/span>);\ncard.mount(<span class=\"hljs-string\">'#card-element'<\/span>);\n\n<span class=\"hljs-keyword\">const<\/span> form = document.getElementById(<span class=\"hljs-string\">'subscribe-form'<\/span>);\n<span class=\"hljs-keyword\">if<\/span> (form) {\n    form.addEventListener(<span class=\"hljs-string\">'submit'<\/span>, async (e) =&gt; {\n        e.preventDefault();\n        <span class=\"hljs-keyword\">const<\/span> {paymentMethod, error} = await stripe.createPaymentMethod(<span class=\"hljs-string\">'card'<\/span>, card);\n        <span class=\"hljs-keyword\">if<\/span> (error) {\n            alert(error.message);\n        } <span class=\"hljs-keyword\">else<\/span> {\n            document.getElementById(<span class=\"hljs-string\">'payment-method'<\/span>).value = paymentMethod.id;\n            form.submit();\n        }\n    });\n}\n&lt;\/script&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This UI integrates Stripe Elements to securely capture card details. On subscribe, it creates a payment method and posts it to Laravel.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Invoices and Trials<\/strong><\/h2>\n\n\n\n<p>Cashier includes helpers for invoices and trials:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ Display invoices<\/span>\n$invoices = auth()-&gt;user()-&gt;invoices();\n\n<span class=\"hljs-comment\">\/\/ Add free trial on subscription creation<\/span>\n$request-&gt;user()-&gt;newSubscription(<span class=\"hljs-string\">'default'<\/span>, <span class=\"hljs-string\">'price_basic'<\/span>)\n    -&gt;trialDays(<span class=\"hljs-number\">14<\/span>)\n    -&gt;create($request-&gt;paymentMethod);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You can display invoices in a Blade template and allow users to download PDF receipts easily with <code>$invoice-&gt;asPdf()<\/code>.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testing the Billing Flow<\/strong><\/h2>\n\n\n\n<p>You can fake Stripe in tests using Laravel\u2019s HTTP client mocking or by using Stripe test cards in a sandbox environment.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ tests\/Feature\/SubscriptionTest.php<\/span>\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Tests<\/span>\\<span class=\"hljs-title\">TestCase<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubscriptionTest<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">TestCase<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">test_user_sees_billing_page<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        $user = User::factory()-&gt;create();\n        <span class=\"hljs-keyword\">$this<\/span>-&gt;actingAs($user)\n            -&gt;get(<span class=\"hljs-string\">'\/billing'<\/span>)\n            -&gt;assertStatus(<span class=\"hljs-number\">200<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Feature tests confirm authenticated users can access billing pages. For integration tests, use Stripe\u2019s test keys and cards to simulate subscriptions.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wrapping Up<\/strong><\/h2>\n\n\n\n<p>With Laravel Cashier, you can implement SaaS billing quickly and reliably. You\u2019ve seen how to set up Cashier, manage subscriptions, integrate Stripe Elements, handle trials, and provide invoices. Extend this foundation with plan upgrades\/downgrades, team billing, coupons, and advanced reporting as your SaaS grows.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What\u2019s Next<\/strong><\/h2>\n\n\n\n<p>Continue learning about payments and subscriptions in Laravel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/blog\/how-to-integrate-stripe-payments-in-laravel\">How to Integrate Stripe Payments in Laravel<\/a><\/li>\n\n\n\n<li><a href=\"\/blog\/paypal-integration-in-laravel-step-by-step\">PayPal Integration in Laravel (Step by Step)<\/a><\/li>\n\n\n\n<li><a href=\"\/blog\/handling-file-uploads-and-image-storage-in-laravel\">Handling File Uploads and Image Storage in Laravel<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Billing is at the heart of every SaaS application. Laravel provides a powerful integration with Stripe and Paddle via Laravel Cashier, making it easy to implement subscriptions, handle invoices, manage trials, and process payments. In this article, you\u2019ll learn how to build a simple SaaS billing system with Cashier, starting from installation and environment setup [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":663,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[156,154,99,155,157],"class_list":["post-659","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-billing","tag-cashier","tag-saas","tag-stripe","tag-subscriptions"],"_links":{"self":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/comments?post=659"}],"version-history":[{"count":1,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/659\/revisions"}],"predecessor-version":[{"id":662,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/659\/revisions\/662"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media\/663"}],"wp:attachment":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media?parent=659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/categories?post=659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/tags?post=659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}