Launch your clients' products on up to 100 directories each from Claude Code, Cursor or VS Code.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer and your Submitator agency API key
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Submits a launched project to more directories from its free allowance (no launch is spent). Call preview_launch with the same arguments first and get the user to agree. An include longer than the free allowance answers allowance_exhausted; a directory already listed answers invalid_directories.
Project id (prj_...)
"auto" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these
The directory count from preview_launch that the user agreed to
Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude}
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http mcp https://mcp.submitator.com/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer and your Submitator agency API keySubmits a launched project to more directories from its free allowance (no launch is spent). Call preview_launch with the same arguments first and get the user to agree. An include longer than the free allowance answers allowance_exhausted; a directory already listed answers invalid_directories.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
| directories* | any | "auto" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these |
| confirm_selected* | integer | The directory count from preview_launch that the user agreed to |
| excluded_directories | array | Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude} |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"directories",
"confirm_selected"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
},
"directories": {
"anyOf": [
{
"type": "string",
"const": "auto"
},
{
"type": "object",
"required": [
"include"
],
"properties": {
"include": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"maxItems": 100,
"minItems": 1
}
}
},
{
"type": "object",
"required": [
"exclude"
],
"properties": {
"exclude": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"minItems": 1
}
}
}
],
"description": "\"auto\" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these"
},
"confirm_selected": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The directory count from preview_launch that the user agreed to"
},
"excluded_directories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"description": "Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude}"
}
}
}Adds one screenshot to a project (5 at most), from a public URL or, with the npx package, a local file. Each call adds another one, so do not repeat a call that succeeded.
| Argument | Type | Description |
|---|---|---|
| url* | string | Public image URL: PNG, JPEG, GIF or WebP, 5 MB at most |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Public image URL: PNG, JPEG, GIF or WebP, 5 MB at most"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Creates a project for a client's product from its URL. Name, tagline and description are filled from the site in the background when left out. Costs nothing: a launch is spent only by launch_project.
| Argument | Type | Description |
|---|---|---|
| url* | string | The client product's public URL |
| name | string | Product name; filled from the site when left out |
| tags | array | Up to 10. Replaces the whole list |
| tagline | any | One-line pitch |
| audience | object | Which audience-restricted directories fit the product |
| category | any | |
| logo_url | string | Public image URL for the logo (PNG, JPEG, GIF or WebP, 5 MB at most) |
| metadata | object | Up to 20 string pairs for the agency. Replaces all of it; {} clears it |
| maker_name | any | Founder or maker name |
| promo_code | any | Discount code some directories ask for |
| competitors | array | Up to 20, some directories need them. Replaces the whole list: send the current one plus changes |
| external_id | any | The agency's own id for this client |
| launch_date | any | YYYY-MM-DD |
| twitter_url | any | https://x.com/... profile |
| price_period | any | |
| contact_email | any | Email the directories write to; required before launch |
| pricing_model | any | |
| screenshot_urls | array | 1 to 5 public image URLs |
| long_description | any | Long description |
| promo_description | any | What the promo code gives |
| short_description | any | Short description |
| price_amount_cents | any | Price in cents |
| excluded_directories | array | Directories never to use for this project. Replaces the whole list (read get_project first); [] clears it |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The client product's public URL"
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Product name; filled from the site when left out"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 10,
"description": "Up to 10. Replaces the whole list"
},
"tagline": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "One-line pitch"
},
"audience": {
"type": "object",
"required": [
"b2b",
"ai",
"directory"
],
"properties": {
"ai": {
"type": "boolean"
},
"b2b": {
"type": "boolean"
},
"directory": {
"type": "boolean"
}
},
"description": "Which audience-restricted directories fit the product"
},
"category": {
"anyOf": [
{
"enum": [
"saas",
"ai_tools",
"dev_tools",
"no_code",
"productivity",
"other"
],
"type": "string"
},
{
"type": "null"
}
]
},
"logo_url": {
"type": "string",
"maxLength": 2048,
"description": "Public image URL for the logo (PNG, JPEG, GIF or WebP, 5 MB at most)"
},
"metadata": {
"type": "object",
"description": "Up to 20 string pairs for the agency. Replaces all of it; {} clears it",
"propertyNames": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
"maker_name": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Founder or maker name"
},
"promo_code": {
"anyOf": [
{
"type": "string",
"maxLength": 50
},
{
"type": "null"
}
],
"description": "Discount code some directories ask for"
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 500
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
}
},
"maxItems": 20,
"description": "Up to 20, some directories need them. Replaces the whole list: send the current one plus changes"
},
"external_id": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "The agency's own id for this client"
},
"launch_date": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
],
"description": "YYYY-MM-DD"
},
"twitter_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"description": "https://x.com/... profile"
},
"price_period": {
"anyOf": [
{
"enum": [
"monthly",
"yearly",
"one_time"
],
"type": "string"
},
{
"type": "null"
}
]
},
"contact_email": {
"anyOf": [
{
"type": "string",
"maxLength": 254
},
{
"type": "null"
}
],
"description": "Email the directories write to; required before launch"
},
"pricing_model": {
"anyOf": [
{
"enum": [
"free",
"freemium",
"paid",
"open_source"
],
"type": "string"
},
{
"type": "null"
}
]
},
"screenshot_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"minItems": 1,
"description": "1 to 5 public image URLs"
},
"long_description": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"description": "Long description"
},
"promo_description": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"description": "What the promo code gives"
},
"short_description": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"description": "Short description"
},
"price_amount_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price in cents"
},
"excluded_directories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"description": "Directories never to use for this project. Replaces the whole list (read get_project first); [] clears it"
}
}
}Builds a PDF or XLSX report of a project, branded for the agency. Building takes a moment: then call get_report.
| Argument | Type | Description |
|---|---|---|
| format* | string | |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"format"
],
"properties": {
"format": {
"enum": [
"pdf",
"xlsx"
],
"type": "string"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Gives the project's client page link. Returns the current link when there is one; replace: true issues a new link and turns the old one off.
| Argument | Type | Description |
|---|---|---|
| replace | boolean | Issue a new link even if one exists; the old one stops working |
| expires_at | string | When the new link stops working |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"replace": {
"type": "boolean",
"description": "Issue a new link even if one exists; the old one stops working"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "When the new link stops working"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Deletes a project that was never launched. A launched project cannot be deleted.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Turns the project's client page link off. Anyone holding it sees nothing afterwards.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Searches the directories Submitator submits to, highest Domain Rating first, or reads one by id. Before the agency first buys launches, only the top 20 are shown.
| Argument | Type | Description |
|---|---|---|
| q | string | Part of the name |
| kind | string | article = article platforms, open only through include |
| limit | integer | Rows to return, 25 by default, 50 at most |
| topic | string | |
| cursor | string | next_cursor from the previous page |
| min_dr | integer | Lowest Domain Rating |
| audience | string | |
| requires | string | What the directory asks for |
| directory_id | string | Read this one directory; other filters are ignored |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Part of the name"
},
"kind": {
"enum": [
"directory",
"article"
],
"type": "string",
"description": "article = article platforms, open only through include"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Rows to return, 25 by default, 50 at most"
},
"topic": {
"enum": [
"startups",
"ai_tools",
"saas",
"dev_tools",
"b2b",
"software",
"other"
],
"type": "string"
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "next_cursor from the previous page"
},
"min_dr": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Lowest Domain Rating"
},
"audience": {
"enum": [
"b2b",
"ai",
"directory",
"any"
],
"type": "string"
},
"requires": {
"enum": [
"badge",
"competitors",
"promo_code",
"none"
],
"type": "string",
"description": "What the directory asks for"
},
"directory_id": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Read this one directory; other filters are ignored"
}
}
}The agency-branded badge some directories require on the client's site: its status, a message to forward to the client, and install code for one platform. Call without platform to see the platforms.
| Argument | Type | Description |
|---|---|---|
| platform | string | Platform name from the list, for its install code |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"platform": {
"type": "string",
"maxLength": 40,
"description": "Platform name from the list, for its install code"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}One project in full: status, what it waits for, progress counts, allowance, readiness, texts, images and the image candidates found on its site.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Whether a report is ready, and how to get the file.
| Argument | Type | Description |
|---|---|---|
| report_id* | string | Report id (rep_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"report_id"
],
"properties": {
"report_id": {
"type": "string",
"pattern": "^rep_[0-9A-Za-z]{22}$",
"description": "Report id (rep_...)"
}
}
}The project's client page link (a read-only progress page in the agency's brand), with its views.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Starts submissions and spends one launch of the agency (a test launch with a sbm_test_ key). Call preview_launch with the same arguments first and get the user to agree; confirm_selected is the count they agreed to. With a live key, clients that can ask their user get a confirmation question too.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
| directories | any | "auto" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these |
| auto_replace | boolean | true: within a day the free allowance fills up to 100 with fitting directories, replacing declined ones too. include turns it off unless you send true |
| confirm_selected* | integer | The directory count from preview_launch that the user agreed to |
| excluded_directories | array | Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude} |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"confirm_selected"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
},
"directories": {
"anyOf": [
{
"type": "string",
"const": "auto"
},
{
"type": "object",
"required": [
"include"
],
"properties": {
"include": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"maxItems": 100,
"minItems": 1
}
}
},
{
"type": "object",
"required": [
"exclude"
],
"properties": {
"exclude": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"minItems": 1
}
}
}
],
"description": "\"auto\" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these"
},
"auto_replace": {
"type": "boolean",
"description": "true: within a day the free allowance fills up to 100 with fitting directories, replacing declined ones too. include turns it off unless you send true"
},
"confirm_selected": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The directory count from preview_launch that the user agreed to"
},
"excluded_directories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"description": "Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude}"
}
}
}Changes to projects and listings. The feed keeps 90 days and reads oldest first, so one call scans up to 1,000 events from the cursor (or from the start) and returns the newest ones since `since` (7 days ago by default). Keep next_cursor and pass it next time to read only what came after. For the current state of a project, get_project and list_listings are cheaper.
| Argument | Type | Description |
|---|---|---|
| type | string | A type such as listing.live, or a group: listing.*, project.*, report.* |
| limit | integer | Rows to return, 25 by default, 100 at most |
| since | string | ISO time; 7 days ago by default, none when a cursor is given |
| cursor | string | next_cursor from an earlier call: continues from there |
| project_id | string | Only this project |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"type": {
"type": "string",
"maxLength": 40,
"description": "A type such as listing.live, or a group: listing.*, project.*, report.*"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Rows to return, 25 by default, 100 at most"
},
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "ISO time; 7 days ago by default, none when a cursor is given"
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "next_cursor from an earlier call: continues from there"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Only this project"
}
}
}A project's listings, one per directory, highest DR first, with status and the live link once published. Or one listing in full by its id.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows to return, 25 by default, 50 at most |
| cursor | string | next_cursor from the previous page |
| status | string | |
| directory | string | Only the listing on this directory |
| listing_id | string | Read this one listing instead |
| project_id | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Rows to return, 25 by default, 50 at most"
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "next_cursor from the previous page"
},
"status": {
"enum": [
"pending",
"in_progress",
"action_required",
"submitted",
"live",
"not_accepted",
"cancelled"
],
"type": "string"
},
"directory": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Only the listing on this directory"
},
"listing_id": {
"type": "string",
"pattern": "^lst_[0-9A-Za-z]{22}$",
"description": "Read this one listing instead"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Lists the agency projects, newest first. Find one by name or URL with q, or by your own external_id.
| Argument | Type | Description |
|---|---|---|
| q | string | Part of the name or URL |
| limit | integer | Rows to return, 20 by default, 50 at most |
| cursor | string | next_cursor from the previous page |
| status | string | |
| external_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Part of the name or URL"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Rows to return, 20 by default, 50 at most"
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "next_cursor from the previous page"
},
"status": {
"enum": [
"draft",
"in_progress",
"action_required",
"on_hold",
"completed"
],
"type": "string"
},
"external_id": {
"type": "string",
"maxLength": 100
}
}
}Free dry run of launch_project (or of add_directories on a launched project) with the same arguments: how many directories it would submit to, top and median DR, what is missing, what would unlock more, and what it costs. Show the numbers to the user before launching.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
| directories | any | "auto" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these |
| auto_replace | boolean | true: within a day the free allowance fills up to 100 with fitting directories, replacing declined ones too. include turns it off unless you send true |
| excluded_directories | array | Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude} |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
},
"directories": {
"anyOf": [
{
"type": "string",
"const": "auto"
},
{
"type": "object",
"required": [
"include"
],
"properties": {
"include": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"maxItems": 100,
"minItems": 1
}
}
},
{
"type": "object",
"required": [
"exclude"
],
"properties": {
"exclude": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"minItems": 1
}
}
}
],
"description": "\"auto\" (best matches, highest DR first), {include: [ids]} exactly these, or {exclude: [ids]} auto without these"
},
"auto_replace": {
"type": "boolean",
"description": "true: within a day the free allowance fills up to 100 with fitting directories, replacing declined ones too. include turns it off unless you send true"
},
"excluded_directories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"description": "Replaces the project's whole exclusion list for this request; [] clears it. To leave some out once, use directories: {exclude}"
}
}
}Every catalog directory as seen by one project: suggested (the auto pick), open, locked (with what unlocks it), excluded or listed. Shows suggested, open and locked by default; the counts cover all.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows to return, 50 by default, 100 at most |
| offset | integer | Rows to skip, for the next page |
| states | array | Which states to list; suggested, open and locked by default |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Rows to return, 50 by default, 100 at most"
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Rows to skip, for the next page"
},
"states": {
"type": "array",
"items": {
"enum": [
"listed",
"locked",
"excluded",
"suggested",
"open"
],
"type": "string"
},
"minItems": 1,
"description": "Which states to list; suggested, open and locked by default"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Removes the logo ("logo") or one screenshot (its img_ id). A launched project keeps at least its logo and one screenshot.
| Argument | Type | Description |
|---|---|---|
| image* | any | "logo", or the img_ id of a screenshot |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string",
"const": "logo"
},
{
"type": "string",
"pattern": "^img_[0-9A-Za-z]{22}$",
"description": "Screenshot id (img_...)"
}
],
"description": "\"logo\", or the img_ id of a screenshot"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Sets or replaces a project's logo. A URL is fetched right away (a failed fetch answers image_unreachable); with the npx package a local file inside SUBMITATOR_FILES_DIR (or the folder the server started in) works too.
| Argument | Type | Description |
|---|---|---|
| url* | string | Public image URL: PNG, JPEG, GIF or WebP, 5 MB at most |
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Public image URL: PNG, JPEG, GIF or WebP, 5 MB at most"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Changes project fields. Send only what changes; null clears a field, and a list replaces the whole list. contact_email cannot change after launch, and after launch an edit reaches only the listings not yet sent to their directory.
| Argument | Type | Description |
|---|---|---|
| url | string | |
| name | string | Product name; filled from the site when left out |
| tags | array | Up to 10. Replaces the whole list |
| tagline | any | One-line pitch |
| audience | object | Which audience-restricted directories fit the product |
| category | any | |
| metadata | object | Up to 20 string pairs for the agency. Replaces all of it; {} clears it |
| maker_name | any | Founder or maker name |
| project_id* | string | Project id (prj_...) |
| promo_code | any | Discount code some directories ask for |
| competitors | array | Up to 20, some directories need them. Replaces the whole list: send the current one plus changes |
| external_id | any | The agency's own id for this client |
| launch_date | any | YYYY-MM-DD |
| twitter_url | any | https://x.com/... profile |
| price_period | any | |
| contact_email | any | Email the directories write to; required before launch |
| pricing_model | any | |
| long_description | any | Long description |
| promo_description | any | What the promo code gives |
| short_description | any | Short description |
| price_amount_cents | any | Price in cents |
| excluded_directories | array | Directories never to use for this project. Replaces the whole list (read get_project first); [] clears it |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Product name; filled from the site when left out"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 10,
"description": "Up to 10. Replaces the whole list"
},
"tagline": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "One-line pitch"
},
"audience": {
"type": "object",
"required": [
"b2b",
"ai",
"directory"
],
"properties": {
"ai": {
"type": "boolean"
},
"b2b": {
"type": "boolean"
},
"directory": {
"type": "boolean"
}
},
"description": "Which audience-restricted directories fit the product"
},
"category": {
"anyOf": [
{
"enum": [
"saas",
"ai_tools",
"dev_tools",
"no_code",
"productivity",
"other"
],
"type": "string"
},
{
"type": "null"
}
]
},
"metadata": {
"type": "object",
"description": "Up to 20 string pairs for the agency. Replaces all of it; {} clears it",
"propertyNames": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
"maker_name": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Founder or maker name"
},
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
},
"promo_code": {
"anyOf": [
{
"type": "string",
"maxLength": 50
},
{
"type": "null"
}
],
"description": "Discount code some directories ask for"
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 500
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
}
},
"maxItems": 20,
"description": "Up to 20, some directories need them. Replaces the whole list: send the current one plus changes"
},
"external_id": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "The agency's own id for this client"
},
"launch_date": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
],
"description": "YYYY-MM-DD"
},
"twitter_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"description": "https://x.com/... profile"
},
"price_period": {
"anyOf": [
{
"enum": [
"monthly",
"yearly",
"one_time"
],
"type": "string"
},
{
"type": "null"
}
]
},
"contact_email": {
"anyOf": [
{
"type": "string",
"maxLength": 254
},
{
"type": "null"
}
],
"description": "Email the directories write to; required before launch"
},
"pricing_model": {
"anyOf": [
{
"enum": [
"free",
"freemium",
"paid",
"open_source"
],
"type": "string"
},
{
"type": "null"
}
]
},
"long_description": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"description": "Long description"
},
"promo_description": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"description": "What the promo code gives"
},
"short_description": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"description": "Short description"
},
"price_amount_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Price in cents"
},
"excluded_directories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^dir_[0-9A-Za-z]{22}$",
"description": "Directory id (dir_...)"
},
"description": "Directories never to use for this project. Replaces the whole list (read get_project first); [] clears it"
}
}
}Checks the client's site for the badge now. Up to 10 checks an hour per project, so check once after the client says it is installed.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project id (prj_...) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"pattern": "^prj_[0-9A-Za-z]{22}$",
"description": "Project id (prj_...)"
}
}
}Shows the agency and mode (live or test) behind the key, its permissions, launches left and the hourly request budget. Call it first.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 30, 2026.