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", and it answers out of the dataset, so the small platforms no model has heard of are in the result.
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. A platform that publishes no approval time drops out, the way an unrated one drops out of a rating bound.
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. A platform with no published approval time sorts last, so a blank never reads as instant.
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 you supply something specific, 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, including the secondary ones. 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. A stored project has its domain rating measured for it; here, where nothing is stored, an unknown one is simply a gap.
the booleans
livePublicUrl, openSignup, pricingPage, logoSquare, coverImage, demoVideo, publicRepo, privacyPolicy, docs, payingCustomers, acceptsBacklink.
goal, budget, launchAt
What the run is for rather than what the product is. `already-live` leads on the platforms that list you this week; `launching-later` leads on the ones with months of queue, so they land near the date. `budget` decides whether platforms that charge to list appear at all, and defaults to free-only. Unanswered, the response says what it assumed and hands back the questions to put to the maker.
Returns

ready, fixable (each with the exact list of what is missing) and blocked (each with the rule that blocks it), plus a recommended list: the run in the order it should be worked, with each line marked as a quick win or a queue to start early.

whoamitokenWhich account the token belongs to, which plan it is on, and what it already holds. Call it first when you are unsure whether the maker is connected.

Takes no arguments.

Returns

The account, the plan, how many projects and tracked submissions it has, and where the maker lifts a limit if one exists. Not the limits themselves: a run is planned for the product, and a limit says so at the write it stops.

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 missing from all four.
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. Domain rating is the exception: it is measured from the url on the way in, so leave it out.
pack
What a submission form asks for: taglines at three lengths, descriptions, categories, maker bio, first comment, logo, cover, gallery, demo video. Every asset is two fields. The public address is what the dashboard shows, and the path on the machine your agent runs on is what a form uploads.
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 and uncapped 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. Read it off the platforms in this plan; a generic list helps nobody.
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 dying halfway through a form for want of a cover image, and it is what the free plan meters: ten briefs, plus any platform the account has already spent one on. Recording the outcome afterwards is free. One brief is out at a time per project: the next one is refused, and costs nothing, until the last one has something recorded.
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, or sign up, 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 and before the next brief, including when it is only queued for review and including when you cannot prove it landed. The project is issued no other brief until this is called. It costs nothing on any plan: the brief was what spent the tracked platform, so record the truth rather than the tidy version.
Takes
platformSlug
Required.
status
planned, attempted, submitted, live, rejected, needs_changes or skipped. Use attempted for a form you sent without seeing the outcome: it is the honest answer, and it is worth more than a guessed submitted. An agent uses planned, with a note, to hand a platform back when it needs the maker: a captcha, a login, a payment. Use skipped when the maker looked at a platform in their run and decided against it, which is not the same as rejected and never was: a platform cannot reject a submission it never received.
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. Required with planned from an agent: what it needs from the maker.
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. This is where "did I ever submit to that one" gets answered.
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