---
name: submit-to-aicoming
description: Create private English Tool listings and community Post drafts in AiComing through its public API. Use when a user asks an AI agent, assistant, automation, or coding tool to submit, save, send, or prepare an AI tool listing or article for AiComing, including selecting existing categories or tags and attaching a remote or local cover image. Never publish content.
---

# Submit to AiComing

Create content through the draft-only AiComing API. Keep publication under the user's control.

## Setup

1. Set `BASE_URL` to `https://aicoming.net`.
2. Obtain an AiComing API key from the user or the `AICOMING_API_KEY` environment variable.
3. Never print, log, persist, or place the API key in a URL.
4. Send the key as `Authorization: Bearer $AICOMING_API_KEY`.
5. Read `https://aicoming.net/openapi.json` when exact request or response schemas are needed.

## Choose the resource

- Create a Tool draft for an AI product, service, directory listing, or website.
- Create a Post draft for an article, tutorial, opinion, announcement, or community update.
- Ask one concise question if the resource type cannot be inferred.
- Write all submitted fields in English. Translate source material when necessary without changing factual meaning.

## Prepare taxonomies

Fetch the currently valid values before assigning any taxonomy:

```bash
curl -fsS "${BASE_URL}/api/taxonomies?type=category"
curl -fsS "${BASE_URL}/api/taxonomies?type=tag"
```

- Use returned `slug` values. Never invent a slug.
- For a Tool, choose one to three relevant category slugs and up to five tag slugs.
- For a Post, choose at most one category slug. Posts do not accept tags.
- Omit uncertain taxonomies instead of guessing.

## Prepare an image

- When a suitable public HTTP(S) image already exists, pass it as `imageUrl`.
- When the user provides a local image, upload it first:

```bash
curl -fsS -X POST "${BASE_URL}/api/v1/images" \
  -H "Authorization: Bearer ${AICOMING_API_KEY}" \
  -F "file=@/absolute/path/to/cover.png"
```

- Read the uploaded URL from `data.url` and pass it as `imageUrl`.
- Accept JPEG, PNG, WebP, GIF, or AVIF up to 10 MB.
- Omit `imageUrl` when no suitable image is available. Do not fabricate a URL.

## Create a Tool draft

Submit `name`, `website`, and a description of at most 100 characters. Add detailed Markdown content, taxonomy slugs, and an image when available.

```bash
curl -fsS -X POST "${BASE_URL}/api/v1/tools/drafts" \
  -H "Authorization: Bearer ${AICOMING_API_KEY}" \
  -H "Content-Type: application/json" \
  --data-binary @tool-draft.json
```

Use this JSON shape:

```json
{
  "name": "Example AI",
  "website": "https://example.com",
  "description": "An AI assistant for research workflows.",
  "content": "## Overview\n\nA detailed English description.",
  "categories": ["productivity"],
  "tags": ["research", "writing"],
  "imageUrl": "https://example.com/cover.png"
}
```

## Create a Post draft

Submit a title. Add an English summary, Markdown body, one category slug, and an image when available.

```bash
curl -fsS -X POST "${BASE_URL}/api/v1/posts/drafts" \
  -H "Authorization: Bearer ${AICOMING_API_KEY}" \
  -H "Content-Type: application/json" \
  --data-binary @post-draft.json
```

Use this JSON shape:

```json
{
  "title": "How AI changes research workflows",
  "description": "A practical overview for modern research teams.",
  "content": "## Introduction\n\nThe complete English post in Markdown.",
  "category": "ai-news",
  "imageUrl": "https://example.com/post-cover.png"
}
```

## Verify and report

1. Require HTTP `201`, response `code: 0`, and `data.status: "draft"`.
2. Return the created resource type, title or name, `data.previewUrl`, and `data.editUrl` to the user.
3. Tell the user to sign in, review, edit, and publish manually.
4. Never call a publish endpoint or claim that a draft is public.

## Recover from errors

- On `400` taxonomy errors, fetch taxonomies again and retry once with valid slugs.
- On `401`, request a valid API key without echoing the rejected key.
- On `409`, report that the Tool domain has already been submitted; do not create a duplicate.
- On `413`, reduce the JSON body or image size.
- On `429`, respect `Retry-After`, wait, and retry once.
- On other errors, report the API message and preserve the prepared content for a later retry.
