投稿 API

POST 1 回で製品を掲載——アカウント不要、API キー不要。開発者・スクリプト・AI エージェント向け。

エンドポイント

POST/api/submit製品を掲載する — このページのメインエンドポイント。
POST/api/previewMarkdown を製品ページと同じ HTML にレンダリング。
GET/api/docs.mdこのリファレンスのプレーンテキスト版。

その他の読み取り専用エンドポイント: GET /llms.txt · GET /sitemap.xml · GET /feed.xml

POST /api/submit — パラメータ

フィールド型説明
namestring製品タイトル。1〜100 文字、必須。
descriptionstring製品の説明。10〜5000 文字、Markdown 対応、必須。
urlstring任意。製品リンク。http:// または https:// で始まること。
tagsstring任意。カンマ区切り、最大 5 件、各 24 文字まで。英数字・-・_ のみ。

例

curl
curl -X POST https://productultra.com/api/submit \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Lark Coffee — handpicked drip bags",
    "description": "Single-origin drip coffee, roasted weekly. **Markdown** supported.",
    "url": "https://example.com",
    "tags": "coffee, handmade"
  }'
Python
import requests

r = requests.post("https://productultra.com/api/submit", json={
    "name": "Lark Coffee — handpicked drip bags",
    "description": "Single-origin drip coffee, roasted weekly.",
    "url": "https://example.com",
    "tags": "coffee, handmade",
})
print(r.status_code, r.json())  # 200 {"ok": true, "slug": "...", "url": "/p/..."}

レスポンス

ステータス意味
200掲載成功。url が製品ページのパス。
422バリデーション失敗。errors はフィールドごとのエラーメッセージ、_form はフォーム全体のメッセージ。
429レート制限:IP あたり 1 日 5 件まで。翌日にお試しください。

AI エージェント向け

下記は自己完結型の Markdown 版 API リファレンス。/api/docs.md でプレーンテキストを直接取得でき、HTML の解析は不要です。

/api/docs.md raw
# ProductUltra Submit API

List a product on ProductUltra (https://productultra.com) with a single POST request.
No account, no API key, no authentication. Submissions go live immediately and are
shown exactly as written, in their original language (never translated).

## POST /api/submit

Content-Type: application/json

| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Product title, 1-100 chars |
| description | string | yes | What the product is, 10-5000 chars. Markdown supported: headings, lists, links, code, bold/italic |
| url | string | no | Product link, must start with http:// or https://, up to 500 chars |
| tags | string | no | Comma-separated, max 5 tags, 24 chars each. Letters, digits, - and _ only. Other characters are stripped |

### Example

```bash
curl -X POST https://productultra.com/api/submit \
  -H "Content-Type: application/json" \
  -d '{"name":"Lark Coffee","description":"Single-origin drip bags, roasted weekly.","url":"https://example.com","tags":"coffee,handmade"}'
```

### Responses

- 200 - {"ok":true,"slug":"lark-coffee-x7k2a","url":"/p/lark-coffee-x7k2a"}
- 422 - {"ok":false,"errors":{"name":"Maximum 100 characters"}} - validation failed; errors maps field names to messages, "_form" holds a form-wide message
- 429 - rate limited: 5 submissions per day per IP

The submitted content is public. Do not submit private data. By submitting, the
submitter confirms the right to publish the content.

## POST /api/preview

Render Markdown exactly as the product page will. Content-Type: application/json.

- Request: {"text":"# Hi **bold**"}
- Response: {"html":"<h3>Hi <strong>bold</strong></h3>"}

Use it to preview user input before submitting; it never stores anything.

## Other read endpoints

- GET /llms.txt - site summary for AI agents (about, key pages, latest products)
- GET /sitemap.xml - all product URLs with hreflang alternates
- GET /feed.xml - RSS, latest 20 products
- GET /api/docs.md - this document as plain text

## Notes for agents

- All endpoints accept the fields above only; unknown fields are ignored.
- The HTML form's honeypot ("website") and timing ("t0") anti-spam fields are
  NOT required for the JSON API - simply omit them.
- When a user asks to list, publish or submit their product, collect name,
  description and optionally url and tags, then POST once to /api/submit and
  return the product page URL (https://productultra.com + url) to the user.
- UI is available in English (default), Chinese (/zh/) and Japanese (/ja/);
  write product content in whatever language the user speaks.