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.
- 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.
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.
- slug
- The platform slug, e.g. "product-hunt".
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.
- 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.
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.
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.
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.
- 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.
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.
- projectId
- Omit it when the account has one project.
- name, url, pitch, facts, pack
- Any subset. Absent keys are left alone.
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.
- 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.
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.
- 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.
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.
- 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.
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.
- projectId
- Omit it when the account has one project.
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