{
    "openapi": "3.1.0",
    "info": {
        "title": "FreePrivacyPolicy.app API",
        "version": "1.0.0",
        "license": {
            "name": "Proprietary",
            "url": "https://freeprivacypolicy.app/docs"
        },
        "summary": "Generate and host privacy policies, terms, EULAs, child safety standards and app-ads.txt from code.",
        "description": "Generate and host the legal pages your app or website needs, from code.\n\nEvery policy you publish gets its own subdomain, **`{slug}.freeprivacypolicy.app`**, with:\n\n| Page | Address |\n| --- | --- |\n| Company page | `https://{slug}.freeprivacypolicy.app/` |\n| Privacy policy | `https://{slug}.freeprivacypolicy.app/privacy-policy` |\n| Terms of service | `https://{slug}.freeprivacypolicy.app/terms-of-service` |\n| End user license agreement (EULA) | `https://{slug}.freeprivacypolicy.app/end-user-license-agreement` |\n| Child safety standards | `https://{slug}.freeprivacypolicy.app/child-safety-standards` |\n| ads.txt | `https://{slug}.freeprivacypolicy.app/ads.txt` (from the policy's company) |\n| app-ads.txt | `https://{slug}.freeprivacypolicy.app/app-ads.txt` (every company of your account, merged) |\n\nThe text is written from your answers: the product type, the country you operate from, the third-party services the product uses (AdMob, Firebase, RevenueCat, Stripe, OpenAI...) and optional sections (accounts, location, GDPR...). Call `GET /options` for the full catalog.\n\n## Authentication\n\nSend your personal API key on every request, in either header:\n\n```http\nAuthorization: Bearer fpp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nX-API-Token: fpp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n```\n\nCreate the key in your account at **/welcome** (the same key connects Claude Code and Codex over MCP). It is shown once; creating a new one revokes the old. Every request only reads and changes the records of the account that owns the key.\n\n## Conventions\n\n- JSON in, JSON out. Send `Accept: application/json`.\n- Single records come wrapped in `data`. Lists are paginated with `data`, `links` and `meta` (`?page=` and `?per_page=` 1-100, default 25).\n- Records of another account answer **404**, never 403.\n- Errors: `401` bad or missing key, `404` not found, `422` validation (`message` + `errors` per field), `429` rate limited.\n\n## Rate limits\n\n60 requests per minute per key, counted per key wherever the calls come from. Every response carries `X-RateLimit-Limit` and `X-RateLimit-Remaining`; a `429` also carries `Retry-After` (seconds).",
        "contact": {
            "name": "FreePrivacyPolicy.app",
            "url": "https://freeprivacypolicy.app/docs"
        }
    },
    "externalDocs": {
        "description": "Guides, recipes and the rendered reference",
        "url": "https://freeprivacypolicy.app/docs"
    },
    "servers": [
        {
            "url": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1",
            "description": "Production"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        },
        {
            "apiKeyHeader": []
        }
    ],
    "tags": [
        {
            "name": "Account",
            "description": "The account the API key belongs to."
        },
        {
            "name": "Catalog",
            "description": "Product types, third-party services, optional sections and countries a policy can use."
        },
        {
            "name": "Policies",
            "description": "Generate, publish, update and take down the legal pages hosted on `{slug}.freeprivacypolicy.app`."
        },
        {
            "name": "Companies",
            "description": "Publisher details shown on the policy pages, plus the ads.txt and app-ads.txt lines they serve. Logos are uploaded in the dashboard, not over the API."
        }
    ],
    "paths": {
        "/me": {
            "get": {
                "tags": [
                    "Account"
                ],
                "operationId": "getMe",
                "summary": "Get the current account",
                "description": "Returns the account the API key belongs to, with how many policies and companies it has. Handy to check that a key works.",
                "responses": {
                    "200": {
                        "description": "The account.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Me"
                                        }
                                    }
                                },
                                "examples": {
                                    "account": {
                                        "summary": "An account with two policies",
                                        "value": {
                                            "data": {
                                                "id": 7,
                                                "name": "Ada Lovelace",
                                                "email": "ada@acme.dev",
                                                "policies_count": 2,
                                                "companies_count": 1
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X GET \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/me\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/me\", {\n  method: \"GET\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"GET\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/me\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->get('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/me')\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            }
        },
        "/options": {
            "get": {
                "tags": [
                    "Catalog"
                ],
                "operationId": "getOptions",
                "summary": "List policy options",
                "description": "Everything a policy can cover: product types, third-party services (each adds its own disclosure), optional sections and countries. Use the `key` values in `product_type`, `services` and `clauses`, and a country `name` in `country`.",
                "responses": {
                    "200": {
                        "description": "The catalog.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Options"
                                        }
                                    }
                                },
                                "examples": {
                                    "catalog": {
                                        "summary": "Catalog (shortened)",
                                        "value": {
                                            "data": {
                                                "product_types": [
                                                    {
                                                        "key": "mobile_app",
                                                        "label": "Mobile App"
                                                    }
                                                ],
                                                "services": [
                                                    {
                                                        "key": "admob",
                                                        "label": "AdMob",
                                                        "group": "Ads",
                                                        "description": "We use Google AdMob to serve personalized and non-personalized ads in our product...",
                                                        "products": [
                                                            "mobile_app",
                                                            "game"
                                                        ],
                                                        "ads": true
                                                    }
                                                ],
                                                "clauses": [
                                                    {
                                                        "key": "accounts",
                                                        "label": "Accounts and sign-in",
                                                        "category": "Data you collect",
                                                        "description": "Explain the details collected when people create an account."
                                                    }
                                                ],
                                                "countries": [
                                                    {
                                                        "code": "PT",
                                                        "name": "Portugal"
                                                    }
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X GET \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/options\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/options\", {\n  method: \"GET\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"GET\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/options\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->get('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/options')\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            }
        },
        "/policies": {
            "get": {
                "tags": [
                    "Policies"
                ],
                "operationId": "listPolicies",
                "summary": "List policies",
                "description": "Your policies, published or not, sorted by name.",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page number, starting at 1.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page, 1 to 100.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 25
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "A page of policies.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data",
                                        "links",
                                        "meta"
                                    ],
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Policy"
                                            }
                                        },
                                        "links": {
                                            "$ref": "#/components/schemas/PaginationLinks"
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/PaginationMeta"
                                        }
                                    }
                                },
                                "examples": {
                                    "page": {
                                        "summary": "First page",
                                        "value": {
                                            "data": [
                                                {
                                                    "id": 1287,
                                                    "slug": "pocket-notes",
                                                    "name": "Pocket Notes",
                                                    "product_type": "mobile_app",
                                                    "country": "Portugal",
                                                    "services": [
                                                        "admob",
                                                        "firebase_analytics",
                                                        "revenuecat"
                                                    ],
                                                    "clauses": [
                                                        "accounts",
                                                        "metadata"
                                                    ],
                                                    "markdown": "# Privacy Policy\n\nThis Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...",
                                                    "html": "<h1>Privacy Policy</h1>\n<p>This Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...</p>",
                                                    "published": true,
                                                    "published_at": "2026-09-20T08:30:00+00:00",
                                                    "noindex": false,
                                                    "company_id": 42,
                                                    "contact": {
                                                        "id": 42,
                                                        "company_name": "Acme Labs Ltd.",
                                                        "address": "1 Market Street, Lisbon, Portugal",
                                                        "email": "privacy@acme.dev",
                                                        "about": "Acme Labs builds productivity apps for small teams.",
                                                        "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                        "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                        "show_resources_publicly": true
                                                    },
                                                    "public_urls": {
                                                        "landing": "https://pocket-notes.freeprivacypolicy.app",
                                                        "privacy_policy": "https://pocket-notes.freeprivacypolicy.app/privacy-policy",
                                                        "child_safety": "https://pocket-notes.freeprivacypolicy.app/child-safety-standards",
                                                        "eula": "https://pocket-notes.freeprivacypolicy.app/end-user-license-agreement",
                                                        "terms": "https://pocket-notes.freeprivacypolicy.app/terms-of-service",
                                                        "ads_txt": "https://pocket-notes.freeprivacypolicy.app/ads.txt",
                                                        "app_ads_txt": "https://pocket-notes.freeprivacypolicy.app/app-ads.txt"
                                                    },
                                                    "created_at": "2026-09-20T08:30:00+00:00",
                                                    "updated_at": "2026-09-20T08:30:00+00:00"
                                                }
                                            ],
                                            "links": {
                                                "first": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?page=1",
                                                "last": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?page=1",
                                                "prev": null,
                                                "next": null
                                            },
                                            "meta": {
                                                "current_page": 1,
                                                "from": 1,
                                                "last_page": 1,
                                                "links": [
                                                    {
                                                        "url": null,
                                                        "label": "&laquo; Previous",
                                                        "page": null,
                                                        "active": false
                                                    },
                                                    {
                                                        "url": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?page=1",
                                                        "label": "1",
                                                        "page": 1,
                                                        "active": true
                                                    },
                                                    {
                                                        "url": null,
                                                        "label": "Next &raquo;",
                                                        "page": null,
                                                        "active": false
                                                    }
                                                ],
                                                "path": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies",
                                                "per_page": 25,
                                                "to": 1,
                                                "total": 1
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X GET \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?per_page=25\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?per_page=25\", {\n  method: \"GET\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"GET\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?per_page=25\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->get('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies?per_page=25')\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            },
            "post": {
                "tags": [
                    "Policies"
                ],
                "operationId": "createPolicy",
                "summary": "Generate and publish a policy",
                "description": "Writes the policy from the settings you send and publishes it right away on `{slug}.freeprivacypolicy.app`.\n\nThe publisher shown on the pages comes from, in order:\n\n1. `company_id`: one of your companies (`GET /companies`), shared between policies;\n2. `contact`: a new company used only by this policy;\n3. nothing: a new company named after the policy, with `{slug}@freeprivacypolicy.app` as the email.\n\n`company_id` and `contact` cannot be sent together.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PolicyInput"
                            },
                            "examples": {
                                "minimal": {
                                    "summary": "Only the required fields",
                                    "value": {
                                        "name": "Pocket Notes",
                                        "product_type": "mobile_app",
                                        "country": "Portugal"
                                    }
                                },
                                "withContact": {
                                    "summary": "Services, sections and a dedicated company",
                                    "value": {
                                        "name": "Pocket Notes",
                                        "product_type": "mobile_app",
                                        "country": "Portugal",
                                        "services": [
                                            "admob",
                                            "firebase_analytics",
                                            "revenuecat"
                                        ],
                                        "clauses": [
                                            "accounts",
                                            "metadata"
                                        ],
                                        "slug": "pocket-notes",
                                        "contact": {
                                            "company_name": "Acme Labs Ltd.",
                                            "email": "privacy@acme.dev",
                                            "address": "1 Market Street, Lisbon, Portugal",
                                            "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                            "show_resources_publicly": true
                                        }
                                    }
                                },
                                "withCompany": {
                                    "summary": "Reuse one of your companies",
                                    "value": {
                                        "name": "Pocket Notes",
                                        "product_type": "mobile_app",
                                        "country": "Portugal",
                                        "services": [
                                            "admob",
                                            "firebase_analytics"
                                        ],
                                        "company_id": 42
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "The policy was published.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Policy"
                                        }
                                    }
                                },
                                "examples": {
                                    "published": {
                                        "summary": "Published policy",
                                        "value": {
                                            "data": {
                                                "id": 1287,
                                                "slug": "pocket-notes",
                                                "name": "Pocket Notes",
                                                "product_type": "mobile_app",
                                                "country": "Portugal",
                                                "services": [
                                                    "admob",
                                                    "firebase_analytics",
                                                    "revenuecat"
                                                ],
                                                "clauses": [
                                                    "accounts",
                                                    "metadata"
                                                ],
                                                "markdown": "# Privacy Policy\n\nThis Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...",
                                                "html": "<h1>Privacy Policy</h1>\n<p>This Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...</p>",
                                                "published": true,
                                                "published_at": "2026-09-20T08:30:00+00:00",
                                                "noindex": false,
                                                "company_id": 42,
                                                "contact": {
                                                    "id": 42,
                                                    "company_name": "Acme Labs Ltd.",
                                                    "address": "1 Market Street, Lisbon, Portugal",
                                                    "email": "privacy@acme.dev",
                                                    "about": "Acme Labs builds productivity apps for small teams.",
                                                    "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "show_resources_publicly": true
                                                },
                                                "public_urls": {
                                                    "landing": "https://pocket-notes.freeprivacypolicy.app",
                                                    "privacy_policy": "https://pocket-notes.freeprivacypolicy.app/privacy-policy",
                                                    "child_safety": "https://pocket-notes.freeprivacypolicy.app/child-safety-standards",
                                                    "eula": "https://pocket-notes.freeprivacypolicy.app/end-user-license-agreement",
                                                    "terms": "https://pocket-notes.freeprivacypolicy.app/terms-of-service",
                                                    "ads_txt": "https://pocket-notes.freeprivacypolicy.app/ads.txt",
                                                    "app_ads_txt": "https://pocket-notes.freeprivacypolicy.app/app-ads.txt"
                                                },
                                                "created_at": "2026-09-20T08:30:00+00:00",
                                                "updated_at": "2026-09-20T08:30:00+00:00"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X POST \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Pocket Notes\",\n    \"product_type\": \"mobile_app\",\n    \"country\": \"Portugal\",\n    \"services\": [\n        \"admob\",\n        \"firebase_analytics\",\n        \"revenuecat\"\n    ],\n    \"clauses\": [\n        \"accounts\",\n        \"metadata\"\n    ],\n    \"slug\": \"pocket-notes\",\n    \"contact\": {\n        \"company_name\": \"Acme Labs Ltd.\",\n        \"email\": \"privacy@acme.dev\",\n        \"address\": \"1 Market Street, Lisbon, Portugal\",\n        \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\",\n        \"show_resources_publicly\": true\n    }\n}'"
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies\", {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n      \"name\": \"Pocket Notes\",\n      \"product_type\": \"mobile_app\",\n      \"country\": \"Portugal\",\n      \"services\": [\n          \"admob\",\n          \"firebase_analytics\",\n          \"revenuecat\"\n      ],\n      \"clauses\": [\n          \"accounts\",\n          \"metadata\"\n      ],\n      \"slug\": \"pocket-notes\",\n      \"contact\": {\n          \"company_name\": \"Acme Labs Ltd.\",\n          \"email\": \"privacy@acme.dev\",\n          \"address\": \"1 Market Street, Lisbon, Portugal\",\n          \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\",\n          \"show_resources_publicly\": true\n      }\n  }),\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"POST\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    json={\n        \"name\": \"Pocket Notes\",\n        \"product_type\": \"mobile_app\",\n        \"country\": \"Portugal\",\n        \"services\": [\n            \"admob\",\n            \"firebase_analytics\",\n            \"revenuecat\"\n        ],\n        \"clauses\": [\n            \"accounts\",\n            \"metadata\"\n        ],\n        \"slug\": \"pocket-notes\",\n        \"contact\": {\n            \"company_name\": \"Acme Labs Ltd.\",\n            \"email\": \"privacy@acme.dev\",\n            \"address\": \"1 Market Street, Lisbon, Portugal\",\n            \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\",\n            \"show_resources_publicly\": True\n        }\n    },\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->post('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies', [\n        'name' => 'Pocket Notes',\n        'product_type' => 'mobile_app',\n        'country' => 'Portugal',\n        'services' => [\n            'admob',\n            'firebase_analytics',\n            'revenuecat',\n        ],\n        'clauses' => [\n            'accounts',\n            'metadata',\n        ],\n        'slug' => 'pocket-notes',\n        'contact' => [\n            'company_name' => 'Acme Labs Ltd.',\n            'email' => 'privacy@acme.dev',\n            'address' => '1 Market Street, Lisbon, Portugal',\n            'app_ads_txt' => 'google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0',\n            'show_resources_publicly' => true,\n        ],\n    ])\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            }
        },
        "/policies/{slug}": {
            "parameters": [
                {
                    "name": "slug",
                    "in": "path",
                    "required": true,
                    "description": "The policy slug (its subdomain).",
                    "schema": {
                        "type": "string"
                    },
                    "example": "pocket-notes"
                }
            ],
            "get": {
                "tags": [
                    "Policies"
                ],
                "operationId": "getPolicy",
                "summary": "Get a policy",
                "description": "One of your policies, with its Markdown and HTML text and the addresses of its public pages.",
                "responses": {
                    "200": {
                        "description": "The policy.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Policy"
                                        }
                                    }
                                },
                                "examples": {
                                    "policy": {
                                        "summary": "A published policy",
                                        "value": {
                                            "data": {
                                                "id": 1287,
                                                "slug": "pocket-notes",
                                                "name": "Pocket Notes",
                                                "product_type": "mobile_app",
                                                "country": "Portugal",
                                                "services": [
                                                    "admob",
                                                    "firebase_analytics",
                                                    "revenuecat"
                                                ],
                                                "clauses": [
                                                    "accounts",
                                                    "metadata"
                                                ],
                                                "markdown": "# Privacy Policy\n\nThis Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...",
                                                "html": "<h1>Privacy Policy</h1>\n<p>This Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...</p>",
                                                "published": true,
                                                "published_at": "2026-09-20T08:30:00+00:00",
                                                "noindex": false,
                                                "company_id": 42,
                                                "contact": {
                                                    "id": 42,
                                                    "company_name": "Acme Labs Ltd.",
                                                    "address": "1 Market Street, Lisbon, Portugal",
                                                    "email": "privacy@acme.dev",
                                                    "about": "Acme Labs builds productivity apps for small teams.",
                                                    "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "show_resources_publicly": true
                                                },
                                                "public_urls": {
                                                    "landing": "https://pocket-notes.freeprivacypolicy.app",
                                                    "privacy_policy": "https://pocket-notes.freeprivacypolicy.app/privacy-policy",
                                                    "child_safety": "https://pocket-notes.freeprivacypolicy.app/child-safety-standards",
                                                    "eula": "https://pocket-notes.freeprivacypolicy.app/end-user-license-agreement",
                                                    "terms": "https://pocket-notes.freeprivacypolicy.app/terms-of-service",
                                                    "ads_txt": "https://pocket-notes.freeprivacypolicy.app/ads.txt",
                                                    "app_ads_txt": "https://pocket-notes.freeprivacypolicy.app/app-ads.txt"
                                                },
                                                "created_at": "2026-09-20T08:30:00+00:00",
                                                "updated_at": "2026-09-20T08:30:00+00:00"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X GET \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\", {\n  method: \"GET\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"GET\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->get('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes')\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Policies"
                ],
                "operationId": "updatePolicy",
                "summary": "Update a policy",
                "description": "Only the fields you send change.\n\n- Settings (`name`, `product_type`, `country`, `services`, `clauses`, `contact`, `company_id`) regenerate the text, which replaces edits made by hand. Send `markdown` in the same request to keep your own text.\n- `markdown` alone replaces the text as given.\n- `published: false` takes every public page offline (404); `true` puts them back.\n- `noindex` and `slug` never touch the text.\n- `company_id: null` detaches the company; the pages then use the contact details saved with the policy.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PolicyUpdate"
                            },
                            "examples": {
                                "services": {
                                    "summary": "Add a service and a section",
                                    "value": {
                                        "services": [
                                            "admob",
                                            "firebase_analytics",
                                            "revenuecat",
                                            "openai"
                                        ],
                                        "clauses": [
                                            "accounts",
                                            "metadata",
                                            "ai"
                                        ]
                                    }
                                },
                                "unpublish": {
                                    "summary": "Take the pages offline",
                                    "value": {
                                        "published": false
                                    }
                                },
                                "switchCompany": {
                                    "summary": "Use another of your companies",
                                    "value": {
                                        "company_id": 42
                                    }
                                },
                                "ownText": {
                                    "summary": "Publish your own text",
                                    "value": {
                                        "markdown": "# Privacy Policy\n\nWe do not collect personal data."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "The updated policy.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Policy"
                                        }
                                    }
                                },
                                "examples": {
                                    "updated": {
                                        "summary": "Updated policy",
                                        "value": {
                                            "data": {
                                                "id": 1287,
                                                "slug": "pocket-notes",
                                                "name": "Pocket Notes",
                                                "product_type": "mobile_app",
                                                "country": "Portugal",
                                                "services": [
                                                    "admob",
                                                    "firebase_analytics",
                                                    "revenuecat"
                                                ],
                                                "clauses": [
                                                    "accounts",
                                                    "metadata"
                                                ],
                                                "markdown": "# Privacy Policy\n\nThis Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...",
                                                "html": "<h1>Privacy Policy</h1>\n<p>This Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...</p>",
                                                "published": true,
                                                "published_at": "2026-09-20T08:30:00+00:00",
                                                "noindex": false,
                                                "company_id": 42,
                                                "contact": {
                                                    "id": 42,
                                                    "company_name": "Acme Labs Ltd.",
                                                    "address": "1 Market Street, Lisbon, Portugal",
                                                    "email": "privacy@acme.dev",
                                                    "about": "Acme Labs builds productivity apps for small teams.",
                                                    "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "show_resources_publicly": true
                                                },
                                                "public_urls": {
                                                    "landing": "https://pocket-notes.freeprivacypolicy.app",
                                                    "privacy_policy": "https://pocket-notes.freeprivacypolicy.app/privacy-policy",
                                                    "child_safety": "https://pocket-notes.freeprivacypolicy.app/child-safety-standards",
                                                    "eula": "https://pocket-notes.freeprivacypolicy.app/end-user-license-agreement",
                                                    "terms": "https://pocket-notes.freeprivacypolicy.app/terms-of-service",
                                                    "ads_txt": "https://pocket-notes.freeprivacypolicy.app/ads.txt",
                                                    "app_ads_txt": "https://pocket-notes.freeprivacypolicy.app/app-ads.txt"
                                                },
                                                "created_at": "2026-09-20T08:30:00+00:00",
                                                "updated_at": "2026-09-20T08:30:00+00:00"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X PATCH \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"services\": [\n        \"admob\",\n        \"firebase_analytics\",\n        \"revenuecat\",\n        \"openai\"\n    ],\n    \"clauses\": [\n        \"accounts\",\n        \"metadata\",\n        \"ai\"\n    ]\n}'"
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\", {\n  method: \"PATCH\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n      \"services\": [\n          \"admob\",\n          \"firebase_analytics\",\n          \"revenuecat\",\n          \"openai\"\n      ],\n      \"clauses\": [\n          \"accounts\",\n          \"metadata\",\n          \"ai\"\n      ]\n  }),\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"PATCH\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    json={\n        \"services\": [\n            \"admob\",\n            \"firebase_analytics\",\n            \"revenuecat\",\n            \"openai\"\n        ],\n        \"clauses\": [\n            \"accounts\",\n            \"metadata\",\n            \"ai\"\n        ]\n    },\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->patch('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes', [\n        'services' => [\n            'admob',\n            'firebase_analytics',\n            'revenuecat',\n            'openai',\n        ],\n        'clauses' => [\n            'accounts',\n            'metadata',\n            'ai',\n        ],\n    ])\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Policies"
                ],
                "operationId": "deletePolicy",
                "summary": "Delete a policy",
                "description": "Deletes the policy for good. Its public pages answer 404 and the slug becomes free. Its company is kept. To only take the pages offline, send `published: false` instead.",
                "responses": {
                    "204": {
                        "description": "Deleted.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X DELETE \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\", {\n  method: \"DELETE\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (response.status !== 204) throw new Error(`HTTP ${response.status}`);"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"DELETE\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->delete('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/policies/pocket-notes')\n    ->throw();"
                    }
                ]
            }
        },
        "/companies": {
            "get": {
                "tags": [
                    "Companies"
                ],
                "operationId": "listCompanies",
                "summary": "List companies",
                "description": "Your companies, sorted by name, with how many policies use each one.",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page number, starting at 1.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page, 1 to 100.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 25
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "A page of companies.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data",
                                        "links",
                                        "meta"
                                    ],
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Company"
                                            }
                                        },
                                        "links": {
                                            "$ref": "#/components/schemas/PaginationLinks"
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/PaginationMeta"
                                        }
                                    }
                                },
                                "examples": {
                                    "page": {
                                        "summary": "First page",
                                        "value": {
                                            "data": [
                                                {
                                                    "id": 42,
                                                    "company_name": "Acme Labs Ltd.",
                                                    "email": "privacy@acme.dev",
                                                    "address": "1 Market Street, Lisbon, Portugal",
                                                    "about": "Acme Labs builds productivity apps for small teams.",
                                                    "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                    "show_resources_publicly": true,
                                                    "logo_url": null,
                                                    "policies_count": 2,
                                                    "created_at": "2026-09-01T12:00:00+00:00",
                                                    "updated_at": "2026-09-20T08:30:00+00:00"
                                                }
                                            ],
                                            "links": {
                                                "first": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?page=1",
                                                "last": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?page=1",
                                                "prev": null,
                                                "next": null
                                            },
                                            "meta": {
                                                "current_page": 1,
                                                "from": 1,
                                                "last_page": 1,
                                                "links": [
                                                    {
                                                        "url": null,
                                                        "label": "&laquo; Previous",
                                                        "page": null,
                                                        "active": false
                                                    },
                                                    {
                                                        "url": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?page=1",
                                                        "label": "1",
                                                        "page": 1,
                                                        "active": true
                                                    },
                                                    {
                                                        "url": null,
                                                        "label": "Next &raquo;",
                                                        "page": null,
                                                        "active": false
                                                    }
                                                ],
                                                "path": "https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies",
                                                "per_page": 25,
                                                "to": 1,
                                                "total": 1
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X GET \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?per_page=25\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?per_page=25\", {\n  method: \"GET\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"GET\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?per_page=25\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->get('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies?per_page=25')\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            },
            "post": {
                "tags": [
                    "Companies"
                ],
                "operationId": "createCompany",
                "summary": "Create a company",
                "description": "Creates a publisher you can attach to policies with `company_id`.\n\n`ads_txt` is served at `{slug}/ads.txt` for the policies using this company. `app_ads_txt` lines of all your companies are merged, de-duplicated and served at `{slug}/app-ads.txt` on every one of your policies.\n\nLogos are uploaded in the dashboard; the API returns `logo_url` but does not accept files.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CompanyInput"
                            },
                            "examples": {
                                "company": {
                                    "summary": "Company with app-ads.txt lines",
                                    "value": {
                                        "company_name": "Acme Labs Ltd.",
                                        "email": "privacy@acme.dev",
                                        "address": "1 Market Street, Lisbon, Portugal",
                                        "about": "Acme Labs builds productivity apps for small teams.",
                                        "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\nunity.com, 1234567, DIRECT, 96cabb5fbdde37a7",
                                        "show_resources_publicly": true
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "The company was created.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Company"
                                        }
                                    }
                                },
                                "examples": {
                                    "created": {
                                        "summary": "Created company",
                                        "value": {
                                            "data": {
                                                "id": 42,
                                                "company_name": "Acme Labs Ltd.",
                                                "email": "privacy@acme.dev",
                                                "address": "1 Market Street, Lisbon, Portugal",
                                                "about": "Acme Labs builds productivity apps for small teams.",
                                                "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                "show_resources_publicly": true,
                                                "logo_url": null,
                                                "policies_count": 0,
                                                "created_at": "2026-09-01T12:00:00+00:00",
                                                "updated_at": "2026-09-20T08:30:00+00:00"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X POST \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"company_name\": \"Acme Labs Ltd.\",\n    \"email\": \"privacy@acme.dev\",\n    \"address\": \"1 Market Street, Lisbon, Portugal\",\n    \"about\": \"Acme Labs builds productivity apps for small teams.\",\n    \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\\nunity.com, 1234567, DIRECT, 96cabb5fbdde37a7\",\n    \"show_resources_publicly\": true\n}'"
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies\", {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n      \"company_name\": \"Acme Labs Ltd.\",\n      \"email\": \"privacy@acme.dev\",\n      \"address\": \"1 Market Street, Lisbon, Portugal\",\n      \"about\": \"Acme Labs builds productivity apps for small teams.\",\n      \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\\nunity.com, 1234567, DIRECT, 96cabb5fbdde37a7\",\n      \"show_resources_publicly\": true\n  }),\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"POST\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    json={\n        \"company_name\": \"Acme Labs Ltd.\",\n        \"email\": \"privacy@acme.dev\",\n        \"address\": \"1 Market Street, Lisbon, Portugal\",\n        \"about\": \"Acme Labs builds productivity apps for small teams.\",\n        \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\\nunity.com, 1234567, DIRECT, 96cabb5fbdde37a7\",\n        \"show_resources_publicly\": True\n    },\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->post('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies', [\n        'company_name' => 'Acme Labs Ltd.',\n        'email' => 'privacy@acme.dev',\n        'address' => '1 Market Street, Lisbon, Portugal',\n        'about' => 'Acme Labs builds productivity apps for small teams.',\n        'app_ads_txt' => 'google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\nunity.com, 1234567, DIRECT, 96cabb5fbdde37a7',\n        'show_resources_publicly' => true,\n    ])\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            }
        },
        "/companies/{id}": {
            "parameters": [
                {
                    "name": "id",
                    "in": "path",
                    "required": true,
                    "description": "The company id.",
                    "schema": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "example": 42
                }
            ],
            "get": {
                "tags": [
                    "Companies"
                ],
                "operationId": "getCompany",
                "summary": "Get a company",
                "description": "One of your companies.",
                "responses": {
                    "200": {
                        "description": "The company.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Company"
                                        }
                                    }
                                },
                                "examples": {
                                    "company": {
                                        "summary": "A company",
                                        "value": {
                                            "data": {
                                                "id": 42,
                                                "company_name": "Acme Labs Ltd.",
                                                "email": "privacy@acme.dev",
                                                "address": "1 Market Street, Lisbon, Portugal",
                                                "about": "Acme Labs builds productivity apps for small teams.",
                                                "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                "show_resources_publicly": true,
                                                "logo_url": null,
                                                "policies_count": 2,
                                                "created_at": "2026-09-01T12:00:00+00:00",
                                                "updated_at": "2026-09-20T08:30:00+00:00"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X GET \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\", {\n  method: \"GET\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"GET\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->get('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42')\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Companies"
                ],
                "operationId": "updateCompany",
                "summary": "Update a company",
                "description": "Only the fields you send change. `ads_txt` and `app_ads_txt` replace the whole file: send the current lines too when adding one. The policy pages show the new details at once; their text is not regenerated.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CompanyUpdate"
                            },
                            "examples": {
                                "appAds": {
                                    "summary": "Replace the app-ads.txt lines",
                                    "value": {
                                        "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\napplovin.com, 0123456789abcdef, DIRECT"
                                    }
                                },
                                "rename": {
                                    "summary": "Rename the company",
                                    "value": {
                                        "company_name": "Acme Labs Inc."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "The updated company.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "data"
                                    ],
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Company"
                                        }
                                    }
                                },
                                "examples": {
                                    "updated": {
                                        "summary": "Updated company",
                                        "value": {
                                            "data": {
                                                "id": 42,
                                                "company_name": "Acme Labs Ltd.",
                                                "email": "privacy@acme.dev",
                                                "address": "1 Market Street, Lisbon, Portugal",
                                                "about": "Acme Labs builds productivity apps for small teams.",
                                                "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                                                "show_resources_publicly": true,
                                                "logo_url": null,
                                                "policies_count": 2,
                                                "created_at": "2026-09-01T12:00:00+00:00",
                                                "updated_at": "2026-09-20T08:30:00+00:00"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X PATCH \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\\napplovin.com, 0123456789abcdef, DIRECT\"\n}'"
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\", {\n  method: \"PATCH\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n      \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\\napplovin.com, 0123456789abcdef, DIRECT\"\n  }),\n});\n\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { data } = await response.json();"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"PATCH\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    json={\n        \"app_ads_txt\": \"google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\\napplovin.com, 0123456789abcdef, DIRECT\"\n    },\n    timeout=30,\n)\nresponse.raise_for_status()\ndata = response.json()[\"data\"]"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->patch('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42', [\n        'app_ads_txt' => 'google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0\napplovin.com, 0123456789abcdef, DIRECT',\n    ])\n    ->throw();\n\n$data = $response->json('data');"
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Companies"
                ],
                "operationId": "deleteCompany",
                "summary": "Delete a company",
                "description": "Deletes the company with its logo and its ads.txt and app-ads.txt lines. Policies that used it stay online without a company, using the contact details saved with them.",
                "responses": {
                    "204": {
                        "description": "Deleted.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/TooManyRequests"
                    }
                },
                "x-codeSamples": [
                    {
                        "lang": "Shell",
                        "label": "curl",
                        "source": "curl -X DELETE \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\" \\\n  -H \"Authorization: Bearer $FPP_API_KEY\" \\\n  -H \"Accept: application/json\""
                    },
                    {
                        "lang": "JavaScript",
                        "label": "JavaScript (fetch)",
                        "source": "const response = await fetch(\"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\", {\n  method: \"DELETE\",\n  headers: {\n    Authorization: `Bearer ${process.env.FPP_API_KEY}`,\n    Accept: \"application/json\",\n  },\n});\n\nif (response.status !== 204) throw new Error(`HTTP ${response.status}`);"
                    },
                    {
                        "lang": "Python",
                        "label": "Python (requests)",
                        "source": "import os\nimport requests\n\nresponse = requests.request(\n    \"DELETE\",\n    \"https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42\",\n    headers={\"Authorization\": f\"Bearer {os.environ['FPP_API_KEY']}\", \"Accept\": \"application/json\"},\n    timeout=30,\n)\nresponse.raise_for_status()"
                    },
                    {
                        "lang": "PHP",
                        "label": "PHP (Laravel Http)",
                        "source": "use Illuminate\\Support\\Facades\\Http;\n\n$response = Http::withToken(config('services.freeprivacypolicy.key'))\n    ->acceptJson()\n    ->delete('https://com-company-saudedabateria.freeprivacypolicy.app/api/v1/companies/42')\n    ->throw();"
                    }
                ]
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "fpp_ key",
                "description": "Your personal API key, created at /welcome."
            },
            "apiKeyHeader": {
                "type": "apiKey",
                "in": "header",
                "name": "X-API-Token",
                "description": "The same key, for clients that cannot set the Authorization header."
            }
        },
        "headers": {
            "X-RateLimit-Limit": {
                "description": "Requests allowed per minute for this key.",
                "schema": {
                    "type": "integer",
                    "examples": [
                        60
                    ]
                }
            },
            "X-RateLimit-Remaining": {
                "description": "Requests left in the current minute.",
                "schema": {
                    "type": "integer",
                    "examples": [
                        59
                    ]
                }
            },
            "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                    "type": "integer",
                    "examples": [
                        42
                    ]
                }
            }
        },
        "responses": {
            "Unauthenticated": {
                "description": "The key is missing, invalid, revoked or its account is suspended.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "unauthenticated": {
                                "value": {
                                    "message": "Unauthenticated."
                                }
                            }
                        }
                    }
                }
            },
            "NotFound": {
                "description": "No such record in this account.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "notFound": {
                                "value": {
                                    "message": "Not Found"
                                }
                            }
                        }
                    }
                }
            },
            "ValidationFailed": {
                "description": "The request is invalid. `errors` lists the messages per field.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ValidationError"
                        },
                        "examples": {
                            "invalid": {
                                "value": {
                                    "message": "The selected product type is invalid. (and 1 more error)",
                                    "errors": {
                                        "product_type": [
                                            "The selected product type is invalid."
                                        ],
                                        "services.0": [
                                            "One or more selected services are invalid."
                                        ]
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "TooManyRequests": {
                "description": "More than 60 requests in a minute with this key.",
                "headers": {
                    "Retry-After": {
                        "$ref": "#/components/headers/Retry-After"
                    },
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/X-RateLimit-Limit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/X-RateLimit-Remaining"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "throttled": {
                                "value": {
                                    "message": "Too Many Attempts."
                                }
                            }
                        }
                    }
                }
            }
        },
        "schemas": {
            "Me": {
                "type": "object",
                "required": [
                    "id",
                    "name",
                    "email",
                    "policies_count",
                    "companies_count"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "policies_count": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "companies_count": {
                        "type": "integer",
                        "minimum": 0
                    }
                }
            },
            "Options": {
                "type": "object",
                "required": [
                    "product_types",
                    "services",
                    "clauses",
                    "countries"
                ],
                "properties": {
                    "product_types": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "key",
                                "label"
                            ],
                            "properties": {
                                "key": {
                                    "type": "string",
                                    "enum": [
                                        "website",
                                        "mobile_app",
                                        "saas",
                                        "game",
                                        "desktop_app",
                                        "browser_extension"
                                    ]
                                },
                                "label": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "services": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "key",
                                "label",
                                "ads"
                            ],
                            "properties": {
                                "key": {
                                    "type": "string",
                                    "enum": [
                                        "admob",
                                        "facebook_audience_network",
                                        "facebook_pixel",
                                        "firebase_analytics",
                                        "firebase_crashlytics",
                                        "google_analytics",
                                        "google_sign_in",
                                        "sign_in_with_apple",
                                        "facebook_login",
                                        "firebase_cloud_messaging",
                                        "onesignal",
                                        "revenuecat",
                                        "stripe",
                                        "sentry",
                                        "mixpanel",
                                        "amplitude",
                                        "appsflyer",
                                        "unity_ads",
                                        "applovin",
                                        "google_maps",
                                        "openai",
                                        "qonversion",
                                        "adapty",
                                        "superwall",
                                        "adjust",
                                        "branch",
                                        "ironsource",
                                        "paddle",
                                        "auth0",
                                        "clerk",
                                        "posthog",
                                        "segment",
                                        "hotjar",
                                        "intercom",
                                        "hubspot",
                                        "zendesk",
                                        "anthropic"
                                    ]
                                },
                                "label": {
                                    "type": "string"
                                },
                                "group": {
                                    "type": "string",
                                    "description": "Group shown in the guided questions, such as \"Ads\" or \"Analytics and crashes\"."
                                },
                                "description": {
                                    "type": "string",
                                    "description": "Start of the disclosure this service adds to the policy."
                                },
                                "products": {
                                    "type": "array",
                                    "items": {
                                        "type": "string",
                                        "enum": [
                                            "website",
                                            "mobile_app",
                                            "saas",
                                            "game",
                                            "desktop_app",
                                            "browser_extension"
                                        ]
                                    },
                                    "description": "Product types the service is offered for. Missing: every type."
                                },
                                "ads": {
                                    "type": "boolean",
                                    "description": "An ad network that expects app-ads.txt lines."
                                }
                            }
                        }
                    },
                    "clauses": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "key",
                                "label"
                            ],
                            "properties": {
                                "key": {
                                    "type": "string",
                                    "enum": [
                                        "accounts",
                                        "metadata",
                                        "location",
                                        "contacts",
                                        "camera_media",
                                        "microphone",
                                        "biometrics",
                                        "health",
                                        "purchases",
                                        "financial",
                                        "identity_verification",
                                        "credit_partners",
                                        "notifications",
                                        "marketing",
                                        "ugc",
                                        "ai",
                                        "advertising",
                                        "analytics",
                                        "no_sale",
                                        "retention",
                                        "account_deletion",
                                        "international_transfers",
                                        "third_party_links",
                                        "children",
                                        "gdpr",
                                        "ccpa",
                                        "lgpd",
                                        "us_states",
                                        "canada",
                                        "mexico"
                                    ]
                                },
                                "label": {
                                    "type": "string"
                                },
                                "category": {
                                    "type": "string"
                                },
                                "description": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "countries": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "code",
                                "name"
                            ],
                            "properties": {
                                "code": {
                                    "type": "string",
                                    "description": "ISO 3166-1 alpha-2 code.",
                                    "examples": [
                                        "PT"
                                    ]
                                },
                                "name": {
                                    "type": "string",
                                    "description": "English name, the value to send as `country`.",
                                    "examples": [
                                        "Portugal"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Contact": {
                "type": "object",
                "description": "Publisher details for a company used only by this policy.",
                "properties": {
                    "company_name": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Legal or trading name shown as the publisher. Defaults to the policy name.",
                        "examples": [
                            "Acme Labs Ltd."
                        ]
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 255,
                        "description": "Where users reach you about privacy. When left out on create, `{slug}@freeprivacypolicy.app` is used.",
                        "examples": [
                            "privacy@acme.dev"
                        ]
                    },
                    "address": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255,
                        "description": "Postal address, only when you want it published."
                    },
                    "about": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Short description shown on the company page."
                    },
                    "ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Full ads.txt content for websites, one seller line per row."
                    },
                    "app_ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Full app-ads.txt content for mobile apps, one seller line per row."
                    },
                    "show_resources_publicly": {
                        "type": "boolean",
                        "description": "List the ads.txt and app-ads.txt links on the company page.",
                        "default": false
                    }
                }
            },
            "PolicyInput": {
                "type": "object",
                "required": [
                    "name",
                    "product_type",
                    "country"
                ],
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Name of the app, game, website or company, as users know it.",
                        "examples": [
                            "Pocket Notes"
                        ]
                    },
                    "product_type": {
                        "type": "string",
                        "enum": [
                            "website",
                            "mobile_app",
                            "saas",
                            "game",
                            "desktop_app",
                            "browser_extension"
                        ],
                        "description": "What the product is. See `GET /options` for labels."
                    },
                    "country": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Country you operate from, as an English name (see `countries` in `GET /options`).",
                        "examples": [
                            "Portugal"
                        ]
                    },
                    "services": {
                        "type": [
                            "array",
                            "null"
                        ],
                        "items": {
                            "type": "string",
                            "enum": [
                                "admob",
                                "facebook_audience_network",
                                "facebook_pixel",
                                "firebase_analytics",
                                "firebase_crashlytics",
                                "google_analytics",
                                "google_sign_in",
                                "sign_in_with_apple",
                                "facebook_login",
                                "firebase_cloud_messaging",
                                "onesignal",
                                "revenuecat",
                                "stripe",
                                "sentry",
                                "mixpanel",
                                "amplitude",
                                "appsflyer",
                                "unity_ads",
                                "applovin",
                                "google_maps",
                                "openai",
                                "qonversion",
                                "adapty",
                                "superwall",
                                "adjust",
                                "branch",
                                "ironsource",
                                "paddle",
                                "auth0",
                                "clerk",
                                "posthog",
                                "segment",
                                "hotjar",
                                "intercom",
                                "hubspot",
                                "zendesk",
                                "anthropic"
                            ]
                        },
                        "uniqueItems": true,
                        "description": "Third-party services the product uses. Each one adds its own disclosure. Replaces the whole list on update."
                    },
                    "clauses": {
                        "type": [
                            "array",
                            "null"
                        ],
                        "items": {
                            "type": "string",
                            "enum": [
                                "accounts",
                                "metadata",
                                "location",
                                "contacts",
                                "camera_media",
                                "microphone",
                                "biometrics",
                                "health",
                                "purchases",
                                "financial",
                                "identity_verification",
                                "credit_partners",
                                "notifications",
                                "marketing",
                                "ugc",
                                "ai",
                                "advertising",
                                "analytics",
                                "no_sale",
                                "retention",
                                "account_deletion",
                                "international_transfers",
                                "third_party_links",
                                "children",
                                "gdpr",
                                "ccpa",
                                "lgpd",
                                "us_states",
                                "canada",
                                "mexico"
                            ]
                        },
                        "uniqueItems": true,
                        "description": "Optional sections, such as `accounts`, `location` or `gdpr`. Replaces the whole list on update."
                    },
                    "slug": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 63,
                        "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
                        "description": "Subdomain of the public pages (`{slug}.freeprivacypolicy.app`). Lowercase letters, numbers and hyphens; defaults to the name. When taken, a numeric suffix is added (`pocket-notes-2`); reserved words (`www`, `api`, `docs`, ...) are rejected with 422.",
                        "examples": [
                            "pocket-notes"
                        ]
                    },
                    "markdown": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Your own policy text in Markdown. When sent, it is published as given instead of the generated text."
                    },
                    "noindex": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "description": "true asks search engines not to index the public pages (they stay online).",
                        "default": false
                    },
                    "company_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Id of one of your companies (`GET /companies`). Its contact details, logo and ads.txt are used. Cannot be combined with `contact`.",
                        "examples": [
                            42
                        ]
                    },
                    "contact": {
                        "$ref": "#/components/schemas/Contact"
                    }
                }
            },
            "PolicyUpdate": {
                "type": "object",
                "description": "Every field is optional; only the ones sent change.",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Name of the app, game, website or company, as users know it.",
                        "examples": [
                            "Pocket Notes"
                        ]
                    },
                    "product_type": {
                        "type": "string",
                        "enum": [
                            "website",
                            "mobile_app",
                            "saas",
                            "game",
                            "desktop_app",
                            "browser_extension"
                        ],
                        "description": "What the product is. See `GET /options` for labels."
                    },
                    "country": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Country you operate from, as an English name (see `countries` in `GET /options`).",
                        "examples": [
                            "Portugal"
                        ]
                    },
                    "services": {
                        "type": [
                            "array",
                            "null"
                        ],
                        "items": {
                            "type": "string",
                            "enum": [
                                "admob",
                                "facebook_audience_network",
                                "facebook_pixel",
                                "firebase_analytics",
                                "firebase_crashlytics",
                                "google_analytics",
                                "google_sign_in",
                                "sign_in_with_apple",
                                "facebook_login",
                                "firebase_cloud_messaging",
                                "onesignal",
                                "revenuecat",
                                "stripe",
                                "sentry",
                                "mixpanel",
                                "amplitude",
                                "appsflyer",
                                "unity_ads",
                                "applovin",
                                "google_maps",
                                "openai",
                                "qonversion",
                                "adapty",
                                "superwall",
                                "adjust",
                                "branch",
                                "ironsource",
                                "paddle",
                                "auth0",
                                "clerk",
                                "posthog",
                                "segment",
                                "hotjar",
                                "intercom",
                                "hubspot",
                                "zendesk",
                                "anthropic"
                            ]
                        },
                        "uniqueItems": true,
                        "description": "Third-party services the product uses. Each one adds its own disclosure. Replaces the whole list on update."
                    },
                    "clauses": {
                        "type": [
                            "array",
                            "null"
                        ],
                        "items": {
                            "type": "string",
                            "enum": [
                                "accounts",
                                "metadata",
                                "location",
                                "contacts",
                                "camera_media",
                                "microphone",
                                "biometrics",
                                "health",
                                "purchases",
                                "financial",
                                "identity_verification",
                                "credit_partners",
                                "notifications",
                                "marketing",
                                "ugc",
                                "ai",
                                "advertising",
                                "analytics",
                                "no_sale",
                                "retention",
                                "account_deletion",
                                "international_transfers",
                                "third_party_links",
                                "children",
                                "gdpr",
                                "ccpa",
                                "lgpd",
                                "us_states",
                                "canada",
                                "mexico"
                            ]
                        },
                        "uniqueItems": true,
                        "description": "Optional sections, such as `accounts`, `location` or `gdpr`. Replaces the whole list on update."
                    },
                    "slug": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 63,
                        "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
                        "description": "Subdomain of the public pages (`{slug}.freeprivacypolicy.app`). Lowercase letters, numbers and hyphens; defaults to the name. When taken, a numeric suffix is added (`pocket-notes-2`); reserved words (`www`, `api`, `docs`, ...) are rejected with 422.",
                        "examples": [
                            "pocket-notes"
                        ]
                    },
                    "markdown": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Your own policy text in Markdown. When sent, it is published as given instead of the generated text."
                    },
                    "company_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Id of one of your companies, or null to detach the current one. Cannot be combined with `contact`.",
                        "examples": [
                            42
                        ]
                    },
                    "contact": {
                        "$ref": "#/components/schemas/Contact",
                        "description": "Changes the policy company. When the company is shared with other policies, a copy is made for this policy so the others keep theirs."
                    },
                    "noindex": {
                        "type": "boolean",
                        "description": "true asks search engines not to index the public pages (they stay online)."
                    },
                    "published": {
                        "type": "boolean",
                        "description": "false takes every public page offline (404); true publishes them again."
                    }
                }
            },
            "Policy": {
                "type": "object",
                "required": [
                    "id",
                    "slug",
                    "name",
                    "product_type",
                    "country",
                    "services",
                    "clauses",
                    "markdown",
                    "html",
                    "published",
                    "published_at",
                    "noindex",
                    "company_id",
                    "contact",
                    "public_urls",
                    "created_at",
                    "updated_at"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "slug": {
                        "type": "string",
                        "description": "Subdomain of the public pages."
                    },
                    "name": {
                        "type": "string"
                    },
                    "product_type": {
                        "type": "string",
                        "enum": [
                            "website",
                            "mobile_app",
                            "saas",
                            "game",
                            "desktop_app",
                            "browser_extension"
                        ]
                    },
                    "country": {
                        "type": "string"
                    },
                    "services": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "admob",
                                "facebook_audience_network",
                                "facebook_pixel",
                                "firebase_analytics",
                                "firebase_crashlytics",
                                "google_analytics",
                                "google_sign_in",
                                "sign_in_with_apple",
                                "facebook_login",
                                "firebase_cloud_messaging",
                                "onesignal",
                                "revenuecat",
                                "stripe",
                                "sentry",
                                "mixpanel",
                                "amplitude",
                                "appsflyer",
                                "unity_ads",
                                "applovin",
                                "google_maps",
                                "openai",
                                "qonversion",
                                "adapty",
                                "superwall",
                                "adjust",
                                "branch",
                                "ironsource",
                                "paddle",
                                "auth0",
                                "clerk",
                                "posthog",
                                "segment",
                                "hotjar",
                                "intercom",
                                "hubspot",
                                "zendesk",
                                "anthropic"
                            ]
                        }
                    },
                    "clauses": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "accounts",
                                "metadata",
                                "location",
                                "contacts",
                                "camera_media",
                                "microphone",
                                "biometrics",
                                "health",
                                "purchases",
                                "financial",
                                "identity_verification",
                                "credit_partners",
                                "notifications",
                                "marketing",
                                "ugc",
                                "ai",
                                "advertising",
                                "analytics",
                                "no_sale",
                                "retention",
                                "account_deletion",
                                "international_transfers",
                                "third_party_links",
                                "children",
                                "gdpr",
                                "ccpa",
                                "lgpd",
                                "us_states",
                                "canada",
                                "mexico"
                            ]
                        }
                    },
                    "markdown": {
                        "type": "string",
                        "description": "Policy text in Markdown."
                    },
                    "html": {
                        "type": "string",
                        "description": "The same text rendered as HTML."
                    },
                    "published": {
                        "type": "boolean",
                        "description": "false: every public page answers 404."
                    },
                    "published_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "noindex": {
                        "type": "boolean",
                        "description": "Search engines are asked not to index the pages."
                    },
                    "company_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "The company shown as publisher, if any."
                    },
                    "contact": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "The company shown as publisher, or null.",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "company_name": {
                                "type": "string",
                                "maxLength": 255,
                                "description": "Legal or trading name shown as the publisher. Defaults to the policy name.",
                                "examples": [
                                    "Acme Labs Ltd."
                                ]
                            },
                            "email": {
                                "type": "string",
                                "format": "email",
                                "maxLength": 255,
                                "description": "Where users reach you about privacy. When left out on create, `{slug}@freeprivacypolicy.app` is used.",
                                "examples": [
                                    "privacy@acme.dev"
                                ]
                            },
                            "address": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 255,
                                "description": "Postal address, only when you want it published."
                            },
                            "about": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Short description shown on the company page."
                            },
                            "ads_txt": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Full ads.txt content for websites, one seller line per row."
                            },
                            "app_ads_txt": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Full app-ads.txt content for mobile apps, one seller line per row."
                            },
                            "show_resources_publicly": {
                                "type": "boolean",
                                "description": "List the ads.txt and app-ads.txt links on the company page.",
                                "default": false
                            }
                        }
                    },
                    "public_urls": {
                        "type": "object",
                        "description": "Hosted pages. `ads_txt` and `app_ads_txt` appear only when there are lines to serve.",
                        "required": [
                            "landing",
                            "privacy_policy",
                            "child_safety",
                            "eula",
                            "terms"
                        ],
                        "properties": {
                            "landing": {
                                "type": "string",
                                "format": "uri",
                                "description": "Company page."
                            },
                            "privacy_policy": {
                                "type": "string",
                                "format": "uri"
                            },
                            "child_safety": {
                                "type": "string",
                                "format": "uri"
                            },
                            "eula": {
                                "type": "string",
                                "format": "uri"
                            },
                            "terms": {
                                "type": "string",
                                "format": "uri"
                            },
                            "ads_txt": {
                                "type": "string",
                                "format": "uri"
                            },
                            "app_ads_txt": {
                                "type": "string",
                                "format": "uri"
                            }
                        }
                    },
                    "created_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "updated_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                },
                "examples": [
                    {
                        "id": 1287,
                        "slug": "pocket-notes",
                        "name": "Pocket Notes",
                        "product_type": "mobile_app",
                        "country": "Portugal",
                        "services": [
                            "admob",
                            "firebase_analytics",
                            "revenuecat"
                        ],
                        "clauses": [
                            "accounts",
                            "metadata"
                        ],
                        "markdown": "# Privacy Policy\n\nThis Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...",
                        "html": "<h1>Privacy Policy</h1>\n<p>This Privacy Policy explains how Acme Labs Ltd. collects, uses and protects information when you use Pocket Notes...</p>",
                        "published": true,
                        "published_at": "2026-09-20T08:30:00+00:00",
                        "noindex": false,
                        "company_id": 42,
                        "contact": {
                            "id": 42,
                            "company_name": "Acme Labs Ltd.",
                            "address": "1 Market Street, Lisbon, Portugal",
                            "email": "privacy@acme.dev",
                            "about": "Acme Labs builds productivity apps for small teams.",
                            "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                            "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                            "show_resources_publicly": true
                        },
                        "public_urls": {
                            "landing": "https://pocket-notes.freeprivacypolicy.app",
                            "privacy_policy": "https://pocket-notes.freeprivacypolicy.app/privacy-policy",
                            "child_safety": "https://pocket-notes.freeprivacypolicy.app/child-safety-standards",
                            "eula": "https://pocket-notes.freeprivacypolicy.app/end-user-license-agreement",
                            "terms": "https://pocket-notes.freeprivacypolicy.app/terms-of-service",
                            "ads_txt": "https://pocket-notes.freeprivacypolicy.app/ads.txt",
                            "app_ads_txt": "https://pocket-notes.freeprivacypolicy.app/app-ads.txt"
                        },
                        "created_at": "2026-09-20T08:30:00+00:00",
                        "updated_at": "2026-09-20T08:30:00+00:00"
                    }
                ]
            },
            "CompanyInput": {
                "type": "object",
                "required": [
                    "company_name",
                    "email"
                ],
                "properties": {
                    "company_name": {
                        "type": "string",
                        "maxLength": 255,
                        "examples": [
                            "Acme Labs Ltd."
                        ]
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 255,
                        "examples": [
                            "privacy@acme.dev"
                        ]
                    },
                    "address": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "about": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 5000
                    },
                    "ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 100000,
                        "description": "Full ads.txt content, one seller line per row."
                    },
                    "app_ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 100000,
                        "description": "Full app-ads.txt content, one seller line per row."
                    },
                    "show_resources_publicly": {
                        "type": "boolean",
                        "default": false,
                        "description": "List the ads.txt and app-ads.txt links on the company page."
                    }
                }
            },
            "CompanyUpdate": {
                "type": "object",
                "description": "Every field is optional; only the ones sent change.",
                "properties": {
                    "company_name": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 255
                    },
                    "address": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "about": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 5000
                    },
                    "ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 100000
                    },
                    "app_ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 100000
                    },
                    "show_resources_publicly": {
                        "type": "boolean"
                    }
                }
            },
            "Company": {
                "type": "object",
                "required": [
                    "id",
                    "company_name",
                    "email",
                    "address",
                    "about",
                    "ads_txt",
                    "app_ads_txt",
                    "show_resources_publicly",
                    "logo_url",
                    "policies_count",
                    "created_at",
                    "updated_at"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "company_name": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "address": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "about": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "app_ads_txt": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "show_resources_publicly": {
                        "type": "boolean"
                    },
                    "logo_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "description": "Uploaded in the dashboard; not settable over the API."
                    },
                    "policies_count": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "created_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "updated_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                },
                "examples": [
                    {
                        "id": 42,
                        "company_name": "Acme Labs Ltd.",
                        "email": "privacy@acme.dev",
                        "address": "1 Market Street, Lisbon, Portugal",
                        "about": "Acme Labs builds productivity apps for small teams.",
                        "ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                        "app_ads_txt": "google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0",
                        "show_resources_publicly": true,
                        "logo_url": null,
                        "policies_count": 2,
                        "created_at": "2026-09-01T12:00:00+00:00",
                        "updated_at": "2026-09-20T08:30:00+00:00"
                    }
                ]
            },
            "PaginationLinks": {
                "type": "object",
                "required": [
                    "first",
                    "last",
                    "prev",
                    "next"
                ],
                "properties": {
                    "first": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "last": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "prev": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "next": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    }
                }
            },
            "PaginationMeta": {
                "type": "object",
                "required": [
                    "current_page",
                    "last_page",
                    "per_page",
                    "total",
                    "path"
                ],
                "properties": {
                    "current_page": {
                        "type": "integer"
                    },
                    "from": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "last_page": {
                        "type": "integer"
                    },
                    "links": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "label": {
                                    "type": "string"
                                },
                                "page": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "active": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "path": {
                        "type": "string",
                        "format": "uri"
                    },
                    "per_page": {
                        "type": "integer"
                    },
                    "to": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "total": {
                        "type": "integer"
                    }
                }
            },
            "Error": {
                "type": "object",
                "required": [
                    "message"
                ],
                "properties": {
                    "message": {
                        "type": "string"
                    }
                }
            },
            "ValidationError": {
                "type": "object",
                "required": [
                    "message",
                    "errors"
                ],
                "properties": {
                    "message": {
                        "type": "string"
                    },
                    "errors": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        "description": "Messages per field, such as `services.0`."
                    }
                }
            }
        }
    }
}