[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AFZX6GR5EM564XB50KAFCC":3,"skill-same:01M6AFZX6GR5EM564XB50KAFCC":106},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":67,"ownerDescription":68,"updatedAt":69,"install":70,"resources":83},"01M6AFZX6GR5EM564XB50KAFCC","privacy-api-design",null,"Design privacy API patterns including data subject API for DSAR endpoints, consent API for preference management, deletion API with cascading delete orchestration, and audit API for compliance reporting. Provides OpenAPI specifications, error handling, rate limiting, and authentication patterns.","mukul975\u002FPrivacy-Data-Protection-Skills","mukul975","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F42860185?v=4","01M6ADEQR8T5M4EEG6C67BQCWF","Mahipal","01M6ADNKWX1HF4Q5DKEXT5M774",336,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fprivacy-api-design\u002FSKILL.md",[18,23,26,31],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"api","api design","privacy api design","design","privacy","engineering","dsar","openapi","api patterns","data","compliance","reporting","audit","authentication","error handling","delete","orchestration","2026-11-10 10:12:30",false,"---\nname: privacy-api-design\ndescription: >-\n  Design privacy API patterns including data subject API for DSAR endpoints,\n  consent API for preference management, deletion API with cascading delete\n  orchestration, and audit API for compliance reporting. Provides OpenAPI\n  specifications, error handling, rate limiting, and authentication patterns.\nlicense: Apache-2.0\nmetadata:\n  author: mukul975\n  version: \"1.0\"\n  domain: privacy\n  subdomain: privacy-engineering\n  tags: \"privacy-api, dsar-api, consent-api, deletion-api, openapi-specification\"\n---\n\n# Privacy API Design Patterns\n\n## Overview\n\nPrivacy APIs provide programmatic interfaces for data subject rights exercise, consent management, data deletion, and audit logging. Well-designed privacy APIs enable organizations to automate compliance workflows, integrate with consent management platforms, and provide data subjects with self-service privacy controls. This skill covers API design patterns, OpenAPI specifications, authentication, and error handling for privacy-critical endpoints.\n\n## API Architecture Overview\n\n```\nExternal Consumers                    Privacy API Gateway                    Backend Services\n+------------------+                 +--------------------+                 +------------------+\n| Data Subject App |----HTTPS\u002FTLS--->| Authentication     |                 | DSAR Service     |\n+------------------+                 | Rate Limiting      |----internal---->| Consent Service  |\n                                     | Request Validation |                 | Deletion Service |\n+------------------+                 | Audit Logging      |                 | Audit Service    |\n| Partner Portal   |----HTTPS\u002FTLS--->| Versioning         |                 | Identity Service |\n+------------------+                 +--------------------+                 +------------------+\n                                            |\n+------------------+                        v\n| Internal Systems |----mTLS-------->+--------------------+\n+------------------+                 | Privacy Event Bus  |\n                                     | (async processing) |\n                                     +--------------------+\n```\n\n## 1. Data Subject API (DSAR Endpoints)\n\n### OpenAPI Specification\n\n```yaml\nopenapi: 3.1.0\ninfo:\n  title: Cipher Engineering Labs - Data Subject Rights API\n  version: 1.0.0\n  description: >\n    API for data subjects to exercise their privacy rights under GDPR,\n    CCPA\u002FCPRA, and other applicable privacy regulations.\n  contact:\n    name: Privacy Engineering Team\n    email: privacy-engineering@cipherengineeringlabs.com\n\nservers:\n  - url: https:\u002F\u002Fapi.cipherengineeringlabs.com\u002Fprivacy\u002Fv1\n    description: Production\n\nsecurity:\n  - BearerAuth: []\n  - OAuth2: [dsar:read, dsar:write]\n\npaths:\n  \u002Fdsar\u002Frequests:\n    post:\n      operationId: createDSARRequest\n      summary: Submit a new data subject access request\n      tags: [DSAR]\n      requestBody:\n        required: true\n        content:\n          application\u002Fjson:\n            schema:\n              $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARCreateRequest'\n      responses:\n        '202':\n          description: Request accepted for processing\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARResponse'\n          headers:\n            X-Request-ID:\n              schema:\n                type: string\n                format: uuid\n            Location:\n              schema:\n                type: string\n                format: uri\n        '400':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FBadRequest'\n        '401':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FUnauthorized'\n        '429':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FRateLimited'\n\n    get:\n      operationId: listDSARRequests\n      summary: List data subject's own requests\n      tags: [DSAR]\n      parameters:\n        - name: status\n          in: query\n          schema:\n            type: string\n            enum: [pending, in_progress, completed, rejected]\n        - name: type\n          in: query\n          schema:\n            type: string\n            enum: [access, deletion, portability, rectification, restriction, objection]\n        - name: page\n          in: query\n          schema:\n            type: integer\n            minimum: 1\n            default: 1\n        - name: per_page\n          in: query\n          schema:\n            type: integer\n            minimum: 1\n            maximum: 100\n            default: 20\n      responses:\n        '200':\n          description: List of DSAR requests\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARListResponse'\n\n  \u002Fdsar\u002Frequests\u002F{requestId}:\n    get:\n      operationId: getDSARRequest\n      summary: Get status and details of a specific DSAR\n      tags: [DSAR]\n      parameters:\n        - name: requestId\n          in: path\n          required: true\n          schema:\n            type: string\n            format: uuid\n      responses:\n        '200':\n          description: DSAR details\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARDetailResponse'\n        '404':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FNotFound'\n\n  \u002Fdsar\u002Frequests\u002F{requestId}\u002Fdownload:\n    get:\n      operationId: downloadDSARData\n      summary: Download the data package for a completed access request\n      tags: [DSAR]\n      parameters:\n        - name: requestId\n          in: path\n          required: true\n          schema:\n            type: string\n            format: uuid\n      responses:\n        '200':\n          description: Data package download\n          content:\n            application\u002Fzip:\n              schema:\n                type: string\n                format: binary\n          headers:\n            Content-Disposition:\n              schema:\n                type: string\n        '404':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FNotFound'\n        '410':\n          description: Download link has expired\n\ncomponents:\n  schemas:\n    DSARCreateRequest:\n      type: object\n      required:\n        - requestType\n        - email\n        - identityVerification\n      properties:\n        requestType:\n          type: string\n          enum: [access, deletion, portability, rectification, restriction, objection]\n          description: Type of data subject right being exercised\n        email:\n          type: string\n          format: email\n          description: Email address associated with the account\n        identityVerification:\n          type: object\n          properties:\n            method:\n              type: string\n              enum: [account_login, email_verification, document_upload]\n            verificationToken:\n              type: string\n          required: [method]\n        details:\n          type: string\n          maxLength: 2000\n          description: Additional details about the request\n        dataCategories:\n          type: array\n          items:\n            type: string\n            enum: [profile, transactions, communications, analytics, marketing, all]\n          description: Specific data categories (for access\u002Fportability)\n        rectificationData:\n          type: object\n          additionalProperties: true\n          description: Corrected data values (for rectification requests)\n        preferredFormat:\n          type: string\n          enum: [json, csv, pdf]\n          default: json\n          description: Preferred data export format (for access\u002Fportability)\n\n    DSARResponse:\n      type: object\n      properties:\n        requestId:\n          type: string\n          format: uuid\n        status:\n          type: string\n          enum: [pending, identity_verification, in_progress, completed, rejected]\n        requestType:\n          type: string\n        submittedAt:\n          type: string\n          format: date-time\n        estimatedCompletionDate:\n          type: string\n          format: date-time\n        regulatoryDeadline:\n          type: string\n          format: date-time\n          description: Maximum date by which response must be provided\n\n    DSARDetailResponse:\n      allOf:\n        - $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARResponse'\n        - type: object\n          properties:\n            statusHistory:\n              type: array\n              items:\n                type: object\n                properties:\n                  status:\n                    type: string\n                  timestamp:\n                    type: string\n                    format: date-time\n                  note:\n                    type: string\n            downloadAvailable:\n              type: boolean\n            downloadExpiresAt:\n              type: string\n              format: date-time\n\n    DSARListResponse:\n      type: object\n      properties:\n        data:\n          type: array\n          items:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARResponse'\n        pagination:\n          $ref: '#\u002Fcomponents\u002Fschemas\u002FPagination'\n\n    Pagination:\n      type: object\n      properties:\n        page:\n          type: integer\n        perPage:\n          type: integer\n        totalPages:\n          type: integer\n        totalItems:\n          type: integer\n\n  responses:\n    BadRequest:\n      description: Invalid request parameters\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n    Unauthorized:\n      description: Authentication required\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n    NotFound:\n      description: Resource not found\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n    RateLimited:\n      description: Rate limit exceeded\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n      headers:\n        Retry-After:\n          schema:\n            type: integer\n        X-RateLimit-Limit:\n          schema:\n            type: integer\n        X-RateLimit-Remaining:\n          schema:\n            type: integer\n\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n    OAuth2:\n      type: oauth2\n      flows:\n        authorizationCode:\n          authorizationUrl: https:\u002F\u002Fauth.cipherengineeringlabs.com\u002Foauth2\u002Fauthorize\n          tokenUrl: https:\u002F\u002Fauth.cipherengineeringlabs.com\u002Foauth2\u002Ftoken\n          scopes:\n            dsar:read: Read DSAR request status\n            dsar:write: Submit DSAR requests\n            consent:read: Read consent preferences\n            consent:write: Update consent preferences\n            audit:read: Read audit logs\n```\n\n## 2. Consent API\n\n### Consent Preference Management\n\n```yaml\npaths:\n  \u002Fconsent\u002Fpreferences:\n    get:\n      operationId: getConsentPreferences\n      summary: Get current consent preferences for the authenticated user\n      tags: [Consent]\n      responses:\n        '200':\n          description: Current consent preferences\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  subjectId:\n                    type: string\n                  preferences:\n                    type: array\n                    items:\n                      $ref: '#\u002Fcomponents\u002Fschemas\u002FConsentPreference'\n                  lastUpdated:\n                    type: string\n                    format: date-time\n\n    put:\n      operationId: updateConsentPreferences\n      summary: Update consent preferences (bulk update)\n      tags: [Consent]\n      requestBody:\n        required: true\n        content:\n          application\u002Fjson:\n            schema:\n              type: object\n              required: [preferences]\n              properties:\n                preferences:\n                  type: array\n                  items:\n                    type: object\n                    required: [purposeId, granted]\n                    properties:\n                      purposeId:\n                        type: string\n                      granted:\n                        type: boolean\n                      channels:\n                        type: array\n                        items:\n                          type: string\n                          enum: [email, sms, push, phone, postal]\n      responses:\n        '200':\n          description: Preferences updated\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  updated:\n                    type: array\n                    items:\n                      $ref: '#\u002Fcomponents\u002Fschemas\u002FConsentPreference'\n                  consentReceiptId:\n                    type: string\n                    format: uuid\n                    description: ID of the issued consent receipt\n\n  \u002Fconsent\u002Fpurposes:\n    get:\n      operationId: listConsentPurposes\n      summary: List all available consent purposes\n      tags: [Consent]\n      responses:\n        '200':\n          description: List of consent purposes\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  purposes:\n                    type: array\n                    items:\n                      type: object\n                      properties:\n                        purposeId:\n                          type: string\n                        name:\n                          type: string\n                        description:\n                          type: string\n                        category:\n                          type: string\n                          enum: [essential, functional, analytics, marketing]\n                        mandatory:\n                          type: boolean\n                        defaultState:\n                          type: boolean\n                        dataCategories:\n                          type: array\n                          items:\n                            type: string\n\n  \u002Fconsent\u002Freceipts\u002F{receiptId}:\n    get:\n      operationId: getConsentReceipt\n      summary: Retrieve a specific consent receipt\n      tags: [Consent]\n      parameters:\n        - name: receiptId\n          in: path\n          required: true\n          schema:\n            type: string\n            format: uuid\n      responses:\n        '200':\n          description: Consent receipt\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FConsentReceipt'\n```\n\n## 3. Deletion API\n\n### Cascading Delete Orchestration\n\n```python\n\"\"\"\nPrivacy deletion API with cascading delete orchestration.\nHandles deletion requests across multiple backend services\nwith verification and audit logging.\n\"\"\"\n\nfrom dataclasses import dataclass, field\nfrom datetime import datetime, timezone\nfrom enum import Enum\nfrom typing import Optional\nimport uuid\n\n\nclass DeletionStatus(Enum):\n    PENDING = \"pending\"\n    IN_PROGRESS = \"in_progress\"\n    PARTIALLY_COMPLETED = \"partially_completed\"\n    COMPLETED = \"completed\"\n    FAILED = \"failed\"\n    VERIFIED = \"verified\"\n\n\nclass ServiceDeletionStatus(Enum):\n    PENDING = \"pending\"\n    IN_PROGRESS = \"in_progress\"\n    COMPLETED = \"completed\"\n    FAILED = \"failed\"\n    SKIPPED = \"skipped\"  # For legally exempt data\n\n\n@dataclass\nclass DeletionTarget:\n    service_name: str\n    data_categories: list[str]\n    priority: int  # Lower number = delete first\n    legal_hold_check: bool = True\n    retention_exempt: bool = False  # True if data must be retained (e.g., tax records)\n\n\n@dataclass\nclass ServiceDeletionResult:\n    service_name: str\n    status: ServiceDeletionStatus\n    records_deleted: int\n    records_retained: int\n    retention_reason: Optional[str]\n    completed_at: Optional[datetime]\n    error_message: Optional[str]\n\n\n@dataclass\nclass DeletionRequest:\n    request_id: str\n    subject_id: str\n    status: DeletionStatus\n    created_at: datetime\n    scope: list[str]  # Data categories to delete\n    exclude: list[str]  # Data categories exempt from deletion\n    service_results: list[ServiceDeletionResult] = field(default_factory=list)\n    verified_at: Optional[datetime] = None\n    verification_method: Optional[str] = None\n\n\nclass CascadingDeletionOrchestrator:\n    \"\"\"\n    Orchestrate data deletion across multiple backend services\n    in the correct order, handling dependencies, legal holds,\n    and retention requirements.\n    \"\"\"\n\n    def __init__(self, service_registry: list[DeletionTarget], audit_logger):\n        self.targets = sorted(service_registry, key=lambda t: t.priority)\n        self.audit = audit_logger\n\n    def execute_deletion(\n        self,\n        subject_id: str,\n        scope: list[str],\n        exclude: list[str] = None\n    ) -> DeletionRequest:\n        \"\"\"\n        Execute cascading deletion across all registered services.\n\n        Args:\n            subject_id: The data subject whose data should be deleted\n            scope: Data categories to delete (or [\"all\"])\n            exclude: Data categories to exclude from deletion\n\n        Returns:\n            DeletionRequest with results from each service\n        \"\"\"\n        exclude = exclude or []\n\n        request = DeletionRequest(\n            request_id=str(uuid.uuid4()),\n            subject_id=subject_id,\n            status=DeletionStatus.IN_PROGRESS,\n            created_at=datetime.now(timezone.utc),\n            scope=scope,\n            exclude=exclude\n        )\n\n        self.audit.log_deletion_start(request)\n\n        for target in self.targets:\n            # Skip if data category not in scope\n            if \"all\" not in scope:\n                relevant_categories = set(target.data_categories) & set(scope)\n                if not relevant_categories:\n                    continue\n\n            # Skip if explicitly excluded\n            if set(target.data_categories) & set(exclude):\n                result = ServiceDeletionResult(\n                    service_name=target.service_name,\n                    status=ServiceDeletionStatus.SKIPPED,\n                    records_deleted=0,\n                    records_retained=0,\n                    retention_reason=\"Excluded by request\",\n                    completed_at=datetime.now(timezone.utc),\n                    error_message=None\n                )\n                request.service_results.append(result)\n                continue\n\n            # Check retention exemptions\n            if target.retention_exempt:\n                result = ServiceDeletionResult(\n                    service_name=target.service_name,\n                    status=ServiceDeletionStatus.SKIPPED,\n                    records_deleted=0,\n                    records_retained=0,\n                    retention_reason=\"Legal retention requirement\",\n                    completed_at=datetime.now(timezone.utc),\n                    error_message=None\n                )\n                request.service_results.append(result)\n                continue\n\n            # Check legal holds\n            if target.legal_hold_check:\n                hold = self._check_legal_hold(subject_id, target.service_name)\n                if hold:\n                    result = ServiceDeletionResult(\n                        service_name=target.service_name,\n                        status=ServiceDeletionStatus.SKIPPED,\n                        records_deleted=0,\n                        records_retained=0,\n                        retention_reason=f\"Legal hold: {hold}\",\n                        completed_at=datetime.now(timezone.utc),\n                        error_message=None\n                    )\n                    request.service_results.append(result)\n                    continue\n\n            # Execute deletion for this service\n            result = self._delete_from_service(subject_id, target)\n            request.service_results.append(result)\n\n        # Determine overall status\n        statuses = [r.status for r in request.service_results]\n        if all(s in (ServiceDeletionStatus.COMPLETED, ServiceDeletionStatus.SKIPPED) for s in statuses):\n            request.status = DeletionStatus.COMPLETED\n        elif any(s == ServiceDeletionStatus.FAILED for s in statuses):\n            request.status = DeletionStatus.PARTIALLY_COMPLETED\n        else:\n            request.status = DeletionStatus.COMPLETED\n\n        self.audit.log_deletion_complete(request)\n        return request\n\n    def verify_deletion(self, request: DeletionRequest) -> DeletionRequest:\n        \"\"\"\n        Verify that data was actually deleted from all services.\n        Run after deletion to confirm no data remnants exist.\n        \"\"\"\n        for result in request.service_results:\n            if result.status == ServiceDeletionStatus.COMPLETED:\n                # Attempt to query for the subject's data\n                remaining = self._check_data_exists(\n                    request.subject_id, result.service_name\n                )\n                if remaining > 0:\n                    result.status = ServiceDeletionStatus.FAILED\n                    result.error_message = f\"Verification failed: {remaining} records still exist\"\n\n        request.verified_at = datetime.now(timezone.utc)\n        request.verification_method = \"post_deletion_query\"\n\n        all_verified = all(\n            r.status in (ServiceDeletionStatus.COMPLETED, ServiceDeletionStatus.SKIPPED)\n            for r in request.service_results\n        )\n        request.status = DeletionStatus.VERIFIED if all_verified else DeletionStatus.PARTIALLY_COMPLETED\n\n        self.audit.log_deletion_verification(request)\n        return request\n\n    def _check_legal_hold(self, subject_id: str, service: str) -> Optional[str]:\n        \"\"\"Check if any legal hold applies to this subject's data.\"\"\"\n        # Integration point with legal hold management system\n        return None  # Override in production with actual legal hold check\n\n    def _delete_from_service(\n        self, subject_id: str, target: DeletionTarget\n    ) -> ServiceDeletionResult:\n        \"\"\"Execute deletion against a specific backend service.\"\"\"\n        # Integration point with actual backend service deletion API\n        return ServiceDeletionResult(\n            service_name=target.service_name,\n            status=ServiceDeletionStatus.COMPLETED,\n            records_deleted=0,\n            records_retained=0,\n            retention_reason=None,\n            completed_at=datetime.now(timezone.utc),\n            error_message=None\n        )\n\n    def _check_data_exists(self, subject_id: str, service: str) -> int:\n        \"\"\"Check if data still exists for a subject in a service.\"\"\"\n        # Integration point with service data existence check\n        return 0\n```\n\n## 4. Audit API\n\n### Audit Log Query Endpoints\n\n```yaml\npaths:\n  \u002Faudit\u002Fevents:\n    get:\n      operationId: queryAuditEvents\n      summary: Query privacy audit events\n      tags: [Audit]\n      security:\n        - OAuth2: [audit:read]\n      parameters:\n        - name: subjectId\n          in: query\n          schema:\n            type: string\n        - name: eventType\n          in: query\n          schema:\n            type: string\n            enum: [data_access, consent_change, deletion, dsar_submitted, dsar_completed, breach_detected]\n        - name: startDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date-time\n        - name: endDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date-time\n        - name: actorId\n          in: query\n          schema:\n            type: string\n        - name: page\n          in: query\n          schema:\n            type: integer\n            default: 1\n        - name: perPage\n          in: query\n          schema:\n            type: integer\n            default: 50\n            maximum: 200\n      responses:\n        '200':\n          description: Audit events\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  events:\n                    type: array\n                    items:\n                      type: object\n                      properties:\n                        eventId:\n                          type: string\n                          format: uuid\n                        eventType:\n                          type: string\n                        timestamp:\n                          type: string\n                          format: date-time\n                        actorId:\n                          type: string\n                        actorType:\n                          type: string\n                          enum: [user, system, admin, api_client]\n                        subjectId:\n                          type: string\n                        resource:\n                          type: string\n                        action:\n                          type: string\n                        purpose:\n                          type: string\n                        outcome:\n                          type: string\n                          enum: [success, failure, denied]\n                        details:\n                          type: object\n                  pagination:\n                    $ref: '#\u002Fcomponents\u002Fschemas\u002FPagination'\n\n  \u002Faudit\u002Freports\u002Fcompliance:\n    get:\n      operationId: getComplianceReport\n      summary: Generate compliance audit report for a date range\n      tags: [Audit]\n      parameters:\n        - name: startDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date\n        - name: endDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date\n        - name: format\n          in: query\n          schema:\n            type: string\n            enum: [json, pdf, csv]\n            default: json\n      responses:\n        '200':\n          description: Compliance report\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  reportId:\n                    type: string\n                  generatedAt:\n                    type: string\n                    format: date-time\n                  period:\n                    type: object\n                    properties:\n                      start:\n                        type: string\n                      end:\n                        type: string\n                  summary:\n                    type: object\n                    properties:\n                      totalDataAccesses:\n                        type: integer\n                      totalConsentChanges:\n                        type: integer\n                      totalDeletions:\n                        type: integer\n                      totalDSARs:\n                        type: integer\n                      accessDenials:\n                        type: integer\n                      policyViolations:\n                        type: integer\n```\n\n## API Security Patterns\n\n### Authentication and Authorization\n\n| Endpoint Category | Auth Method | Scopes Required | Rate Limit |\n|-------------------|-------------|-----------------|------------|\n| DSAR (data subject) | OAuth2 PKCE \u002F JWT | dsar:read, dsar:write | 10 req\u002Fmin |\n| DSAR (admin) | OAuth2 Client Credentials | dsar:admin | 100 req\u002Fmin |\n| Consent (data subject) | OAuth2 PKCE \u002F JWT | consent:read, consent:write | 30 req\u002Fmin |\n| Deletion (internal) | mTLS + API key | deletion:execute | 5 req\u002Fmin |\n| Audit (compliance) | OAuth2 Client Credentials | audit:read | 50 req\u002Fmin |\n\n### Error Response Format\n\n```json\n{\n  \"error\": {\n    \"code\": \"PRIVACY_001\",\n    \"type\": \"identity_verification_required\",\n    \"message\": \"Identity verification is required before processing this request\",\n    \"details\": {\n      \"verificationMethods\": [\"email_verification\", \"document_upload\"],\n      \"supportUrl\": \"https:\u002F\u002Fsupport.cipherengineeringlabs.com\u002Fprivacy\"\n    },\n    \"requestId\": \"req_a1b2c3d4\",\n    \"timestamp\": \"2026-03-14T10:30:00.000Z\"\n  }\n}\n```\n\n## References\n\n- OpenAPI Specification 3.1.0\n- GDPR Articles 12-22 (Data Subject Rights)\n- CCPA\u002FCPRA Sections 1798.100-1798.135\n- RFC 6749 — OAuth 2.0 Authorization Framework\n- RFC 7519 — JSON Web Token (JWT)\n- OWASP API Security Top 10 (2023)\n- Google Privacy Sandbox API Design Guidelines\n- Apple App Tracking Transparency API Design Patterns\n","# Privacy API Design Patterns\n\n## Overview\n\nPrivacy APIs provide programmatic interfaces for data subject rights exercise, consent management, data deletion, and audit logging. Well-designed privacy APIs enable organizations to automate compliance workflows, integrate with consent management platforms, and provide data subjects with self-service privacy controls. This skill covers API design patterns, OpenAPI specifications, authentication, and error handling for privacy-critical endpoints.\n\n## API Architecture Overview\n\n```\nExternal Consumers                    Privacy API Gateway                    Backend Services\n+------------------+                 +--------------------+                 +------------------+\n| Data Subject App |----HTTPS\u002FTLS--->| Authentication     |                 | DSAR Service     |\n+------------------+                 | Rate Limiting      |----internal---->| Consent Service  |\n                                     | Request Validation |                 | Deletion Service |\n+------------------+                 | Audit Logging      |                 | Audit Service    |\n| Partner Portal   |----HTTPS\u002FTLS--->| Versioning         |                 | Identity Service |\n+------------------+                 +--------------------+                 +------------------+\n                                            |\n+------------------+                        v\n| Internal Systems |----mTLS-------->+--------------------+\n+------------------+                 | Privacy Event Bus  |\n                                     | (async processing) |\n                                     +--------------------+\n```\n\n## 1. Data Subject API (DSAR Endpoints)\n\n### OpenAPI Specification\n\n```yaml\nopenapi: 3.1.0\ninfo:\n  title: Cipher Engineering Labs - Data Subject Rights API\n  version: 1.0.0\n  description: >\n    API for data subjects to exercise their privacy rights under GDPR,\n    CCPA\u002FCPRA, and other applicable privacy regulations.\n  contact:\n    name: Privacy Engineering Team\n    email: privacy-engineering@cipherengineeringlabs.com\n\nservers:\n  - url: https:\u002F\u002Fapi.cipherengineeringlabs.com\u002Fprivacy\u002Fv1\n    description: Production\n\nsecurity:\n  - BearerAuth: []\n  - OAuth2: [dsar:read, dsar:write]\n\npaths:\n  \u002Fdsar\u002Frequests:\n    post:\n      operationId: createDSARRequest\n      summary: Submit a new data subject access request\n      tags: [DSAR]\n      requestBody:\n        required: true\n        content:\n          application\u002Fjson:\n            schema:\n              $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARCreateRequest'\n      responses:\n        '202':\n          description: Request accepted for processing\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARResponse'\n          headers:\n            X-Request-ID:\n              schema:\n                type: string\n                format: uuid\n            Location:\n              schema:\n                type: string\n                format: uri\n        '400':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FBadRequest'\n        '401':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FUnauthorized'\n        '429':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FRateLimited'\n\n    get:\n      operationId: listDSARRequests\n      summary: List data subject's own requests\n      tags: [DSAR]\n      parameters:\n        - name: status\n          in: query\n          schema:\n            type: string\n            enum: [pending, in_progress, completed, rejected]\n        - name: type\n          in: query\n          schema:\n            type: string\n            enum: [access, deletion, portability, rectification, restriction, objection]\n        - name: page\n          in: query\n          schema:\n            type: integer\n            minimum: 1\n            default: 1\n        - name: per_page\n          in: query\n          schema:\n            type: integer\n            minimum: 1\n            maximum: 100\n            default: 20\n      responses:\n        '200':\n          description: List of DSAR requests\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARListResponse'\n\n  \u002Fdsar\u002Frequests\u002F{requestId}:\n    get:\n      operationId: getDSARRequest\n      summary: Get status and details of a specific DSAR\n      tags: [DSAR]\n      parameters:\n        - name: requestId\n          in: path\n          required: true\n          schema:\n            type: string\n            format: uuid\n      responses:\n        '200':\n          description: DSAR details\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARDetailResponse'\n        '404':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FNotFound'\n\n  \u002Fdsar\u002Frequests\u002F{requestId}\u002Fdownload:\n    get:\n      operationId: downloadDSARData\n      summary: Download the data package for a completed access request\n      tags: [DSAR]\n      parameters:\n        - name: requestId\n          in: path\n          required: true\n          schema:\n            type: string\n            format: uuid\n      responses:\n        '200':\n          description: Data package download\n          content:\n            application\u002Fzip:\n              schema:\n                type: string\n                format: binary\n          headers:\n            Content-Disposition:\n              schema:\n                type: string\n        '404':\n          $ref: '#\u002Fcomponents\u002Fresponses\u002FNotFound'\n        '410':\n          description: Download link has expired\n\ncomponents:\n  schemas:\n    DSARCreateRequest:\n      type: object\n      required:\n        - requestType\n        - email\n        - identityVerification\n      properties:\n        requestType:\n          type: string\n          enum: [access, deletion, portability, rectification, restriction, objection]\n          description: Type of data subject right being exercised\n        email:\n          type: string\n          format: email\n          description: Email address associated with the account\n        identityVerification:\n          type: object\n          properties:\n            method:\n              type: string\n              enum: [account_login, email_verification, document_upload]\n            verificationToken:\n              type: string\n          required: [method]\n        details:\n          type: string\n          maxLength: 2000\n          description: Additional details about the request\n        dataCategories:\n          type: array\n          items:\n            type: string\n            enum: [profile, transactions, communications, analytics, marketing, all]\n          description: Specific data categories (for access\u002Fportability)\n        rectificationData:\n          type: object\n          additionalProperties: true\n          description: Corrected data values (for rectification requests)\n        preferredFormat:\n          type: string\n          enum: [json, csv, pdf]\n          default: json\n          description: Preferred data export format (for access\u002Fportability)\n\n    DSARResponse:\n      type: object\n      properties:\n        requestId:\n          type: string\n          format: uuid\n        status:\n          type: string\n          enum: [pending, identity_verification, in_progress, completed, rejected]\n        requestType:\n          type: string\n        submittedAt:\n          type: string\n          format: date-time\n        estimatedCompletionDate:\n          type: string\n          format: date-time\n        regulatoryDeadline:\n          type: string\n          format: date-time\n          description: Maximum date by which response must be provided\n\n    DSARDetailResponse:\n      allOf:\n        - $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARResponse'\n        - type: object\n          properties:\n            statusHistory:\n              type: array\n              items:\n                type: object\n                properties:\n                  status:\n                    type: string\n                  timestamp:\n                    type: string\n                    format: date-time\n                  note:\n                    type: string\n            downloadAvailable:\n              type: boolean\n            downloadExpiresAt:\n              type: string\n              format: date-time\n\n    DSARListResponse:\n      type: object\n      properties:\n        data:\n          type: array\n          items:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FDSARResponse'\n        pagination:\n          $ref: '#\u002Fcomponents\u002Fschemas\u002FPagination'\n\n    Pagination:\n      type: object\n      properties:\n        page:\n          type: integer\n        perPage:\n          type: integer\n        totalPages:\n          type: integer\n        totalItems:\n          type: integer\n\n  responses:\n    BadRequest:\n      description: Invalid request parameters\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n    Unauthorized:\n      description: Authentication required\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n    NotFound:\n      description: Resource not found\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n    RateLimited:\n      description: Rate limit exceeded\n      content:\n        application\u002Fjson:\n          schema:\n            $ref: '#\u002Fcomponents\u002Fschemas\u002FErrorResponse'\n      headers:\n        Retry-After:\n          schema:\n            type: integer\n        X-RateLimit-Limit:\n          schema:\n            type: integer\n        X-RateLimit-Remaining:\n          schema:\n            type: integer\n\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n    OAuth2:\n      type: oauth2\n      flows:\n        authorizationCode:\n          authorizationUrl: https:\u002F\u002Fauth.cipherengineeringlabs.com\u002Foauth2\u002Fauthorize\n          tokenUrl: https:\u002F\u002Fauth.cipherengineeringlabs.com\u002Foauth2\u002Ftoken\n          scopes:\n            dsar:read: Read DSAR request status\n            dsar:write: Submit DSAR requests\n            consent:read: Read consent preferences\n            consent:write: Update consent preferences\n            audit:read: Read audit logs\n```\n\n## 2. Consent API\n\n### Consent Preference Management\n\n```yaml\npaths:\n  \u002Fconsent\u002Fpreferences:\n    get:\n      operationId: getConsentPreferences\n      summary: Get current consent preferences for the authenticated user\n      tags: [Consent]\n      responses:\n        '200':\n          description: Current consent preferences\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  subjectId:\n                    type: string\n                  preferences:\n                    type: array\n                    items:\n                      $ref: '#\u002Fcomponents\u002Fschemas\u002FConsentPreference'\n                  lastUpdated:\n                    type: string\n                    format: date-time\n\n    put:\n      operationId: updateConsentPreferences\n      summary: Update consent preferences (bulk update)\n      tags: [Consent]\n      requestBody:\n        required: true\n        content:\n          application\u002Fjson:\n            schema:\n              type: object\n              required: [preferences]\n              properties:\n                preferences:\n                  type: array\n                  items:\n                    type: object\n                    required: [purposeId, granted]\n                    properties:\n                      purposeId:\n                        type: string\n                      granted:\n                        type: boolean\n                      channels:\n                        type: array\n                        items:\n                          type: string\n                          enum: [email, sms, push, phone, postal]\n      responses:\n        '200':\n          description: Preferences updated\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  updated:\n                    type: array\n                    items:\n                      $ref: '#\u002Fcomponents\u002Fschemas\u002FConsentPreference'\n                  consentReceiptId:\n                    type: string\n                    format: uuid\n                    description: ID of the issued consent receipt\n\n  \u002Fconsent\u002Fpurposes:\n    get:\n      operationId: listConsentPurposes\n      summary: List all available consent purposes\n      tags: [Consent]\n      responses:\n        '200':\n          description: List of consent purposes\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  purposes:\n                    type: array\n                    items:\n                      type: object\n                      properties:\n                        purposeId:\n                          type: string\n                        name:\n                          type: string\n                        description:\n                          type: string\n                        category:\n                          type: string\n                          enum: [essential, functional, analytics, marketing]\n                        mandatory:\n                          type: boolean\n                        defaultState:\n                          type: boolean\n                        dataCategories:\n                          type: array\n                          items:\n                            type: string\n\n  \u002Fconsent\u002Freceipts\u002F{receiptId}:\n    get:\n      operationId: getConsentReceipt\n      summary: Retrieve a specific consent receipt\n      tags: [Consent]\n      parameters:\n        - name: receiptId\n          in: path\n          required: true\n          schema:\n            type: string\n            format: uuid\n      responses:\n        '200':\n          description: Consent receipt\n          content:\n            application\u002Fjson:\n              schema:\n                $ref: '#\u002Fcomponents\u002Fschemas\u002FConsentReceipt'\n```\n\n## 3. Deletion API\n\n### Cascading Delete Orchestration\n\n```python\n\"\"\"\nPrivacy deletion API with cascading delete orchestration.\nHandles deletion requests across multiple backend services\nwith verification and audit logging.\n\"\"\"\n\nfrom dataclasses import dataclass, field\nfrom datetime import datetime, timezone\nfrom enum import Enum\nfrom typing import Optional\nimport uuid\n\n\nclass DeletionStatus(Enum):\n    PENDING = \"pending\"\n    IN_PROGRESS = \"in_progress\"\n    PARTIALLY_COMPLETED = \"partially_completed\"\n    COMPLETED = \"completed\"\n    FAILED = \"failed\"\n    VERIFIED = \"verified\"\n\n\nclass ServiceDeletionStatus(Enum):\n    PENDING = \"pending\"\n    IN_PROGRESS = \"in_progress\"\n    COMPLETED = \"completed\"\n    FAILED = \"failed\"\n    SKIPPED = \"skipped\"  # For legally exempt data\n\n\n@dataclass\nclass DeletionTarget:\n    service_name: str\n    data_categories: list[str]\n    priority: int  # Lower number = delete first\n    legal_hold_check: bool = True\n    retention_exempt: bool = False  # True if data must be retained (e.g., tax records)\n\n\n@dataclass\nclass ServiceDeletionResult:\n    service_name: str\n    status: ServiceDeletionStatus\n    records_deleted: int\n    records_retained: int\n    retention_reason: Optional[str]\n    completed_at: Optional[datetime]\n    error_message: Optional[str]\n\n\n@dataclass\nclass DeletionRequest:\n    request_id: str\n    subject_id: str\n    status: DeletionStatus\n    created_at: datetime\n    scope: list[str]  # Data categories to delete\n    exclude: list[str]  # Data categories exempt from deletion\n    service_results: list[ServiceDeletionResult] = field(default_factory=list)\n    verified_at: Optional[datetime] = None\n    verification_method: Optional[str] = None\n\n\nclass CascadingDeletionOrchestrator:\n    \"\"\"\n    Orchestrate data deletion across multiple backend services\n    in the correct order, handling dependencies, legal holds,\n    and retention requirements.\n    \"\"\"\n\n    def __init__(self, service_registry: list[DeletionTarget], audit_logger):\n        self.targets = sorted(service_registry, key=lambda t: t.priority)\n        self.audit = audit_logger\n\n    def execute_deletion(\n        self,\n        subject_id: str,\n        scope: list[str],\n        exclude: list[str] = None\n    ) -> DeletionRequest:\n        \"\"\"\n        Execute cascading deletion across all registered services.\n\n        Args:\n            subject_id: The data subject whose data should be deleted\n            scope: Data categories to delete (or [\"all\"])\n            exclude: Data categories to exclude from deletion\n\n        Returns:\n            DeletionRequest with results from each service\n        \"\"\"\n        exclude = exclude or []\n\n        request = DeletionRequest(\n            request_id=str(uuid.uuid4()),\n            subject_id=subject_id,\n            status=DeletionStatus.IN_PROGRESS,\n            created_at=datetime.now(timezone.utc),\n            scope=scope,\n            exclude=exclude\n        )\n\n        self.audit.log_deletion_start(request)\n\n        for target in self.targets:\n            # Skip if data category not in scope\n            if \"all\" not in scope:\n                relevant_categories = set(target.data_categories) & set(scope)\n                if not relevant_categories:\n                    continue\n\n            # Skip if explicitly excluded\n            if set(target.data_categories) & set(exclude):\n                result = ServiceDeletionResult(\n                    service_name=target.service_name,\n                    status=ServiceDeletionStatus.SKIPPED,\n                    records_deleted=0,\n                    records_retained=0,\n                    retention_reason=\"Excluded by request\",\n                    completed_at=datetime.now(timezone.utc),\n                    error_message=None\n                )\n                request.service_results.append(result)\n                continue\n\n            # Check retention exemptions\n            if target.retention_exempt:\n                result = ServiceDeletionResult(\n                    service_name=target.service_name,\n                    status=ServiceDeletionStatus.SKIPPED,\n                    records_deleted=0,\n                    records_retained=0,\n                    retention_reason=\"Legal retention requirement\",\n                    completed_at=datetime.now(timezone.utc),\n                    error_message=None\n                )\n                request.service_results.append(result)\n                continue\n\n            # Check legal holds\n            if target.legal_hold_check:\n                hold = self._check_legal_hold(subject_id, target.service_name)\n                if hold:\n                    result = ServiceDeletionResult(\n                        service_name=target.service_name,\n                        status=ServiceDeletionStatus.SKIPPED,\n                        records_deleted=0,\n                        records_retained=0,\n                        retention_reason=f\"Legal hold: {hold}\",\n                        completed_at=datetime.now(timezone.utc),\n                        error_message=None\n                    )\n                    request.service_results.append(result)\n                    continue\n\n            # Execute deletion for this service\n            result = self._delete_from_service(subject_id, target)\n            request.service_results.append(result)\n\n        # Determine overall status\n        statuses = [r.status for r in request.service_results]\n        if all(s in (ServiceDeletionStatus.COMPLETED, ServiceDeletionStatus.SKIPPED) for s in statuses):\n            request.status = DeletionStatus.COMPLETED\n        elif any(s == ServiceDeletionStatus.FAILED for s in statuses):\n            request.status = DeletionStatus.PARTIALLY_COMPLETED\n        else:\n            request.status = DeletionStatus.COMPLETED\n\n        self.audit.log_deletion_complete(request)\n        return request\n\n    def verify_deletion(self, request: DeletionRequest) -> DeletionRequest:\n        \"\"\"\n        Verify that data was actually deleted from all services.\n        Run after deletion to confirm no data remnants exist.\n        \"\"\"\n        for result in request.service_results:\n            if result.status == ServiceDeletionStatus.COMPLETED:\n                # Attempt to query for the subject's data\n                remaining = self._check_data_exists(\n                    request.subject_id, result.service_name\n                )\n                if remaining > 0:\n                    result.status = ServiceDeletionStatus.FAILED\n                    result.error_message = f\"Verification failed: {remaining} records still exist\"\n\n        request.verified_at = datetime.now(timezone.utc)\n        request.verification_method = \"post_deletion_query\"\n\n        all_verified = all(\n            r.status in (ServiceDeletionStatus.COMPLETED, ServiceDeletionStatus.SKIPPED)\n            for r in request.service_results\n        )\n        request.status = DeletionStatus.VERIFIED if all_verified else DeletionStatus.PARTIALLY_COMPLETED\n\n        self.audit.log_deletion_verification(request)\n        return request\n\n    def _check_legal_hold(self, subject_id: str, service: str) -> Optional[str]:\n        \"\"\"Check if any legal hold applies to this subject's data.\"\"\"\n        # Integration point with legal hold management system\n        return None  # Override in production with actual legal hold check\n\n    def _delete_from_service(\n        self, subject_id: str, target: DeletionTarget\n    ) -> ServiceDeletionResult:\n        \"\"\"Execute deletion against a specific backend service.\"\"\"\n        # Integration point with actual backend service deletion API\n        return ServiceDeletionResult(\n            service_name=target.service_name,\n            status=ServiceDeletionStatus.COMPLETED,\n            records_deleted=0,\n            records_retained=0,\n            retention_reason=None,\n            completed_at=datetime.now(timezone.utc),\n            error_message=None\n        )\n\n    def _check_data_exists(self, subject_id: str, service: str) -> int:\n        \"\"\"Check if data still exists for a subject in a service.\"\"\"\n        # Integration point with service data existence check\n        return 0\n```\n\n## 4. Audit API\n\n### Audit Log Query Endpoints\n\n```yaml\npaths:\n  \u002Faudit\u002Fevents:\n    get:\n      operationId: queryAuditEvents\n      summary: Query privacy audit events\n      tags: [Audit]\n      security:\n        - OAuth2: [audit:read]\n      parameters:\n        - name: subjectId\n          in: query\n          schema:\n            type: string\n        - name: eventType\n          in: query\n          schema:\n            type: string\n            enum: [data_access, consent_change, deletion, dsar_submitted, dsar_completed, breach_detected]\n        - name: startDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date-time\n        - name: endDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date-time\n        - name: actorId\n          in: query\n          schema:\n            type: string\n        - name: page\n          in: query\n          schema:\n            type: integer\n            default: 1\n        - name: perPage\n          in: query\n          schema:\n            type: integer\n            default: 50\n            maximum: 200\n      responses:\n        '200':\n          description: Audit events\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  events:\n                    type: array\n                    items:\n                      type: object\n                      properties:\n                        eventId:\n                          type: string\n                          format: uuid\n                        eventType:\n                          type: string\n                        timestamp:\n                          type: string\n                          format: date-time\n                        actorId:\n                          type: string\n                        actorType:\n                          type: string\n                          enum: [user, system, admin, api_client]\n                        subjectId:\n                          type: string\n                        resource:\n                          type: string\n                        action:\n                          type: string\n                        purpose:\n                          type: string\n                        outcome:\n                          type: string\n                          enum: [success, failure, denied]\n                        details:\n                          type: object\n                  pagination:\n                    $ref: '#\u002Fcomponents\u002Fschemas\u002FPagination'\n\n  \u002Faudit\u002Freports\u002Fcompliance:\n    get:\n      operationId: getComplianceReport\n      summary: Generate compliance audit report for a date range\n      tags: [Audit]\n      parameters:\n        - name: startDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date\n        - name: endDate\n          in: query\n          required: true\n          schema:\n            type: string\n            format: date\n        - name: format\n          in: query\n          schema:\n            type: string\n            enum: [json, pdf, csv]\n            default: json\n      responses:\n        '200':\n          description: Compliance report\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  reportId:\n                    type: string\n                  generatedAt:\n                    type: string\n                    format: date-time\n                  period:\n                    type: object\n                    properties:\n                      start:\n                        type: string\n                      end:\n                        type: string\n                  summary:\n                    type: object\n                    properties:\n                      totalDataAccesses:\n                        type: integer\n                      totalConsentChanges:\n                        type: integer\n                      totalDeletions:\n                        type: integer\n                      totalDSARs:\n                        type: integer\n                      accessDenials:\n                        type: integer\n                      policyViolations:\n                        type: integer\n```\n\n## API Security Patterns\n\n### Authentication and Authorization\n\n| Endpoint Category | Auth Method | Scopes Required | Rate Limit |\n|-------------------|-------------|-----------------|------------|\n| DSAR (data subject) | OAuth2 PKCE \u002F JWT | dsar:read, dsar:write | 10 req\u002Fmin |\n| DSAR (admin) | OAuth2 Client Credentials | dsar:admin | 100 req\u002Fmin |\n| Consent (data subject) | OAuth2 PKCE \u002F JWT | consent:read, consent:write | 30 req\u002Fmin |\n| Deletion (internal) | mTLS + API key | deletion:execute | 5 req\u002Fmin |\n| Audit (compliance) | OAuth2 Client Credentials | audit:read | 50 req\u002Fmin |\n\n### Error Response Format\n\n```json\n{\n  \"error\": {\n    \"code\": \"PRIVACY_001\",\n    \"type\": \"identity_verification_required\",\n    \"message\": \"Identity verification is required before processing this request\",\n    \"details\": {\n      \"verificationMethods\": [\"email_verification\", \"document_upload\"],\n      \"supportUrl\": \"https:\u002F\u002Fsupport.cipherengineeringlabs.com\u002Fprivacy\"\n    },\n    \"requestId\": \"req_a1b2c3d4\",\n    \"timestamp\": \"2026-03-14T10:30:00.000Z\"\n  }\n}\n```\n\n## References\n\n- OpenAPI Specification 3.1.0\n- GDPR Articles 12-22 (Data Subject Rights)\n- CCPA\u002FCPRA Sections 1798.100-1798.135\n- RFC 6749 — OAuth 2.0 Authorization Framework\n- RFC 7519 — JSON Web Token (JWT)\n- OWASP API Security Top 10 (2023)\n- Google Privacy Sandbox API Design Guidelines\n- Apple App Tracking Transparency API Design Patterns\n",{"name":5,"license":15,"metadata":57,"description":7},{"tags":58,"author":9,"domain":39,"version":59,"subdomain":60},"privacy-api, dsar-api, consent-api, deletion-api, openapi-specification","1.0","privacy-engineering","main","9b2ef9eae161c00a17241d42a388571321b33e9f","skills\u002Fprivacy\u002Fprivacy-api-design",67,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills","https:\u002F\u002Fgithub.com\u002Fmukul975","Mahipal.engineer","🔐 Cybersecurity | 💻 Dev | 📷 Street Photographer\r\n🎓 MSc | 📚 Research & AI Security","2026-03-17 04:06:52",{"source":8,"skillName":5,"commands":71,"prompt":81,"zipAvailable":82},[72,75,78],{"tool":73,"command":74},"npx","npx skills add mukul975\u002FPrivacy-Data-Protection-Skills --skill privacy-api-design",{"tool":76,"command":77},"bunx","bunx skills add mukul975\u002FPrivacy-Data-Protection-Skills --skill privacy-api-design",{"tool":79,"command":80},"pnpm","pnpm dlx skills add mukul975\u002FPrivacy-Data-Protection-Skills --skill privacy-api-design","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fprivacy-api-design\u002FSKILL.md",true,[84,90,96,100],{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"assets\u002Ftemplate.md","ASSET","资产文件",2021,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fprivacy-api-design\u002Fassets\u002Ftemplate.md",{"path":91,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fstandards.md","REFERENCE","参考文档",806,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fprivacy-api-design\u002Freferences\u002Fstandards.md",{"path":97,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fworkflows.md",1544,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fprivacy-api-design\u002Freferences\u002Fworkflows.md",{"path":101,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":104,"sourceHtmlUrl":105},"scripts\u002Fprocess.py","SCRIPT","脚本",10095,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fprivacy-api-design\u002Fscripts\u002Fprocess.py",[107,130,146,159,176,189],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":122,"publishedAt":52},"01M6AG6K8R3XW10ENWH2FH18RH","workplace-email-privacy","Implements email and internet monitoring compliance in the workplace per Barbulescu v Romania (ECHR Grand Chamber), EDPB guidance, and national labour law. Covers acceptable use policies, legitimate expectation of privacy, proportionality testing, and content vs metadata monitoring. Keywords: email monitoring, Barbulescu, workplace privacy, internet monitoring, acceptable use policy, ECHR, proportionality.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fworkplace-email-privacy\u002FSKILL.md",[113,116,119],{"categoryNo":114,"categoryName":115,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":120,"categoryName":121,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000037","律师与法务",[123,124,39,45,125,44,126,127,128,129],"email","workplace email privacy","content","policy","testing","monitoring","metadata",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":140,"publishedAt":52},"01M6AG6FRCBJY7D061BJZMNV49","whistleblower-data","Implements data protection compliance for whistleblowing systems under EU Directive 2019\u002F1937 and GDPR. Covers anonymous reporting channels, identity protection for whistleblowers and accused persons, retention limits, access restrictions, and retaliation prevention. Addresses national transpositions and DPA guidance. Keywords: whistleblower, Directive 2019\u002F1937, anonymous reporting, identity protection, retaliation, retention, reporting channel.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fwhistleblower-data\u002FSKILL.md",[136,139],{"categoryNo":137,"categoryName":138,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师",{"categoryNo":120,"categoryName":121,"taxonomyType":29,"taxonomyTypeDesc":30},[44,141,142,46,45,143,144,39,145],"whistleblower data","identity","data protection","gdpr","prevention",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":153,"publishedAt":52},"01M6AG6CJP0PW3X65HC7VP9SR9","vendor-termination-data","Vendor termination data return and deletion procedures per GDPR Article 28(3)(g). Covers data extraction formats, deletion certification requirements, transition planning, residual data handling, and post-termination verification.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fvendor-termination-data\u002FSKILL.md",[152],{"categoryNo":137,"categoryName":138,"taxonomyType":29,"taxonomyTypeDesc":30},[44,154,155,156,157,144,39,158],"vendor termination data","planning","verification","extraction","certification",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":166,"publishedAt":52},"01M6AG69E277DXZB2NF6KV17ZA","vendor-risk-scoring","Vendor privacy risk tiering methodology for processor management. Covers scoring factors including data volume, sensitivity, transfer locations, certifications, breach history, and control maturity with weighted risk calculation and tier assignment.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fvendor-risk-scoring\u002FSKILL.md",[165],{"categoryNo":137,"categoryName":138,"taxonomyType":29,"taxonomyTypeDesc":30},[167,168,169,170,171,172,173,174,39,44,175],"vendor risk scoring","risk","risk scoring","methodology","risk-scoring","assessment","transfer","certifications","processor",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":183,"publishedAt":52},"01M6AG6655ABFKT2BBWHCP4PAT","vendor-privacy-due-diligence","Pre-contract vendor privacy due diligence per GDPR Article 28(1). Covers risk questionnaires, technical controls assessment, certification review, data flow analysis, and documented sufficiency decisions for processor engagement.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fvendor-privacy-due-diligence\u002FSKILL.md",[182],{"categoryNo":120,"categoryName":121,"taxonomyType":29,"taxonomyTypeDesc":30},[39,184,144,185,172,186,187,44,175,168,158,188],"vendor privacy due diligence","review","onboarding","flow","analysis",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":202,"publishedAt":52},"01M6AG62C3VD8SYNGH4N7RHZTE","vendor-privacy-audit","On-site and remote vendor audit procedures per GDPR Article 28(3)(h). Covers audit planning, evidence collection methodologies, finding classification, remediation tracking, and audit report generation for processor compliance verification.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FPrivacy-Data-Protection-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fprivacy\u002Fvendor-privacy-audit\u002FSKILL.md",[195,198,201],{"categoryNo":196,"categoryName":197,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":199,"categoryName":200,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000036","内容创作者",{"categoryNo":120,"categoryName":121,"taxonomyType":29,"taxonomyTypeDesc":30},[203,47,39,204,156,205,45,144,206,175,207,208,209,155],"vendor privacy audit","report","audit report","remediation","collection","remediation-tracking","classification"]