# Requirements for Hosting an OpenAI Plugin: HTTPS, Manifests, and Authentication

> Learn the requirements for hosting an OpenAI plugin. Ensure your plugin has HTTPS, a valid manifest, and proper authentication for seamless integration.

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

---

**To host an OpenAI plugin, you must expose a publicly reachable HTTPS endpoint serving a static [`ai-plugin.json`](https://github.com/openai/plugins/blob/main/ai-plugin.json) manifest and a valid OpenAPI 3.0+ specification, with properly configured authentication, CORS headers, and rate limiting.**

The `openai/plugins` repository defines the architectural contract for ChatGPT plugins. Hosting an OpenAI plugin requires strict adherence to transport security, manifest schema, and API discoverability standards to ensure seamless integration with the ChatGPT runtime.

## Infrastructure Requirements for Hosting an OpenAI Plugin

### HTTPS and Public Accessibility

All URLs—including the manifest, OpenAPI spec, and webhook callbacks—must be served over **TLS 1.2 or higher** with a valid certificate. The endpoints must be publicly reachable without firewall restrictions, VPN requirements, or localhost addresses. According to the repository's [README.md](https://github.com/openai/plugins/blob/main/README.md), the deployment model requires internet-wide accessibility for ChatGPT to fetch resources at runtime.

### Static Manifest Configuration

The **[`ai-plugin.json`](https://github.com/openai/plugins/blob/main/ai-plugin.json)** manifest must be served as a static JSON file at the exact URL declared in the plugin registration. This file describes the plugin name, description, authentication type, API specification URL, logo, and contact information. The repository provides a reference implementation in [.codex-plugin/ai-plugin.json](https://github.com/openai/plugins/blob/main/.codex-plugin/ai-plugin.json), while the plugin identity is declared in [.codex-plugin/plugin.json](https://github.com/openai/plugins/blob/main/.codex-plugin/plugin.json).

### OpenAPI Specification

You must provide a complete **OpenAPI 3.0 or later** description of every endpoint the plugin exposes. The specification URL is referenced in the [`ai-plugin.json`](https://github.com/openai/plugins/blob/main/ai-plugin.json) manifest. The source repository includes an example specification at [openapi.yaml](https://github.com/openai/plugins/blob/main/openapi.yaml) demonstrating the required schema structure.

## Security and Authentication Requirements

### Authentication Methods

Plugins support three authentication types: **none**, **API key**, or **OAuth 2.0**. The chosen method must be explicitly declared in the manifest's `auth.type` field and fully implemented on the server. When using API keys or OAuth, the endpoints must validate credentials on every request according to the standard declared in the manifest.

### CORS and Content Security Policy

For browser-based SDK integrations, the server must emit appropriate `Access-Control-Allow-Origin` headers (either wildcard `*` or the specific ChatGPT domain) and a Content-Security-Policy permitting script execution. The Zoom SDK skill documentation in [plugins/zoom/skills/zoom-apps-sdk/references/security.md](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/zoom-apps-sdk/references/security.md) provides concrete examples of required security headers.

### Webhook Security (Optional)

If implementing push-based event delivery, webhook endpoints must use HTTPS, remain publicly reachable, and verify request authenticity using **HMAC-SHA256 signatures** or similar mechanisms. The [plugins/zoom/skills/zoom-webhooks/references/webhook-security.md](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/zoom-webhooks/references/webhook-security.md) file outlines best practices for webhook authentication, including signature validation and replay attack prevention.

## Operational Requirements

### URL Stability and Versioning

The manifest and OpenAPI specification URLs must remain immutable for the lifetime of the plugin version. Any breaking changes require publishing a new plugin version with updated manifest references. The [CONTRIBUTING.md](https://github.com/openai/plugins/blob/main/CONTRIBUTING.md) file establishes the versioning policy that governs when manifests must be refreshed.

### Rate Limiting and Compliance

Hosts must enforce sensible rate limits (e.g., 100 requests per minute) and return **HTTP 429 Too Many Requests** responses when limits are exceeded. The manifest should declare rate limiting policies in the `rate_limit` field to inform the model of throughput constraints.

## Verification Commands and Code Samples

Fetch the manifest to verify accessibility:

```bash
curl -fsSL https://my-plugin.example.com/.well-known/ai-plugin.json | jq .

```

Call an authenticated endpoint as defined in your OpenAPI spec:

```bash
curl -H "Authorization: Bearer $API_KEY" \
     -fsSL https://my-plugin.example.com/api/v1/search?q=hello

```

Verify webhook signatures using HMAC-SHA256:

```python
import hmac, hashlib, base64, json, os

def verify_signature(request_body: bytes, header_signature: str) -> bool:
    secret = os.getenv("WEBHOOK_SECRET").encode()
    digest = hmac.new(secret, request_body, hashlib.sha256).digest()
    expected = base64.b64encode(digest).decode()
    return hmac.compare_digest(expected, header_signature)

```

## Summary

- **HTTPS and public accessibility** are mandatory; all endpoints must use TLS 1.2+ and be reachable without network restrictions.
- The **[`ai-plugin.json`](https://github.com/openai/plugins/blob/main/ai-plugin.json) manifest** must be served as a static file at the declared URL, containing metadata and API specification references.
- **OpenAPI 3.0+ specifications** must completely describe all exposed endpoints for runtime discovery.
- **Authentication** must be declared in the manifest and implemented as none, API key, or OAuth 2.0.
- **CORS headers** and security policies are required for browser-based integrations.
- **URL immutability** is enforced; breaking changes require new plugin versions per [CONTRIBUTING.md](https://github.com/openai/plugins/blob/main/CONTRIBUTING.md).
- **Rate limiting** must be implemented with proper HTTP 429 responses.

## Frequently Asked Questions

### Does OpenAI require specific hosting providers or cloud platforms?

No. The `openai/plugins` repository imposes no restrictions on hosting providers. Any infrastructure capable of serving HTTPS traffic with valid TLS certificates and maintaining public IP accessibility satisfies the requirements. Self-hosted servers, AWS, Google Cloud, and Azure are all acceptable provided they meet the network and security specifications outlined in the source code.

### Can I develop and test plugins on localhost?

No. The ChatGPT runtime requires publicly reachable URLs to fetch the manifest and OpenAPI specification. Localhost addresses and private network ranges are inaccessible to the model. For development, use tunneling services or deploy to a staging environment with a public DNS record and valid SSL certificate.

### What happens if I change the OpenAPI spec URL after publishing?

Changing the specification URL breaks existing plugin installations. According to [CONTRIBUTING.md](https://github.com/openai/plugins/blob/main/CONTRIBUTING.md), manifests and their referenced URLs must remain immutable for the plugin version lifetime. You must publish a new plugin version with a fresh manifest to update API specifications.

### Are webhooks required for all OpenAI plugins?

No. Webhook support is optional and only necessary if your plugin pushes real-time events to ChatGPT rather than responding to user queries. When implemented, they must follow the security guidelines in [plugins/zoom/skills/zoom-webhooks/references/webhook-security.md](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/zoom-webhooks/references/webhook-security.md), including HTTPS transport and HMAC signature verification.