This workflow is the canonical path for agents submitting products without using the browser form.
Before you send the request
- Confirm the URL is the canonical product homepage.
- Fetch valid tool slugs from
GET /api/v1/tools. - Prepare a short description that clearly states what the product does.
- Decide whether you need any
custom_toolsin addition to directory tools.
What happens after a successful submit
A 201 response means the submission was accepted into the pending queue. It does not mean the product is live in the public directory yet.
Main failure modes
VALIDATION_ERROR: required fields are missing or invalidINVALID_TOOL_SLUGS: at least one slug does not existDUPLICATE_DOMAIN: the domain already exists in the directory or queueRATE_LIMITED: you exceeded the public write limits
What not to do
- Do not submit a docs URL, asset URL, or changelog URL as the product homepage.
- Do not rely on
tool_idsunless you already have valid UUIDs. - Do not assume a successful submit created a public listing.
/api/v1/toolsUse this endpoint as the source of truth for valid tool slugs before calling the submit endpoint.
Auth
No API keys. No account auth. Public JSON endpoints only.
Review model
Read-only endpoint. No review-state implications.
Cache
5 minute revalidation.
Example request
curl https://www.madewithstack.com/api/v1/tools
Responses
Success
Returns the ordered tool inventory used by the submission flow.
{
"tools": [
{
"slug": "claude",
"name": "Claude",
"category": "models-providers",
"description": "Model provider for conversational and agent workflows."
},
{
"slug": "supabase",
"name": "Supabase",
"category": "backend-db",
"description": "Postgres backend, auth, and storage platform."
}
]
}Error codes
| Code | Status | Meaning |
|---|---|---|
INTERNAL_ERROR | 500 | Unexpected server error. Retry later. |
Operational notes
- Call this before building a submission payload or when refreshing a local tool cache.
- Use tool_slugs from this endpoint instead of hardcoding UUIDs.
- Responses are cached for 5 minutes.
/api/v1/submitThis is the agent-facing write endpoint for creating pending submissions without using the browser form.
Auth
No API keys. No account auth. Public JSON endpoints only.
Review model
Submit is write-only into the manual review queue. Listings do not publish instantly.
Cache
No caching. Write endpoint with separate IP and email rate-limit buckets.
Example request
curl -X POST https://www.madewithstack.com/api/v1/submit \
-H "Content-Type: application/json" \
-d '{
"name": "AgentFlow",
"url": "https://agentflow.dev",
"description": "Workflow automation for multi-agent pipelines.",
"email": "founder@agentflow.dev",
"tool_slugs": ["langchain", "claude"],
"qualification_type": "agent_built",
"agent_use_case": "operations",
"qualification_statement": "Agents handled substantial parts of the workflow and build process.",
"workflow_summary": "The product routes operational work through an agentic workflow.",
"agent_tools_used": ["Cursor", "Claude"],
"supporting_links": ["https://agentflow.dev/docs"],
"founder_name": "Ada Smith",
"audience_tags": ["b2b", "for-developers"]
}'Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Product name. |
url | absolute http/https URL | Yes | Canonical product homepage URL. |
description | string | Yes | Short description. Maximum 240 characters. |
email | string | Yes | Submitter email used for review updates and pending-status checks. |
tool_slugs | string[] | No | Preferred tool identifiers. Discover valid values from GET /api/v1/tools. |
tool_ids | UUID[] | No | Alternative to tool_slugs. Every value must be a valid UUID string. |
custom_tools | string[] | No | Custom tool names. Maximum 5 entries, each 40 characters or less. |
founder_name | string | No | Founder or team name. |
founder_twitter | string | No | X/Twitter handle. |
favicon_url | absolute http/https URL | No | Manual logo override. |
screenshot_url | absolute http/https URL | No | Manual screenshot override. |
audience_tags | ("for-developers" | "for-founders" | "b2b" | "consumer")[] | No | Optional audience tags. |
qualification_type | "agent_native" | "agent_built" | "agentic_workflow" | No | Optional Agent Directory qualification type. If provided, the related claim fields become required. |
agent_use_case | "support" | "research" | "operations" | "sales" | "voice" | "browser_automation" | No | Primary use case for Agent Directory review. |
qualification_statement | string | No | Short public justification for Agent Directory eligibility. |
workflow_summary | string | No | How the agent or agentic workflow is central to the product. |
agent_tools_used | string[] | No | Named agent-building tools used in the product or build process. |
supporting_links | string[] | No | Supporting public links reviewers can inspect for the claim. |
referral_code | string | No | Optional referral code from an existing listing. |
Responses
Submission created
The submission was accepted into pending review. The product is not public yet.
{
"success": true,
"slug": "agentflow",
"receiptSent": true,
"review_status_url": "https://www.madewithstack.com/api/v1/products/agentflow?email=founder%40agentflow.dev",
"owner_claim": {
"email": "founder@agentflow.dev",
"status": "unverified",
"verification_email_sent": true
},
"claim_status": "submitted",
"claim_eligibility": "agent_directory",
"next_action_code": "UNDER_EDITORIAL_REVIEW"
}Error codes
| Code | Status | Meaning |
|---|---|---|
VALIDATION_ERROR | 400 | Missing, malformed, or unsupported request data. |
INVALID_TOOL_SLUGS | 400 | One or more submitted tool slugs are not present in the directory. |
DUPLICATE_DOMAIN | 409 | A product with the same normalized domain already exists. |
RATE_LIMITED | 429 | The request exceeded the public API rate limit window. |
INTERNAL_ERROR | 500 | Unexpected server error. Retry later. |
Operational notes
- Call this when you have a valid product homepage, a short description, a submitter email, and stack metadata ready for review.
- At least one of tool_slugs, tool_ids, or custom_tools must be non-empty.
- If qualification_type is provided, agent_use_case, qualification_statement, workflow_summary, agent_tools_used, and supporting_links are required.
- tool_slugs is preferred over tool_ids.
- API submissions are free-tier only. paid_fast_track is not exposed through the API.
- Listings require manual approval before they appear in the public catalog.
- Use review_status_url from the response to poll review, claim state, and badge availability.
- Recommended polling interval is 300 seconds, with longer backoff after repeated unchanged responses.
- 429 responses include a Retry-After header in seconds.