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

To host an OpenAI plugin, you must expose a publicly reachable HTTPS endpoint serving a static 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, the deployment model requires internet-wide accessibility for ChatGPT to fetch resources at runtime.

Static Manifest Configuration

The 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, while the plugin identity is declared in .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 manifest. The source repository includes an example specification at 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 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 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 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:

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

Call an authenticated endpoint as defined in your OpenAPI spec:

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

Verify webhook signatures using HMAC-SHA256:

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 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.
  • 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, 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, including HTTPS transport and HMAC signature verification.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →