ccpa-compliance
カリフォルニア州の消費者の個人情報を取り扱う企業が、CCPA/CPRA法を遵守するために、プライバシー機能の実装やデータ主体要求への対応などを支援するSkill。
📜 元の英語説明(参考)
California Consumer Privacy Act (CCPA) / CPRA compliance for businesses handling California resident data. Use when serving California users, building privacy features, implementing consumer data rights, or responding to data subject requests.
🇯🇵 日本人クリエイター向け解説
カリフォルニア州の消費者の個人情報を取り扱う企業が、CCPA/CPRA法を遵守するために、プライバシー機能の実装やデータ主体要求への対応などを支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o ccpa-compliance.zip https://jpskill.com/download/14724.zip && unzip -o ccpa-compliance.zip && rm ccpa-compliance.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14724.zip -OutFile "$d\ccpa-compliance.zip"; Expand-Archive "$d\ccpa-compliance.zip" -DestinationPath $d -Force; ri "$d\ccpa-compliance.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
ccpa-compliance.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
ccpa-complianceフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
CCPA / CPRA コンプライアンス
概要
カリフォルニア州消費者プライバシー法 (CCPA) は、CPRA (2023年1月1日施行のカリフォルニア州プライバシー権法) によって改正され、カリフォルニア州の居住者に個人情報に関する権利を与えています。これは、以下の条件に該当する営利企業に適用されます。
- 年間総収入が2500万ドル以上、または
- 100,000人以上のカリフォルニア州の消費者/世帯の個人情報を売買/共有している、または
- 年間収入の50%以上を個人情報の販売から得ている
罰金:意図しない違反1件あたり最大2,500ドル、意図的な違反1件あたり7,500ドル。カリフォルニア州司法長官および個々の消費者が訴訟を起こすことができます。
CCPA/CPRAに基づく消費者の権利
| 権利 | 説明 | 対応期限 |
|---|---|---|
| 知る権利 (Right to Know) | どのような個人情報が収集、使用、共有、販売されているか | 45日 (+ 45日間の延長) |
| 削除する権利 (Right to Delete) | 個人情報の削除を要求する | 45日 |
| オプトアウトする権利 (Right to Opt-Out) | 個人情報の販売または共有をオプトアウトする | 即時 |
| 修正する権利 (Right to Correct) | 不正確な個人情報を修正する (CPRA) | 45日 |
| 制限する権利 (Right to Limit) | センシティブな個人情報の使用を制限する (CPRA) | 即時 |
| 差別されない権利 (Right to Non-Discrimination) | 権利を行使したことでサービスの提供を拒否されない | N/A — 常に |
| データポータビリティの権利 (Right to Data Portability) | データをポータブルな形式で受け取る | 45日 |
センシティブな個人情報 (CPRA)
CPRAは、センシティブなPIに対して追加の保護を加えています。
- SSN、運転免許証、パスポート番号
- 金融口座の認証情報
- 正確な地理位置情報 (1,852メートル以内)
- 人種または民族的出身
- 宗教的または哲学的信念
- 労働組合への加入
- 郵便、電子メール、テキストメッセージの内容
- 遺伝データ
- 識別に使用される生体認証データ
- 健康情報
- 性的指向または性生活
データインベントリとマッピング
DSRワークフローを構築する前に、データをマッピングします。
# data_inventory.py — 収集する個人データを文書化する
DATA_INVENTORY = {
"users": {
"table": "users",
"fields": {
"email": {"category": "contact", "sensitive": False, "sold": False},
"name": {"category": "identifier", "sensitive": False, "sold": False},
"ip_address": {"category": "usage", "sensitive": False, "sold": False},
"location": {"category": "location", "sensitive": True, "sold": False},
"phone": {"category": "contact", "sensitive": False, "sold": False},
},
"retention_days": 365 * 3, # 3 years
"third_parties": ["Stripe", "SendGrid", "Mixpanel"],
},
"analytics_events": {
"table": "events",
"fields": {
"user_id": {"category": "identifier", "sensitive": False, "sold": False},
"event_name": {"category": "behavior", "sensitive": False, "sold": False},
"device_id": {"category": "identifier", "sensitive": False, "sold": True},
},
"retention_days": 365,
"third_parties": ["Mixpanel", "Segment"],
}
}
プライバシー通知の要件
プライバシーポリシーには、以下を開示する必要があります。
- 収集される個人情報のカテゴリ
- 収集の目的
- 個人情報を販売または共有するかどうか
- データが開示される第三者のカテゴリ
- 消費者の権利とその行使方法
- プライバシーに関するリクエストの連絡先情報
// プライバシーポリシーに必要なセクション
const REQUIRED_DISCLOSURES = {
collected_categories: [
"Identifiers (name, email, IP address)",
"Commercial information (purchase history)",
"Internet or other network activity (browsing history)",
"Geolocation data",
"Inferences drawn from above"
],
collection_purposes: [
"Provide and improve our services",
"Send transactional and marketing emails",
"Analytics and product development"
],
sells_data: false, // Required disclosure
shares_data: true, // Sharing = cross-context behavioral advertising
shared_with: ["Google Analytics", "Facebook Pixel", "Mixpanel"],
rights_contact: "privacy@yourcompany.com",
opt_out_url: "https://yourcompany.com/privacy/opt-out"
};
GPC (Global Privacy Control) シグナル検出
GPCは、販売/共有のオプトアウトの権利を自動的に呼び出すブラウザシグナルです。カリフォルニア州法 (CPRA) では、企業は2023年からこれを尊重する必要があります。
// Express.js ミドルウェア — GPCシグナルを検出し、オプトアウトを尊重する
const gpcMiddleware = (req, res, next) => {
const gpcEnabled = req.headers['sec-gpc'] === '1';
if (gpcEnabled) {
// このリクエストに対してオプトアウトを自動的に適用する
req.privacyConsent = {
optedOutOfSale: true,
optedOutOfSharing: true,
source: 'gpc_signal',
detectedAt: new Date().toISOString()
};
// オプトアウトの設定を記録する
if (req.user) {
recordOptOut(req.user.id, 'gpc_signal');
} else {
// 匿名ユーザーのためにCookieを使用して永続化する
res.cookie('ccpa_optout', '1', {
maxAge: 365 * 24 * 60 * 60 * 1000, // 1 year
httpOnly: true,
secure: true,
sameSite: 'Strict'
});
}
}
next();
};
データ主体要求 (DSR) API
# FastAPI DSR エンドポイント
from fastapi import FastAPI, BackgroundTasks, HTTPException
from pydantic import BaseModel, EmailStr
from enum import Enum
import uuid
from datetime import datetime
app = FastAPI()
class DSRType(str, Enum):
KNOW = "know"
DELETE = "delete"
CORRECT = "correct"
OPT_OUT = "opt_out"
LIMIT_SPI = "limit_sensitive"
PORTABILITY = "portability"
class DSRRequest(BaseModel):
request_type: DSRType
email: EmailStr
name: str
correction_details: str = None # For CORRECT requests
class DSRResponse(BaseModel):
request_id: str
status: str
deadline: str
message: str
@app.post("/api/privacy/dsr", response_model=DSRResponse)
async def submit_dsr(request: DSRRequest, background_tasks: BackgroundTasks):
"""データ主体要求を送信します。"""
request_id = str(uuid.uuid4())
deadline_days = 1 if request.request_type == DSRType.OP 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
CCPA / CPRA Compliance
Overview
The California Consumer Privacy Act (CCPA), amended by CPRA (California Privacy Rights Act effective January 1, 2023), gives California residents rights over their personal information. Applies to for-profit businesses that:
- Have ≥$25M annual gross revenue, OR
- Buy/sell/share personal info of ≥100,000 CA consumers/households, OR
- Derive ≥50% of annual revenue from selling personal info
Fines: up to $2,500 per unintentional violation, $7,500 per intentional violation. California AG and individual consumers can sue.
Consumer Rights Under CCPA/CPRA
| Right | Description | Response Deadline |
|---|---|---|
| Right to Know | What personal info is collected, used, shared, sold | 45 days (+ 45-day extension) |
| Right to Delete | Request deletion of personal info | 45 days |
| Right to Opt-Out | Opt out of sale or sharing of personal info | Immediate effect |
| Right to Correct | Correct inaccurate personal info (CPRA) | 45 days |
| Right to Limit | Limit use of sensitive personal info (CPRA) | Immediate effect |
| Right to Non-Discrimination | Cannot be denied service for exercising rights | N/A — always |
| Right to Data Portability | Receive data in portable format | 45 days |
Sensitive Personal Information (CPRA)
CPRA adds extra protections for sensitive PI:
- SSN, driver's license, passport number
- Financial account credentials
- Precise geolocation (within 1,852 meters)
- Racial or ethnic origin
- Religious or philosophical beliefs
- Union membership
- Contents of mail, email, text messages
- Genetic data
- Biometric data used for identification
- Health information
- Sexual orientation or sex life
Data Inventory and Mapping
Before building DSR workflows, map your data:
# data_inventory.py — document what personal data you collect
DATA_INVENTORY = {
"users": {
"table": "users",
"fields": {
"email": {"category": "contact", "sensitive": False, "sold": False},
"name": {"category": "identifier", "sensitive": False, "sold": False},
"ip_address": {"category": "usage", "sensitive": False, "sold": False},
"location": {"category": "location", "sensitive": True, "sold": False},
"phone": {"category": "contact", "sensitive": False, "sold": False},
},
"retention_days": 365 * 3, # 3 years
"third_parties": ["Stripe", "SendGrid", "Mixpanel"],
},
"analytics_events": {
"table": "events",
"fields": {
"user_id": {"category": "identifier", "sensitive": False, "sold": False},
"event_name": {"category": "behavior", "sensitive": False, "sold": False},
"device_id": {"category": "identifier", "sensitive": False, "sold": True},
},
"retention_days": 365,
"third_parties": ["Mixpanel", "Segment"],
}
}
Privacy Notice Requirements
Your privacy policy must disclose:
- Categories of personal information collected
- Purposes for collection
- Whether you sell or share personal information
- Categories of third parties data is disclosed to
- Consumer rights and how to exercise them
- Contact info for privacy requests
// Required sections in privacy policy
const REQUIRED_DISCLOSURES = {
collected_categories: [
"Identifiers (name, email, IP address)",
"Commercial information (purchase history)",
"Internet or other network activity (browsing history)",
"Geolocation data",
"Inferences drawn from above"
],
collection_purposes: [
"Provide and improve our services",
"Send transactional and marketing emails",
"Analytics and product development"
],
sells_data: false, // Required disclosure
shares_data: true, // Sharing = cross-context behavioral advertising
shared_with: ["Google Analytics", "Facebook Pixel", "Mixpanel"],
rights_contact: "privacy@yourcompany.com",
opt_out_url: "https://yourcompany.com/privacy/opt-out"
};
GPC (Global Privacy Control) Signal Detection
GPC is a browser signal that automatically invokes the right to opt-out of sale/sharing. California law (CPRA) requires businesses to honor it as of 2023.
// Express.js middleware — detect GPC signal and honor opt-out
const gpcMiddleware = (req, res, next) => {
const gpcEnabled = req.headers['sec-gpc'] === '1';
if (gpcEnabled) {
// Auto-apply opt-out for this request
req.privacyConsent = {
optedOutOfSale: true,
optedOutOfSharing: true,
source: 'gpc_signal',
detectedAt: new Date().toISOString()
};
// Record opt-out preference
if (req.user) {
recordOptOut(req.user.id, 'gpc_signal');
} else {
// Use cookie to persist for anonymous users
res.cookie('ccpa_optout', '1', {
maxAge: 365 * 24 * 60 * 60 * 1000, // 1 year
httpOnly: true,
secure: true,
sameSite: 'Strict'
});
}
}
next();
};
Data Subject Request (DSR) API
# FastAPI DSR endpoints
from fastapi import FastAPI, BackgroundTasks, HTTPException
from pydantic import BaseModel, EmailStr
from enum import Enum
import uuid
from datetime import datetime
app = FastAPI()
class DSRType(str, Enum):
KNOW = "know"
DELETE = "delete"
CORRECT = "correct"
OPT_OUT = "opt_out"
LIMIT_SPI = "limit_sensitive"
PORTABILITY = "portability"
class DSRRequest(BaseModel):
request_type: DSRType
email: EmailStr
name: str
correction_details: str = None # For CORRECT requests
class DSRResponse(BaseModel):
request_id: str
status: str
deadline: str
message: str
@app.post("/api/privacy/dsr", response_model=DSRResponse)
async def submit_dsr(request: DSRRequest, background_tasks: BackgroundTasks):
"""Submit a Data Subject Request."""
request_id = str(uuid.uuid4())
deadline_days = 1 if request.request_type == DSRType.OPT_OUT else 45
# Store request
dsr_record = {
"id": request_id,
"type": request.request_type,
"email": request.email,
"name": request.name,
"status": "pending",
"submitted_at": datetime.utcnow().isoformat(),
"deadline_days": deadline_days,
"verified": False
}
await db.dsr_requests.insert(dsr_record)
# Send verification email
background_tasks.add_task(send_verification_email, request.email, request_id)
return DSRResponse(
request_id=request_id,
status="pending_verification",
deadline=f"{deadline_days} days after identity verification",
message="We've sent a verification email. Please verify your identity to proceed."
)
@app.post("/api/privacy/dsr/{request_id}/verify")
async def verify_dsr(request_id: str, token: str, background_tasks: BackgroundTasks):
"""Verify identity and begin DSR processing."""
dsr = await db.dsr_requests.find_one({"id": request_id, "token": token})
if not dsr:
raise HTTPException(status_code=404, detail="Request not found")
await db.dsr_requests.update({"id": request_id}, {"verified": True, "verified_at": datetime.utcnow().isoformat()})
background_tasks.add_task(process_dsr, request_id, dsr["type"], dsr["email"])
return {"status": "processing", "message": "Identity verified. Processing your request."}
async def process_dsr(request_id: str, dsr_type: DSRType, email: str):
"""Process DSR by type."""
user = await db.users.find_one({"email": email})
if not user:
await complete_dsr(request_id, "no_data_found")
return
if dsr_type == DSRType.DELETE:
await delete_user_data(user["id"])
elif dsr_type == DSRType.KNOW:
data_export = await export_user_data(user["id"])
await send_data_export(email, data_export)
elif dsr_type == DSRType.OPT_OUT:
await opt_out_user(user["id"])
elif dsr_type == DSRType.PORTABILITY:
portable_data = await export_portable_data(user["id"])
await send_data_export(email, portable_data, format="json")
await complete_dsr(request_id, "completed")
Data Export Pipeline (Right to Know / Portability)
async def export_user_data(user_id: str) -> dict:
"""Export all personal data for a user — CCPA Right to Know."""
user = await db.users.find_one({"id": user_id})
orders = await db.orders.find({"user_id": user_id})
events = await db.analytics_events.find({"user_id": user_id})
return {
"export_date": datetime.utcnow().isoformat(),
"profile": {
"name": user["name"],
"email": user["email"],
"phone": user.get("phone"),
"created_at": user["created_at"]
},
"purchase_history": [
{"order_id": o["id"], "date": o["date"], "amount": o["amount"]}
for o in orders
],
"analytics_events": [
{"event": e["name"], "date": e["timestamp"]}
for e in events
],
"third_party_sharing": [
{"vendor": "Stripe", "data": "Payment processing"},
{"vendor": "SendGrid", "data": "Email delivery"},
]
}
Opt-Out of Sale/Sharing
// Track and honor opt-out preference
async function recordOptOut(userId, source) {
await db.privacyPreferences.upsert({
userId,
optedOutOfSale: true,
optedOutOfSharing: true,
source, // 'user_request' | 'gpc_signal' | 'cookie_banner'
timestamp: new Date().toISOString()
});
// Propagate opt-out to third parties
await Promise.all([
mixpanel.optOut(userId),
segment.suppress(userId),
// Don't forget to stop sharing with ad networks
]);
}
Compliance Checklist
- [ ] Privacy policy updated with all required CCPA/CPRA disclosures
- [ ] "Do Not Sell or Share My Personal Information" link in footer
- [ ] DSR submission form available (web + toll-free phone option)
- [ ] Identity verification before processing DSRs
- [ ] DSR response within 45 days (document timeline)
- [ ] GPC signal detection implemented and honored
- [ ] Data inventory and mapping completed
- [ ] Sensitive personal information identified and limited
- [ ] Third-party contracts updated with data sharing restrictions
- [ ] Opt-out preference stored and honored across systems
- [ ] Annual privacy policy review scheduled
- [ ] Training for staff who handle privacy requests