# How to Maintain Privacy with OpenAI Plugins: A Developer's Security Guide

> Learn how OpenAI plugins safeguard user privacy with manifest declarations scoped permissions and privacy tags for secure auditing. Protect your data today.

- Repository: [OpenAI/plugins](https://github.com/openai/plugins)
- Tags: best-practices
- Published: 2026-06-15

---

**OpenAI plugins protect user privacy through mandatory manifest declarations, scoped API permissions that limit data exposure, and runtime logging with explicit privacy tags that enable auditing without leaking sensitive information.**

Maintaining privacy with OpenAI plugins requires implementing the security architecture defined in the `openai/plugins` repository. The framework enforces privacy through three core mechanisms: explicit policy declarations in the plugin manifest, strict data minimization at runtime, and comprehensive audit trails. Developers who implement these patterns ensure user data remains protected while enabling powerful LLM integrations.

## The Three Pillars of Plugin Privacy

The privacy model in OpenAI plugins rests on three foundational pillars that operate at different stages of the plugin lifecycle.

### Explicit Privacy Declaration in the Manifest

Every plugin must expose a `privacyPolicyURL` field in its manifest file. According to the plugin JSON specification in [`.agents/skills/plugin-creator/references/plugin-json-spec.md`](https://github.com/openai/plugins/blob/main/.agents/skills/plugin-creator/references/plugin-json-spec.md), this URL is displayed to users in the ChatGPT UI before the plugin is invoked. This gives users explicit opportunity to review data usage policies before granting access.

### Data Minimization and Scoped Permissions

The manifest lists only the exact API endpoints a plugin can call. At runtime, the LLM is constrained to send only the data required for the declared endpoint. The Zoom Cobrowse SDK demonstrates this principle through privacy-masking rules that hide PII fields from agents while maintaining session functionality, as documented in [`plugins/zoom/skills/cobrowse-sdk/references/full-guide.md`](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/cobrowse-sdk/references/full-guide.md).

### Runtime Safeguards and Auditability

The host runtime logs every request with explicit privacy labels. The macOS telemetry skill in [`plugins/build-macos-apps/skills/telemetry/SKILL.md`](https://github.com/openai/plugins/blob/main/plugins/build-macos-apps/skills/telemetry/SKILL.md) demonstrates this pattern with logging calls that tag data as either `public` or `private`. These logs support internal auditing without exposing raw user data to end users.

## Implementing Privacy Policy Declarations

The `privacyPolicyURL` field is mandatory for transparency. When users install your plugin, the ChatGPT UI renders this link prominently, allowing informed consent before data exchange begins.

```json
{
  "schema_version": "v1",
  "name_for_human": "My Secure Plugin",
  "description_for_human": "Shows how to respect user privacy.",
  "auth": { "type": "none" },
  "api": {
    "type": "openapi",
    "url": "https://example.com/openapi.yaml",
    "has_user_authentication": false,
    "is_user_authenticated": false
  },
  "privacyPolicyURL": "https://example.com/privacy",
  "logo_url": "https://example.com/logo.png",
  "contact_email": "support@example.com"
}

```

Place this manifest at the root of your plugin domain. The `privacyPolicyURL` must resolve to a valid HTTPS endpoint that details your data collection, retention, and sharing practices.

## Protecting Sensitive Data with Privacy Masking

For plugins handling visual data or co-browsing sessions, the Zoom Cobrowse SDK provides a reference implementation for masking sensitive information. Located in [`plugins/zoom/skills/cobrowse-sdk/examples/privacy-masking.md`](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/cobrowse-sdk/examples/privacy-masking.md), this approach uses CSS selectors to define redaction zones.

```python

# examples/privacy-masking.md

PRIVACY_MASKS = [
    ".pii-mask",                 # CSS class applied to any PII field

    "[data-privacy='full']",     # Attribute selector for full masking

    "[data-privacy='optional']"  # Optional fields that can be redacted

]

def configure_masking(session):
    session.set_privacy_masks(PRIVACY_MASKS)

```

Apply the `.pii-mask` class to any HTML elements containing personally identifiable information. The remote agent view automatically renders these elements as blurred or blocked regions, preventing data leakage during collaborative sessions.

## Auditing Data Flow with Privacy Tags

Runtime logging in OpenAI plugins supports compliance through explicit privacy classification. The telemetry implementation in [`plugins/build-macos-apps/skills/telemetry/SKILL.md`](https://github.com/openai/plugins/blob/main/plugins/build-macos-apps/skills/telemetry/SKILL.md) demonstrates how to annotate log entries:

```swift
logger.info("Fetching user profile", privacy: .private)   // hides data in logs
logger.info("User tapped button", privacy: .public)      // safe for analytics

```

Use `privacy: .private` for any log message containing user identifiers, personal data, or session tokens. Use `privacy: .public` for generic interaction events that contain no identifiable information. This distinction ensures that production logs can be monitored for errors without violating user privacy.

## First-Party Analytics and Third-Party Protection

The Cloudflare Web Analytics integration in [`plugins/cloudflare/skills/cloudflare/references/web-analytics/README.md`](https://github.com/openai/plugins/blob/main/plugins/cloudflare/skills/cloudflare/references/web-analytics/README.md) demonstrates a privacy-first approach to telemetry. This implementation uses first-party cookies and anonymized IP addresses, avoiding third-party tracking vectors that could compromise user privacy across sessions.

When integrating analytics into your plugin, prefer first-party solutions that process data on your own infrastructure or through privacy-compliant proxies rather than shipping user data to external marketing platforms.

## Summary

- **Declare policies explicitly**: Include a valid `privacyPolicyURL` in your plugin manifest as defined in [`.agents/skills/plugin-creator/references/plugin-json-spec.md`](https://github.com/openai/plugins/blob/main/.agents/skills/plugin-creator/references/plugin-json-spec.md).
- **Minimize data exposure**: Restrict API endpoints in the manifest and implement CSS-based privacy masking for co-browsing sessions per [`plugins/zoom/skills/cobrowse-sdk/references/full-guide.md`](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/cobrowse-sdk/references/full-guide.md).
- **Tag log entries**: Use Swift privacy tags (`.private` and `.public`) when logging runtime events, following the pattern in [`plugins/build-macos-apps/skills/telemetry/SKILL.md`](https://github.com/openai/plugins/blob/main/plugins/build-macos-apps/skills/telemetry/SKILL.md).
- **Prefer first-party analytics**: Implement privacy-friendly tracking as demonstrated in the Cloudflare Web Analytics skill to avoid third-party data leakage.

## Frequently Asked Questions

### What is the privacyPolicyURL field in OpenAI plugins?

The `privacyPolicyURL` is a mandatory manifest field that links to your plugin's privacy policy document. According to the plugin JSON spec in [`.agents/skills/plugin-creator/references/plugin-json-spec.md`](https://github.com/openai/plugins/blob/main/.agents/skills/plugin-creator/references/plugin-json-spec.md), this URL displays in the ChatGPT UI before users activate your plugin, ensuring informed consent before any data exchange occurs.

### How does runtime logging protect user privacy in plugins?

Runtime logging uses explicit privacy tags to classify data sensitivity. As implemented in [`plugins/build-macos-apps/skills/telemetry/SKILL.md`](https://github.com/openai/plugins/blob/main/plugins/build-macos-apps/skills/telemetry/SKILL.md), developers annotate log entries with `privacy: .private` for sensitive data or `privacy: .public` for generic events. This ensures audit trails remain useful for debugging without exposing personally identifiable information in log streams.

### Can plugins access data outside their declared API endpoints?

No. The OpenAI plugin runtime enforces strict endpoint scoping based on the OpenAPI specification provided in the manifest. The LLM can only invoke URLs explicitly listed in the plugin configuration, preventing unauthorized data exfiltration to undeclared domains or endpoints.

### How should developers handle PII in co-browsing sessions?

Developers should implement CSS selector-based privacy masking using the Zoom Cobrowse SDK pattern documented in [`plugins/zoom/skills/cobrowse-sdk/examples/privacy-masking.md`](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/cobrowse-sdk/examples/privacy-masking.md). Apply specific CSS classes or data attributes to PII elements, then configure the masking rules to redact these selectors from the remote agent view while preserving functionality for the local user.