---
name: ailinkify
description: Operate an AI Linkify account remotely — read products and target sites, submit a product to directories and launch platforms, and write back submission status and evidence. Use when the user asks to submit, publish, list, or track their product on directories / launch platforms through AI Linkify.
---

# AI Linkify Agent

AI Linkify maintains a curated library of directories, launch platforms and communities. Through this skill an AI agent can work on the user's account remotely:

- create a product and read the user's products and profile (the data needed to fill submission forms),
- query the target-site library and see which sites were already submitted to,
- submit a product to a site and record the result (status + evidence URL),
- update records later when a listing goes live or gets rejected.

## 1. Credentials

| Item | Value |
|---|---|
| API base | `https://ailinkify.com/api/agent` |
| Auth | `Authorization: Bearer {{API_KEY}}` (required on every request) |
| Skill doc | `https://ailinkify.com/skill.md` |
| Human overview | `https://ailinkify.com/skill` |

Never print the API key into shared logs, files or commits. If a request returns `401`, the key is invalid or revoked — ask the user to issue a new one at `https://ailinkify.com/agent`.

## 2. Smoke test

```bash
curl -s https://ailinkify.com/api/agent/me -H "Authorization: Bearer {{API_KEY}}"
```

Returns the account, the plan, remaining quota (`plan.limits` vs `plan.usage`), and whether unattended auto-submit is unlocked (`plan.autoSubmit`). Read this first: it tells you how much work is allowed.

## 3. Endpoints

| Method | Path | Purpose |
|---|---|---|
| GET | `/me` | Account, plan, quota, auto-submit flag |
| GET | `/products` | All products with submission-ready fields (empty fields already fall back to the profile) |
| POST | `/products` | Create a product (body: `name`, `websiteUrl` required; optional `tagline`, `shortDescription`, `longDescription`, `category`, `pricingModel`, `tags`, `screenshots`, `logoUrl`, `demoUrl`, `docsUrl`, `contactEmail`, `founderName`, `companyName`, `twitterUrl`, `githubUrl`, `linkedinUrl`, `launchDate`) |
| GET | `/profile` | Author profile (name, email, socials, bio) for forms that need an author |
| GET | `/targets` | Target-site library: `?q=&channel=directory|launch|content|community&pricing=free|paid&minDr=&dofollow=yes&sort=dr|name&productId=&page=&limit=` |
| POST | `/targets` | Add a new site the user found (body: `name`, `homepageUrl`, optional `submitUrl`, `channelType`, `submitKind`, `requiresLogin`, `requiresReview`, `notes`) |
| GET | `/submissions` | Submission records: `?status=&productId=&channel=&page=&limit=` |
| POST | `/submissions` | Create or reuse a record (body: `productId`, `targetUrl` required; optional `targetName`, `targetSiteId`, `status`, `submittedUrl`, `evidenceUrl`, `notes`, `auto`) |
| GET | `/submissions/{id}` | One record with its full status history |
| PATCH | `/submissions/{id}` | Update `status` / `submittedUrl` / `evidenceUrl` / `notes` |

Every response is JSON. Errors: `{ "error": "..." }` with `401` (bad key), `402` (quota exceeded, includes `limit` and `used`), `403` (feature requires an upgrade), `409` (already submitted to that site, includes `submissionId`).

## 4. Recommended workflow

1. **Smoke test** — `GET /me`; stop and tell the user if quota is exhausted or the key is rejected.
2. **Load the material** — `GET /products` (pick the product the user named; if the account has none yet, create it with `POST /products`) and `GET /profile` for author details.
3. **Pick targets** — `GET /targets?minDr=40&limit=20` (add `productId` to see per-product status). Prefer `pricing=free`, higher `drScore`, and sites where `submitKind=form`.
4. **Skip what is done** — a target whose `mySubmission.status` is `submitted`, `awaiting_review` or `published` is already covered; do not submit again.
5. **Prepare the copy** — adapt name / tagline / description / category to each site's form. Keep it factual; never invent funding, customer counts or awards. `GET /submissions/{id}` and `notes` reveal site-specific requirements (login, review, email-only submission).
6. **Submit** — open `submitUrl` in a real browser session and fill the form. `submitKind=manual` means the site has no web form: either send an email or hand it back to the user.
7. **Write back** — `POST /submissions` with `targetUrl` (the site URL) and `status: "submitted"`, plus `submittedUrl` (the page created) and `evidenceUrl` (screenshot / confirmation / public listing) when available. Pass `auto: true` only when no human reviewed the submission — it requires a Pro plan.
8. **Follow up later** — once the listing is live, `PATCH /submissions/{id}` with `status: "published"` and the public URL.

### Example: record a finished submission

```bash
curl -s -X POST https://ailinkify.com/api/agent/submissions \
  -H "Authorization: Bearer {{API_KEY}}" -H "Content-Type: application/json" \
  -d '{
    "productId": "PRODUCT_ID",
    "targetUrl": "https://example-directory.com/submit",
    "targetName": "Example Directory",
    "status": "submitted",
    "submittedUrl": "https://example-directory.com/p/my-product",
    "evidenceUrl": "https://example-directory.com/p/my-product",
    "notes": "Submitted via form, awaiting review"
  }'
```

### Example: mark it published

```bash
curl -s -X PATCH https://ailinkify.com/api/agent/submissions/SUBMISSION_ID \
  -H "Authorization: Bearer {{API_KEY}}" -H "Content-Type: application/json" \
  -d '{"status":"published","evidenceUrl":"https://example-directory.com/p/my-product"}'
```

## 5. Statuses

- `todo` → preparing, submitted
- `preparing` → submitted, failed
- `submitted` → awaiting_review, published, rejected, failed, unknown
- `awaiting_review` → published, rejected, unknown
- `published` (终态)
- `rejected` → todo
- `failed` → todo
- `unknown` → todo, submitted, awaiting_review, published

Only the transitions above are accepted; an invalid jump returns `400`. De-duplication is per (product, site): a second POST for the same pair either reuses the existing record (`deduped: true`) or returns `409` when the record is already active.

## 6. Rules

- One submission row per product + site — always reuse, never create a parallel row.
- Write only facts you observed: URLs you actually saw, statuses that actually happened.
- `auto: true` (unattended submission) is a Pro feature; on a free plan it returns `403`.
- Quota is enforced server-side: a new record may fail with `402`. Report the remaining quota instead of retrying.
- The user's own custom sites (`isGlobal: false`) are private to the account; the built-in library is shared.
- Ask the user before paying for a paid listing, accepting terms, or posting from their social accounts.