Documentation

Submit an official plugin: review every publication in the app

Anyone or any AI can submit plugin metadata and content using Python 3. Every item needs an administrator’s in-app approval before publication; no account or credential is required.

Updated

Run your collector; review every submitted item

#

Build your collector, submit its description and sample, then wait for an administrator to choose 确定 (approve) or 拒绝 (reject) in Ntfyx. Every later notification submitted with publish needs its own decision before public preview or subscriber delivery. Anyone or any agent can submit without an account or credential.

Ntfyx does not upload or run collector code, and this interface cannot read private Inboxes. Approved plugins use the existing official catalog and subscription workflow.

1. Submit the description and a review sample

#

Use Python 3 and its standard library. Inspect the script and replace the example manifest’s name, scope, version, real sources, privacy URL and support URL. The sample must be public plain text. Omit plugin_id for a new plugin. The client persists its operation ID and exact input before sending, so an uncertain request can retain its original identity.

The sample is review/catalog-preview material, not a subscriber publication.

Terminal
curl -fsSLO https://ntfyx.me/developers/ntfyx-plugin.py
curl -fsSLO https://ntfyx.me/developers/plugin.example.json
curl -fsSLO https://ntfyx.me/developers/sample.example.json
# Read the script; replace example descriptions and URLs first.
python3 ntfyx-plugin.py submit --slug my-public-updates --manifest plugin.example.json --sample sample.example.json
python3 ntfyx-plugin.py status

2. Choose 确定 or 拒绝 in the original app request

#

The administrator opens the request in a dedicated plugin review Topic and reads its description, version, sources and submitted content. 确定 approves this item; 拒绝 keeps it unpublished. These supplied button labels stay Chinese. No browser approval page is needed. Opening, reading, timeout and status queries approve nothing.

A queued phone reply must finish verification and confirmation; do not create another submission simply because its result is still pending.

3. Submit every new event for another review

#

After metadata approval, save a stable event_id, title and body, then run publish. Each event returns a separate submission_id and waits for its own in-app decision. Metadata approval never grants automatic approval for later content. Retry the same ID and exact content after an uncertain response; changed content with the same ID conflicts.

The collector template creates synthetic example data, performs no network request and submits nothing by itself.

Terminal
curl -fsSLO https://ntfyx.me/developers/example-collector.py
python3 example-collector.py --event-id example-2026-10-19-001 > event.json
# Synthetic example only. Each publication waits for phone review.
python3 ntfyx-plugin.py publish --file event.json
python3 ntfyx-plugin.py status

Recover the original operation

#

retry preserves the saved path, ID and body; there are no automatic write retries. status reads only safe status fields and never requests or simulates approval. Replaying a rejected or expired ID returns that terminal result, without a new request. A deliberate resubmission needs a new operation ID or source event ID.

Production and staging state are separate; put --server https://api.staging.ntfyx.me before the command. Earlier client state is never automatically replayed through the anonymous interface.

ResultNext step
Uncertain outcomeKeep the private state file and retry the original operation.
HTTP 409Inspect the original ID/content and plugin state; do not blindly change IDs.
HTTP 429 / 503Wait, then retry the same operation. A full review queue is not an approval.
Changing uncertain inputCheck the original result first. An explicitly different --state file preserves the earlier intent; a new operation does not cancel the original review.
Terminal
python3 ntfyx-plugin.py retry
python3 ntfyx-plugin.py status

Small submission limits

#

Anonymous submissions: 6 per IP per 10 minutes, with at most 50 unexpired pending items globally. The catalog has 29 dynamic-plugin slots including pending metadata. Each plugin accepts 10 new notification submissions per UTC day, including pending and rejected items; identical ID/content retries do not count again.

The server-canonical manifest is limited to 1,600 UTF-8 bytes. Titles use at most 120 and bodies 8,000 UTF-16 code units; the complete message must also fit 16 KiB UTF-8. JSON Schema alone cannot calculate the completed canonical manifest budget.