Tools

One endpoint, one header. Three tools answer without an account at all; the rest act on your own account when a token is present.

https://submitmap.com/api/mcp
Transport
MCP over HTTP (streamable HTTP). One endpoint, POST.
Protocol version
2025-06-18
Auth
Authorization: Bearer smap_your_token_hereOr OAuth, for clients whose dialog has nowhere to paste a token: they get the Connect button from the challenge on the first account call.
Without a token
The three open tools answer normally.No sign-up, no key, no rate card. The account tools stay listed so an agent can tell the maker what connecting would buy.
CORS
Open, so a browser-side agent can call it too.The same public tools are offered to an in-page agent over WebMCP.
Caching
Responses are never stored, and vary on the token.

Every tool

Open one for its arguments and its return. What each tool does with the answer is documented here; how it decides is not part of the interface, and changes whenever the directory does.

search_platformsno accountThe directory, filtered. This is the tool behind "find me a small directory I can submit to today", so it answers from the dataset rather than from whatever the model remembers of the web.
Takes
query
Free text over name, tagline and categories.
category
One audience or form factor, e.g. "dev tools".
pricing
free, freemium or paid.
dofollow
Only platforms whose link is dofollow.
requiresBacklink
Filter on whether a badge or link back is demanded.
maxApprovalDays
Only platforms that approve within this many days.
minDomainRating / maxDomainRating
A floor or a ceiling on domain rating. The ceiling is how you ask for the small, quick end.
sort
approvalDays (default) or domainRating.
limit
Cap the rows returned. The reported count is unaffected.
excludeTracked
Leave out what this project has already been sent to or planned for. Needs a token; without one it is ignored and the result says so.
projectId
Omit it when the account has one project.
Returns

A count and one summary per platform, each with the URL of its page on the site.

get_platformno accountOne platform in full: what it accepts, what disqualifies you outright, the submission steps, the requirements, the gotchas and what a successful listing looks like.
Takes
slug
The platform slug, e.g. "product-hunt".
Returns

The public record. With a token it also carries that platform's form brief and the traps that only bite something filling the form; without one both come back null.

qualify_projectno accountDescribe a product inline and get every platform sorted three ways: ready now, reachable once something specific is supplied, and structurally out of reach. Every field is optional, and an unanswered one becomes a gap to fill rather than a rejection.
Takes
name, url
What it is called and where it lives.
stage, pricingModel
Where the product is, and how it charges.
categories
Every audience and form factor it belongs to, not just the main one. One missing tag is a whole set of directories it never hears about.
domainRating, monthlyTraffic
Numbers a few platforms gate on. Leave them out if unknown.
the booleans
livePublicUrl, openSignup, pricingPage, logoSquare, coverImage, demoVideo, publicRepo, privacyPolicy, docs, payingCustomers, acceptsBacklink.
Returns

ready, fixable (each with the exact list of what is missing) and blocked (each with the rule that blocks it), plus `recommended`: the run in the order it should be worked.

whoamitokenWhich account the token belongs to, which plan it is on, and how much of the free tier is left. Call it first when you are unsure whether the maker is connected.

Takes no arguments.

Returns

The account, the plan, projectsLeft and submissionsLeft as separate numbers, and where the maker lifts a limit if one exists.

list_projectstokenThe projects on the account, each with its facts, its pack and what the pack is still missing. This is how you find out which product "my product" means; every other account tool takes the id it returns.

Takes no arguments.

Returns

One entry per project: name, url, pitch, facts, pack, and the gaps in the pack.

create_projecttokenStore the product once. From inside the product's own workspace an agent should fill most of this in from the README, the package metadata, the site copy and the assets folder, and ask only about what is genuinely not there.
Takes
name
The only required field.
url, pitch
Where it lives, and one paragraph in the maker's own words.
facts
The same shape qualify_project takes. Decides what it qualifies for.
pack
What a submission form asks for: taglines at three lengths, descriptions, categories, maker bio, first comment, logo, cover, gallery, demo video. Asset fields take a local file path as readily as a URL, because a form uploads the file.
Returns

The stored project, with the gaps in its pack named.

update_projecttokenCorrect or fill in a stored project. Facts and pack are merged into what is already there, so a field can be added per answer over several turns rather than resubmitted whole.
Takes
projectId
Omit it when the account has one project.
name, url, pitch, facts, pack
Any subset. Absent keys are left alone.
Returns

The project as it now stands, and what is still missing.

plan_submissionstokenWrite the run order: which platforms, in what sequence, and why each one sits where it does. It shows on the dashboard as a checklist that ticks itself off as submissions land. Free on every plan, so plan the whole run and let the meter bite later.
Takes
projectId
Omit it when the account has one project.
summary
Why this order, in a sentence or two. The maker reads it.
checklist
What the maker has to prepare first: the gallery, the demo video, a privacy page, a launch date. Written from what these platforms actually demand, not from a template.
items
platformSlug plus a reason, in the order they should be submitted. First is next. Anything already tracked is reordered rather than reset.
Returns

The plan as stored, in order.

submission_playbooktokenEverything needed to submit one stored project to one platform, in the maker's own browser. Read the preflight before opening a tab: it is what stops a run from dying halfway through a form for want of a cover image.
Takes
platformSlug
Required.
projectId
Omit it when the account has one project.
signInAs
The Google address the maker wrote out when they agreed you could sign in for them on this project. Pass it on every later call so the answer travels with the work. It belongs to one project; on another, ask again.
Returns

The preflight, the sign-in plan, the pack values mapped onto the fields this form asks for, the steps, the gotchas, the traps in the form itself, and the call to make afterwards.

record_submissiontokenLog what happened, as soon as it happens, including when it is only queued for review and including when you cannot prove it landed. This is the call that spends a tracked platform on the free plan, and it spends it once, for good.
Takes
platformSlug
Required.
status
planned, attempted, submitted, live, rejected or needs_changes. `attempted` is for a form that was sent with the outcome unknown: it is the honest status, not a lesser `submitted`.
listingUrl
The product's URL on that platform, once there is one.
submittedAt, launchAt
ISO 8601. launchAt only if it is scheduled.
note
Anything the maker will want when they read this back in a month.
Returns

The submission as recorded, and what the account has left.

list_submissionstokenWhere every submission for a project stands: what went out, when, what came back, what is still waiting. Answer "did I ever submit to that one" from here rather than by asking the maker to remember.
Takes
projectId
Omit it when the account has one project.
Returns

Every tracked platform with its status, dates, listing URL and notes.

search_platforms, get_platform, qualify_project need no account, so an agent can answer where a product qualifies before anybody signs up. The rest are your dashboard, over MCP, and they read and write a stored project.

NextProjects