{
	"info": {
		"_postman_id": "b1bdc5e2-7bba-490c-8163-25f250ef460f",
		"name": "Second Phone Number - Blog CMS API",
		"description": "Runnable staging collection for the Laravel Blog CMS. Public endpoints require no token. Admin endpoints require a Blog Admin API token returned by Login. Never store a real password or token in this collection.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "25910381",
		"_collection_link": "https://blue-firefly-176933.postman.co/workspace/My-Workspace~a2d7367c-008e-42d0-8b93-36acded5f4d4/collection/25910381-b1bdc5e2-7bba-490c-8163-25f250ef460f?action=share&source=collection_link&creator=25910381"
	},
	"item": [
		{
			"name": "Public API",
			"item": [
				{
					"name": "List posts — encrypted",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Returns an encrypted public response', () => pm.response.to.have.status(200));",
									"pm.expect(pm.response.headers.get('X-Blog-Encryption')).to.eql('rncryptor-v3');",
									"pm.expect(pm.response.text()).to.not.be.empty;",
									"pm.collectionVariables.set('publicCiphertext', pm.response.text());"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/v1/posts?page=1&perPage=12",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"v1",
								"posts"
							],
							"query": [
								{
									"key": "page",
									"value": "1"
								},
								{
									"key": "perPage",
									"value": "12"
								}
							]
						}
					},
					"response": [
						{
							"name": "List posts — encrypted",
							"originalRequest": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "{{baseUrl}}/v1/posts?page=1&perPage=12",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"v1",
										"posts"
									],
									"query": [
										{
											"key": "page",
											"value": "1"
										},
										{
											"key": "perPage",
											"value": "12"
										}
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:48:20 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Cache-Control",
									"value": "max-age=0, public, s-maxage=60, stale-while-revalidate=600"
								},
								{
									"key": "X-Robots-Tag",
									"value": "noindex"
								},
								{
									"key": "X-Blog-Encryption",
									"value": "rncryptor-v3"
								},
								{
									"key": "X-Content-Type-Options",
									"value": "nosniff"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "60"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "59"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Vary",
									"value": "Accept-Encoding"
								},
								{
									"key": "Content-Encoding",
									"value": "gzip"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "text/plain; charset=UTF-8"
								}
							],
							"cookie": [],
							"body": "AwHdZVTuM4NOh38JbZ3bTG07W/6qRQp7XdB03Ri9DThkhGIC5fPq8NUzBLXdaX9W84Xpjl1ezlBPQsJTlgXz2wcyd2WkW5dyotW+hKEIPGKzTf+KaummGtxx95WtqzxYxX5DdUA+oDqRAl/aY0CE7KQushREtrtquV4hCLvXUwDP6v63WJMdL/hvAtTxLkc4Nm/qzWqYCa+SaVRDf8S+n1TQ"
						}
					]
				},
				{
					"name": "Get post by slug",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Returns an encrypted post or encrypted 404', () => pm.expect(pm.response.code).to.be.oneOf([200, 404]));",
									"pm.expect(pm.response.headers.get('X-Blog-Encryption')).to.eql('rncryptor-v3');"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/v1/posts/{{postSlug}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"v1",
								"posts",
								"{{postSlug}}"
							]
						}
					},
					"response": [
						{
							"name": "Get post by slug",
							"originalRequest": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "{{baseUrl}}/v1/posts/{{postSlug}}",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"v1",
										"posts",
										"{{postSlug}}"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:51:37 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Cache-Control",
									"value": "max-age=0, public, s-maxage=60, stale-while-revalidate=600"
								},
								{
									"key": "X-Robots-Tag",
									"value": "noindex"
								},
								{
									"key": "X-Blog-Encryption",
									"value": "rncryptor-v3"
								},
								{
									"key": "X-Content-Type-Options",
									"value": "nosniff"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "60"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "59"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Vary",
									"value": "Accept-Encoding"
								},
								{
									"key": "Content-Encoding",
									"value": "gzip"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=99"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "text/plain; charset=UTF-8"
								}
							],
							"cookie": [],
							"body": "AwEMW/deyhVMJe7p5I8qDTog/NMmLpTMC/I9P1rYR2+sbtCl5t9eCHSlvgvbwDVFFBC+zrGtPCyCHe9Pv6r7hYSfWJpzYqAh+bY+1gng56kQ49fyAib2+XrDRflJPT+xsjzSBvSRTnwpEJNRfC/bXLXNZwG1cga/4H/R7KTJwmSQOJO1YmAvDwjFSMlCaAzhU3eP7aeqIsI++y7y2/JyIQjB"
						}
					]
				},
				{
					"name": "Sitemap",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Returns an encrypted sitemap', () => pm.response.to.have.status(200));",
									"pm.expect(pm.response.headers.get('X-Blog-Encryption')).to.eql('rncryptor-v3');"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/v1/sitemap",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"v1",
								"sitemap"
							]
						}
					},
					"response": [
						{
							"name": "Sitemap",
							"originalRequest": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "{{baseUrl}}/v1/sitemap",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"v1",
										"sitemap"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:51:44 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Cache-Control",
									"value": "max-age=0, public, s-maxage=60"
								},
								{
									"key": "X-Blog-Encryption",
									"value": "rncryptor-v3"
								},
								{
									"key": "X-Content-Type-Options",
									"value": "nosniff"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "30"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "28"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Vary",
									"value": "Accept-Encoding"
								},
								{
									"key": "Content-Encoding",
									"value": "gzip"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "text/plain; charset=UTF-8"
								}
							],
							"cookie": [],
							"body": "AwGmvrjZVupnWBQ+cmmnzUihS8ldMVw41rntHplg3GJPvb8WfGvRD9GQgnNIDKuR/bbhJJ8y2jO47Qq8z4TgHGBjQuOoeBWxM2PyUQJAGt94Lg=="
						}
					]
				}
			]
		},
		{
			"name": "Admin API",
			"item": [
				{
					"name": "Login",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Login succeeds', () => pm.response.to.have.status(200));",
									"const body = pm.response.json();",
									"pm.expect(body.ok).to.eql(true);",
									"pm.collectionVariables.set('adminToken', body.token);"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"email\": \"{{adminEmail}}\",\n  \"password\": \"{{adminPassword}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/admin/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"admin",
								"auth",
								"login"
							]
						}
					},
					"response": [
						{
							"name": "Login",
							"originalRequest": {
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"email\": \"{{adminEmail}}\",\n  \"password\": \"{{adminPassword}}\"\n}"
								},
								"url": {
									"raw": "{{baseUrl}}/admin/auth/login",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"admin",
										"auth",
										"login"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:49:15 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Cache-Control",
									"value": "no-store, private"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "5"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "3"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n    \"ok\": true,\n    \"token\": \"<redacted-token>abc6d291\",\n    \"user\": {\n        \"id\": 1,\n        \"email\": \"admin@secondphonenumber.com\",\n        \"name\": \"Staging Blog Admin\",\n        \"role\": \"ADMIN\",\n        \"avatarUrl\": null\n    }\n}"
						}
					]
				},
				{
					"name": "Current admin",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Returns the authenticated editor', () => { pm.response.to.have.status(200); pm.expect(pm.response.json().data.user).to.have.property('role'); });"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/admin/auth/me",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"admin",
								"auth",
								"me"
							]
						}
					},
					"response": [
						{
							"name": "Current admin",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Authorization",
										"value": "Bearer {{adminToken}}"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/admin/auth/me",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"admin",
										"auth",
										"me"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:51:54 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Vary",
									"value": "Authorization"
								},
								{
									"key": "Cache-Control",
									"value": "no-store, private"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "60"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "59"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n    \"ok\": true,\n    \"user\": {\n        \"id\": 1,\n        \"email\": \"admin@secondphonenumber.com\",\n        \"name\": \"Staging Blog Admin\",\n        \"role\": \"ADMIN\",\n        \"avatarUrl\": null\n    }\n}"
						}
					]
				},
				{
					"name": "Create draft",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Draft created', () => pm.response.to.have.status(201));",
									"const post = pm.response.json().data;",
									"pm.collectionVariables.set('postId', post.id);",
									"pm.collectionVariables.set('postSlug', post.slug);"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							},
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"intent\": \"draft\",\n  \"values\": {\n    \"title\": \"Staging API smoke-test post\",\n    \"slug\": \"staging-api-smoke-test-post\",\n    \"excerpt\": \"Created through Postman. Delete after verification.\",\n    \"content\": \"<p>This draft verifies the CMS API.</p>\",\n    \"tags\": [\"staging\", \"api\"]\n  }\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/admin/blogs",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"admin",
								"blogs"
							]
						}
					},
					"response": [
						{
							"name": "Create draft",
							"originalRequest": {
								"method": "POST",
								"header": [
									{
										"key": "Authorization",
										"value": "Bearer {{adminToken}}"
									},
									{
										"key": "Content-Type",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"intent\": \"draft\",\n  \"values\": {\n    \"title\": \"Staging API smoke-test post\",\n    \"slug\": \"staging-api-smoke-test-post\",\n    \"excerpt\": \"Created through Postman. Delete after verification.\",\n    \"content\": \"<p>This draft verifies the CMS API.</p>\",\n    \"tags\": [\"staging\", \"api\"]\n  }\n}"
								},
								"url": {
									"raw": "{{baseUrl}}/admin/blogs",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"admin",
										"blogs"
									]
								}
							},
							"status": "Created",
							"code": 201,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:53:55 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Vary",
									"value": "Authorization"
								},
								{
									"key": "Cache-Control",
									"value": "no-store, private"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "60"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "57"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n    \"ok\": true,\n    \"message\": \"Draft saved\",\n    \"data\": {\n        \"id\": \"01m6ec1brdxj6jg0tykce9a3g2\",\n        \"title\": \"Staging API smoke-test post\",\n        \"slug\": \"staging-api-smoke-test-post\",\n        \"excerpt\": \"Created through Postman. Delete after verification.\",\n        \"content\": \"<p>This draft verifies the CMS API.</p>\",\n        \"featured_image\": null,\n        \"featured_image_alt\": null,\n        \"featured_image_title\": null,\n        \"category_id\": null,\n        \"author_id\": null,\n        \"status\": \"DRAFT\",\n        \"published_at\": null,\n        \"scheduled_at\": null,\n        \"content_updated_at\": null,\n        \"reading_minutes\": 1,\n        \"seo_title\": null,\n        \"meta_description\": null,\n        \"canonical_url\": null,\n        \"focus_keyword\": null,\n        \"og_title\": null,\n        \"og_description\": null,\n        \"og_image\": null,\n        \"robots_index\": true,\n        \"robots_follow\": true,\n        \"faq_schema_enabled\": true,\n        \"cta_enabled\": false,\n        \"cta_title\": null,\n        \"cta_description\": null,\n        \"cta_button_text\": null,\n        \"cta_button_url\": null,\n        \"cta_image\": null,\n        \"related_mode\": \"AUTOMATIC\",\n        \"autosave\": null,\n        \"autosaved_at\": null,\n        \"version\": 1,\n        \"created_by_id\": 1,\n        \"updated_by_id\": 1,\n        \"created_at\": \"2026-11-02T14:53:55.000000Z\",\n        \"updated_at\": \"2026-11-02T14:53:55.000000Z\",\n        \"tags\": [\n            {\n                \"id\": \"01m6ebzw06rkkjf1dztnjvf583\",\n                \"name\": \"staging\",\n                \"slug\": \"staging\",\n                \"created_at\": \"2026-11-02T14:53:06.000000Z\",\n                \"updated_at\": \"2026-11-02T14:53:06.000000Z\",\n                \"pivot\": {\n                    \"blog_post_id\": \"01m6ec1brdxj6jg0tykce9a3g2\",\n                    \"blog_tag_id\": \"01m6ebzw06rkkjf1dztnjvf583\"\n                }\n            },\n            {\n                \"id\": \"01m6ec1brmgyk8jk54as6pn286\",\n                \"name\": \"api\",\n                \"slug\": \"api\",\n                \"created_at\": \"2026-11-02T14:53:55.000000Z\",\n                \"updated_at\": \"2026-11-02T14:53:55.000000Z\",\n                \"pivot\": {\n                    \"blog_post_id\": \"01m6ec1brdxj6jg0tykce9a3g2\",\n                    \"blog_tag_id\": \"01m6ec1brmgyk8jk54as6pn286\"\n                }\n            }\n        ]\n    }\n}"
						}
					]
				},
				{
					"name": "List blog posts",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Lists blog posts', () => { pm.response.to.have.status(200); pm.expect(pm.response.json().ok).to.eql(true); });"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/admin/blogs?page=1&pageSize=15",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"admin",
								"blogs"
							],
							"query": [
								{
									"key": "page",
									"value": "1"
								},
								{
									"key": "pageSize",
									"value": "15"
								}
							]
						}
					},
					"response": [
						{
							"name": "List blog posts",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Authorization",
										"value": "Bearer {{adminToken}}"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/admin/blogs?page=1&pageSize=15",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"admin",
										"blogs"
									],
									"query": [
										{
											"key": "page",
											"value": "1"
										},
										{
											"key": "pageSize",
											"value": "15"
										}
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:53:36 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Vary",
									"value": "Authorization"
								},
								{
									"key": "Cache-Control",
									"value": "no-store, private"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "60"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "58"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n    \"ok\": true,\n    \"data\": {\n        \"current_page\": 1,\n        \"data\": [\n            {\n                \"id\": \"01m6ebzvzf12ts2b1vnbxpfr8t\",\n                \"title\": \"Staging Blog Import Test\",\n                \"slug\": \"staging-blog-import-test\",\n                \"excerpt\": \"A temporary import test.\",\n                \"content\": \"<h2>Import test</h2><p>This article was imported in staging.</p>\",\n                \"featured_image\": null,\n                \"featured_image_alt\": null,\n                \"featured_image_title\": null,\n                \"category_id\": \"01m6ebzvyxx7kqhtst7xemmg44\",\n                \"author_id\": \"01m6ebzvz49g2ya0e2j637ypg0\",\n                \"status\": \"PUBLISHED\",\n                \"published_at\": \"2026-11-02T10:00:00.000000Z\",\n                \"scheduled_at\": null,\n                \"content_updated_at\": null,\n                \"reading_minutes\": 1,\n                \"seo_title\": \"Staging Blog Import Test\",\n                \"meta_description\": \"Temporary staging test.\",\n                \"canonical_url\": null,\n                \"focus_keyword\": \"staging\",\n                \"og_title\": \"\",\n                \"og_description\": \"\",\n                \"og_image\": null,\n                \"robots_index\": false,\n                \"robots_follow\": false,\n                \"faq_schema_enabled\": false,\n                \"cta_enabled\": false,\n                \"cta_title\": null,\n                \"cta_description\": null,\n                \"cta_button_text\": null,\n                \"cta_button_url\": null,\n                \"cta_image\": null,\n                \"related_mode\": \"AUTOMATIC\",\n                \"autosave\": null,\n                \"autosaved_at\": null,\n                \"version\": 1,\n                \"created_by_id\": 1,\n                \"updated_by_id\": 1,\n                \"created_at\": \"2026-11-02T10:00:00.000000Z\",\n                \"updated_at\": \"2026-11-02T14:53:06.000000Z\"\n            }\n        ],\n        \"first_page_url\": \"https://secondphonenumber.worksqr.com/api/admin/blogs?page=1\",\n        \"from\": 1,\n        \"last_page\": 1,\n        \"last_page_url\": \"https://secondphonenumber.worksqr.com/api/admin/blogs?page=1\",\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://secondphonenumber.worksqr.com/api/admin/blogs?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"next_page_url\": null,\n        \"path\": \"https://secondphonenumber.worksqr.com/api/admin/blogs\",\n        \"per_page\": 15,\n        \"prev_page_url\": null,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
						}
					]
				},
				{
					"name": "Set post inactive",
					"event": [{
						"listen": "test",
						"script": { "type": "text/javascript", "exec": ["pm.test('Post is inactive', () => { pm.response.to.have.status(200); pm.expect(pm.response.json().data.is_active).to.eql(false); });"] }
					}],
					"request": {
						"method": "POST",
						"header": [{ "key": "Authorization", "value": "Bearer {{adminToken}}" }],
						"url": "{{baseUrl}}/admin/blogs/{{postId}}/inactive"
					},
					"response": []
				},
				{
					"name": "Set post active",
					"event": [{
						"listen": "test",
						"script": { "type": "text/javascript", "exec": ["pm.test('Post is active', () => { pm.response.to.have.status(200); pm.expect(pm.response.json().data.is_active).to.eql(true); });"] }
					}],
					"request": {
						"method": "POST",
						"header": [{ "key": "Authorization", "value": "Bearer {{adminToken}}" }],
						"url": "{{baseUrl}}/admin/blogs/{{postId}}/active"
					},
					"response": []
				},
				{
					"name": "Delete post permanently — ADMIN only",
					"event": [{
						"listen": "test",
						"script": { "type": "text/javascript", "exec": ["pm.test('Post deleted', () => { pm.response.to.have.status(200); pm.expect(pm.response.json().ok).to.eql(true); });"] }
					}],
					"request": {
						"method": "DELETE",
						"header": [{ "key": "Authorization", "value": "Bearer {{adminToken}}" }],
						"url": "{{baseUrl}}/admin/blogs/{{postId}}"
					},
					"response": []
				},
				{
					"name": "Import JSON — dry run",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Dry run is accepted', () => pm.response.to.have.status(200));",
									"const body = pm.response.json();",
									"pm.expect(body.ok).to.eql(true);",
									"pm.expect(body.data.dryRun).to.eql(true);",
									"pm.expect(body.data.summary).to.have.property('posts');"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "file",
									"description": "Select blog-export-single.json in Postman if your client does not resolve file-path variables.",
									"type": "file",
									"src": "{{importFilePath}}"
								},
								{
									"key": "existing",
									"value": "skip",
									"type": "text"
								},
								{
									"key": "dryRun",
									"value": "1",
									"type": "text"
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/blog/admin/blogs/import-json",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"blog",
								"admin",
								"blogs",
								"import-json"
							]
						}
					},
					"response": []
				},
				{
					"name": "Import JSON — write",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Import completes', () => pm.response.to.have.status(200));",
									"const body = pm.response.json();",
									"pm.expect(body.ok).to.eql(true);",
									"pm.expect(body.data.dryRun).to.eql(false);"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "file",
									"description": "Use only after the dry run is correct.",
									"type": "file",
									"src": "{{importFilePath}}"
								},
								{
									"key": "existing",
									"value": "skip",
									"type": "text"
								},
								{
									"key": "dryRun",
									"value": "0",
									"type": "text"
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/blog/admin/blogs/import-json",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"blog",
								"admin",
								"blogs",
								"import-json"
							]
						}
					},
					"response": [
						{
							"name": "Import JSON — write",
							"originalRequest": {
								"method": "POST",
								"header": [
									{
										"key": "Authorization",
										"value": "Bearer {{adminToken}}"
									}
								],
								"body": {
									"mode": "formdata",
									"formdata": [
										{
											"key": "file",
											"description": "Use only after the dry run is correct.",
											"type": "file",
											"src": [
												"{{importFilePath}}",
												"/home/p21-0069/Downloads-local/blog-export-single.json"
											]
										},
										{
											"key": "existing",
											"value": "skip",
											"type": "text"
										},
										{
											"key": "dryRun",
											"value": "0",
											"type": "text"
										}
									]
								},
								"url": {
									"raw": "{{baseUrl}}/blog/admin/blogs/import-json",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"blog",
										"admin",
										"blogs",
										"import-json"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "",
							"header": [
								{
									"key": "Date",
									"value": "Mon, 02 Nov 2026 14:53:06 GMT"
								},
								{
									"key": "Server",
									"value": "Apache/2.4.41 (Ubuntu)"
								},
								{
									"key": "Vary",
									"value": "Authorization"
								},
								{
									"key": "Cache-Control",
									"value": "no-store, private"
								},
								{
									"key": "X-RateLimit-Limit",
									"value": "10"
								},
								{
									"key": "X-RateLimit-Remaining",
									"value": "9"
								},
								{
									"key": "Access-Control-Allow-Origin",
									"value": "*"
								},
								{
									"key": "Keep-Alive",
									"value": "timeout=5, max=100"
								},
								{
									"key": "Connection",
									"value": "Keep-Alive"
								},
								{
									"key": "Transfer-Encoding",
									"value": "chunked"
								},
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n    \"ok\": true,\n    \"message\": \"Imported 1 articles\",\n    \"data\": {\n        \"dryRun\": false,\n        \"source\": \"https://secondlinenumber.com\",\n        \"summary\": {\n            \"posts\": 1,\n            \"create\": 1,\n            \"update\": 0,\n            \"skip\": 0,\n            \"fail\": 0,\n            \"faqs\": 1,\n            \"categoriesCreated\": 0,\n            \"authorsCreated\": 0,\n            \"redirectsCreated\": 0,\n            \"imagesFromLibrary\": 0,\n            \"mediaCreated\": 0,\n            \"imagesToUpload\": 0,\n            \"imagesMissing\": 0\n        },\n        \"posts\": [\n            {\n                \"slug\": \"staging-blog-import-test\",\n                \"title\": \"Staging Blog Import Test\",\n                \"action\": \"create\",\n                \"status\": \"PUBLISHED\",\n                \"faqs\": 1,\n                \"images\": 0,\n                \"warnings\": [],\n                \"reason\": null\n            }\n        ],\n        \"notes\": [],\n        \"imagesToUpload\": [],\n        \"imagesMissing\": []\n    }\n}"
						}
					]
				}
			]
		},
		{
			"name": "Blog Media",
			"item": [
				{
					"name": "Upload Base64 image",
					"request": {
						"method": "POST",
						"header": [{"key":"Authorization","value":"Bearer {{adminToken}}"},{"key":"Content-Type","value":"application/json"}],
						"body": {"mode":"raw","raw":"{\n  \"filename\": \"postman-sample.png\",\n  \"data\": \"{{mediaData}}\",\n  \"alt\": \"Postman Blog image\",\n  \"title\": \"Blog media smoke test\"\n}"},
						"url": {"raw":"{{baseUrl}}/blog/admin/media","host":["{{baseUrl}}"],"path":["blog","admin","media"]}
					},
					"event": [{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('Uploads Base64 image', () => pm.response.to.have.status(201));","const body = pm.response.json();","pm.collectionVariables.set('featuredMediaId', body.data.id);","pm.collectionVariables.set('mediaUrl', body.data.url);"]}}],
					"response": []
				},
				{
					"name": "Create draft with Base64 images — one API call",
					"request": {
						"method": "POST",
						"header": [{"key":"Authorization","value":"Bearer {{adminToken}}"},{"key":"Content-Type","value":"application/json"}],
						"body": {"mode":"raw","raw":"{\n  \"intent\": \"draft\",\n  \"values\": {\n    \"title\": \"Blog media smoke-test post\",\n    \"slug\": \"blog-media-smoke-test-post\",\n    \"featuredImage\": {\"filename\": \"cover.png\", \"data\": \"{{mediaData}}\", \"alt\": \"Blog cover\"},\n    \"contentImages\": [{\"clientId\": \"inline-1\", \"filename\": \"inline.png\", \"data\": \"{{mediaData}}\", \"alt\": \"Inline image\"}],\n    \"content\": \"<p>Blog image.</p><img data-blog-image-id=\\\"inline-1\\\">\"\n  }\n}"},
						"url": {"raw":"{{baseUrl}}/admin/blogs","host":["{{baseUrl}}"],"path":["admin","blogs"]}
					},
					"response": []
				}
			]
		},
		{
			"name": "Internal Blog Crypto — ADMIN only",
			"item": [
				{
					"name": "Encrypt plaintext",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test('Encrypts with the Blog API key', () => pm.response.to.have.status(200));",
									"const body = pm.response.json();",
									"pm.expect(body.ok).to.eql(true);",
									"pm.expect(body.ciphertext).to.be.a('string').and.not.empty;",
									"pm.collectionVariables.set('cryptoCiphertext', body.ciphertext);"
								],
								"type": "text/javascript",
								"packages": {},
								"requests": {}
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							},
							{
								"key": "Content-Type",
								"value": "text/plain"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"plaintext\": \"{{cryptoPlaintext}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/blog/admin/crypto/encrypt",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"blog",
								"admin",
								"crypto",
								"encrypt"
							]
						}
					},
					"response": []
				},
				{
					"name": "Decrypt ciphertext",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test('Decrypts with the Blog API key', () => pm.response.to.have.status(200));",
									"const body = pm.response.json();",
									"pm.expect(body.ok).to.eql(true);",
									"pm.expect(body.plaintext).to.eql(pm.collectionVariables.get('cryptoPlaintext'));"
								],
								"type": "text/javascript",
								"packages": {},
								"requests": {}
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							},
							{
								"key": "Content-Type",
								"value": "text/plain"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"ciphertext\": \"{{cryptoCiphertext}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/blog/admin/crypto/decrypt",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"blog",
								"admin",
								"crypto",
								"decrypt"
							]
						}
					},
					"response": []
				},
				{
					"name": "Decrypt last public API response",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test('Decrypts the stored public API response', () => pm.response.to.have.status(200));",
									"const body = pm.response.json();",
									"pm.expect(body.ok).to.eql(true);",
									"pm.expect(JSON.parse(body.plaintext)).to.have.property('posts');"
								],
								"type": "text/javascript",
								"packages": {},
								"requests": {}
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{adminToken}}"
							},
							{
								"key": "Content-Type",
								"value": "text/plain"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{{publicCiphertext}}"
						},
						"url": {
							"raw": "{{baseUrl}}/blog/admin/crypto/decrypt",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"blog",
								"admin",
								"crypto",
								"decrypt"
							]
						},
						"description": "Run Public API / List posts — encrypted first. This proves the public ciphertext decrypts to its original JSON."
					},
					"response": []
				}
			]
		}
	],
	"variable": [
		{
			"key": "baseUrl",
			"value": "https://secondphonenumber.worksqr.com/api",
			"type": "string"
		},
		{
			"key": "adminEmail",
			"value": "admin@example.com",
			"type": "string"
		},
		{
			"key": "adminPassword",
			"value": "",
			"type": "string"
		},
		{
			"key": "adminToken",
			"value": "",
			"type": "string"
		},
		{
			"key": "postId",
			"value": "",
			"type": "string"
		},
		{
			"key": "postSlug",
			"value": "",
			"type": "string"
		},
		{
			"key": "importFilePath",
			"value": "/absolute/path/to/blog-export-single.json",
			"type": "string"
		},
		{
			"key": "cryptoPlaintext",
			"value": "{\"message\":\"Blog crypto smoke test\"}",
			"type": "string"
		},
		{
			"key": "cryptoCiphertext",
			"value": "",
			"type": "string"
		},
		{
			"key": "publicCiphertext",
			"value": "",
			"type": "string"
		},
		{
			"key": "mediaData",
			"value": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9JVoAAAAAASUVORK5CYII=",
			"type": "string"
		},
		{
			"key": "featuredMediaId",
			"value": "",
			"type": "string"
		},
		{
			"key": "mediaUrl",
			"value": "",
			"type": "string"
		}
	]
}
