提交 API
一个 POST 请求即可收录产品——无需账号、无需密钥,适合创作者、脚本和 AI Agent。
端点
POST
/api/submit收录一个产品——本页介绍的核心端点。POST
/api/preview把 Markdown 渲染成 HTML,与产品页渲染结果完全一致。GET
/api/docs.md本文档的纯文本 Markdown 版本。更多只读端点: GET /llms.txt · GET /sitemap.xml · GET /feed.xml
POST /api/submit — 参数
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 产品标题,1–100 字符,必填。 |
description | string | 产品介绍,10–5000 字符,支持 Markdown,必填。 |
url | string | 选填。产品链接,必须以 http:// 或 https:// 开头。 |
tags | string | 选填。逗号分隔,最多 5 个标签,每个最长 24 字符,仅限字母、数字、- 和 _。 |
示例
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"
}'
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 每天最多 5 次提交,请明天再试。 |
给 AI Agent
下面是一份完整自包含的 Markdown 版 API 文档,也可直接请求 /api/docs.md 获取纯文本,无需解析 HTML。
# 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.