{
 "openapi": "3.1.0",
 "info": {
  "title": "MultiGroupPoster product info API",
  "version": "1.0.0",
  "summary": "Read-only facts about MultiGroupPoster: prices, limits, MCP connection details and a docs search.",
  "description": "MultiGroupPoster is a Chrome extension that posts one post to many Facebook groups from the user's own browser session. This API only returns public product facts (the same ones on https://multiplegroupposter.com/docs/). It takes no actions, needs no key and stores nothing. To act for a person (prepare or publish posts), use the MCP server at https://mcp.multiplegroupposter.com/mcp, which needs OAuth and the person's approval in their extension; see https://multiplegroupposter.com/auth.md.",
  "contact": {
   "name": "MultiGroupPoster support",
   "email": "support@multiplegroupposter.com",
   "url": "https://multiplegroupposter.com/docs/"
  }
 },
 "externalDocs": {
  "url": "https://multiplegroupposter.com/docs/",
  "description": "MultiGroupPoster documentation"
 },
 "servers": [
  {
   "url": "https://multiplegroupposter.com"
  }
 ],
 "security": [],
 "paths": {
  "/api/v1/": {
   "get": {
    "operationId": "getApiIndex",
    "summary": "List the endpoints of this API",
    "description": "Returns the available endpoints and links to the docs and the MCP server.",
    "responses": {
     "200": {
      "description": "API index",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "name": {
           "type": "string"
          },
          "version": {
           "type": "string"
          },
          "read_only": {
           "type": "boolean"
          },
          "endpoints": {
           "type": "object",
           "additionalProperties": {
            "type": "string"
           }
          },
          "openapi": {
           "type": "string"
          },
          "docs": {
           "type": "string"
          },
          "mcp_server": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "405": {
      "description": "Not a GET request",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/pricing/": {
   "get": {
    "operationId": "getPricing",
    "summary": "Get plans and prices",
    "description": "Free plan (6 posts, one time, no card), Pro Monthly and Pro Annual prices in USD, what Pro adds, the refund rule (once per customer, within 7 days of the first payment) and how to cancel (email support).",
    "responses": {
     "200": {
      "description": "Pricing facts",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Pricing"
        }
       }
      }
     },
     "503": {
      "description": "Facts temporarily unavailable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/limits/": {
   "get": {
    "operationId": "getLimits",
    "summary": "Get product limits",
    "description": "Posts per day (200), default and custom pacing, media per post, comment, buy and sell listing, group import, scheduled post and MCP limits.",
    "responses": {
     "200": {
      "description": "Limits",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "description": "Limits grouped by area; every number is enforced by the extension or the MCP server.",
         "properties": {
          "updated": {
           "type": "string",
           "format": "date"
          },
          "posts_per_day": {
           "type": "object",
           "properties": {
            "limit": {
             "type": "integer"
            },
            "day": {
             "type": "string"
            },
            "all_plans": {
             "type": "boolean"
            },
            "over_limit": {
             "type": "string"
            }
           }
          },
          "media": {
           "type": "object"
          },
          "comments": {
           "type": "object"
          },
          "buy_and_sell": {
           "type": "object"
          },
          "pacing_default": {
           "type": "object"
          },
          "pacing_custom": {
           "type": "object"
          },
          "mcp": {
           "type": "object"
          },
          "docs": {
           "type": "string",
           "format": "uri"
          }
         },
         "additionalProperties": true
        }
       }
      }
     },
     "503": {
      "description": "Facts temporarily unavailable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/mcp/": {
   "get": {
    "operationId": "getMcpInfo",
    "summary": "Get MCP server connection details",
    "description": "Endpoint, transport, OAuth details, tools and how posting works for the MultiGroupPoster MCP server.",
    "responses": {
     "200": {
      "description": "MCP connection info",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "name": {
           "type": "string"
          },
          "endpoint": {
           "type": "string",
           "format": "uri"
          },
          "transport": {
           "type": "string"
          },
          "auth": {
           "type": "object"
          },
          "tools": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "name": {
              "type": "string"
             },
             "read_only": {
              "type": "boolean"
             },
             "note": {
              "type": "string"
             }
            }
           }
          },
          "posting": {
           "type": "string"
          },
          "docs": {
           "type": "string",
           "format": "uri"
          }
         },
         "additionalProperties": true
        }
       }
      }
     },
     "503": {
      "description": "Facts temporarily unavailable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/docs/": {
   "get": {
    "operationId": "searchDocs",
    "summary": "Search the documentation",
    "description": "Keyword search over the docs pages in one language. Returns the best pages with their URL, Markdown copy, short answer and matching lines.",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "description": "A few keywords, e.g. \"refund\", \"post as page\", \"200 a day\".",
      "schema": {
       "type": "string",
       "minLength": 1,
       "maxLength": 200
      }
     },
     {
      "name": "locale",
      "in": "query",
      "required": false,
      "description": "Language of the docs.",
      "schema": {
       "type": "string",
       "enum": [
        "en",
        "es",
        "pt",
        "fr",
        "pl"
       ],
       "default": "en"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "How many results (1-10).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10,
       "default": 5
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Search results",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "query",
          "locale",
          "results"
         ],
         "properties": {
          "query": {
           "type": "string"
          },
          "locale": {
           "type": "string"
          },
          "updated": {
           "type": "string"
          },
          "hint": {
           "type": "string"
          },
          "results": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string"
             },
             "url": {
              "type": "string",
              "format": "uri"
             },
             "markdown": {
              "type": "string",
              "format": "uri"
             },
             "summary": {
              "type": "string"
             },
             "matches": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "score": {
              "type": "number"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Missing or invalid parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "503": {
      "description": "Facts temporarily unavailable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/ask": {
   "get": {
    "operationId": "nlwebAskGet",
    "summary": "Ask a question (NLWeb v0.55)",
    "description": "Natural-language question about MultiGroupPoster. Answers with the matching docs pages (same index as /api/v1/docs/). No key.",
    "parameters": [
     {
      "name": "query",
      "in": "query",
      "required": true,
      "description": "The question, e.g. \"how much does it cost\".",
      "schema": {
       "type": "string",
       "minLength": 1,
       "maxLength": 300
      }
     },
     {
      "name": "lang",
      "in": "query",
      "required": false,
      "description": "Language of the docs.",
      "schema": {
       "type": "string",
       "enum": [
        "en",
        "es",
        "pt",
        "fr",
        "pl"
       ],
       "default": "en"
      }
     },
     {
      "name": "streaming",
      "in": "query",
      "required": false,
      "description": "true for Server-Sent Events.",
      "schema": {
       "type": "boolean",
       "default": false
      }
     },
     {
      "name": "mode",
      "in": "query",
      "required": false,
      "description": "list, or list,summarize to add a SearchSummary quoted from the best page.",
      "schema": {
       "type": "string",
       "default": "list"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10,
       "default": 5
      }
     }
    ],
    "responses": {
     "200": {
      "description": "NLWeb answer (or a NO_RESULTS failure, HTTP 200 as NLWeb asks). With streaming: SSE events start, result, complete.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NLWebAnswer"
        }
       },
       "text/event-stream": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "400": {
      "description": "NLWeb failure",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NLWebFailure"
        }
       }
      }
     },
     "503": {
      "description": "NLWeb failure",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NLWebFailure"
        }
       }
      }
     }
    }
   },
   "post": {
    "operationId": "nlwebAsk",
    "summary": "Ask a question (NLWeb v0.55)",
    "description": "NLWeb ask request body: query.text required; prefer.streaming, prefer.mode, prefer[\"accept-language\"] optional.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "query"
        ],
        "properties": {
         "query": {
          "type": "object",
          "required": [
           "text"
          ],
          "properties": {
           "text": {
            "type": "string",
            "maxLength": 300
           },
           "site": {
            "type": "string"
           }
          }
         },
         "context": {
          "type": "object"
         },
         "prefer": {
          "type": "object",
          "properties": {
           "streaming": {
            "type": "boolean"
           },
           "mode": {
            "type": "string"
           },
           "response_format": {
            "type": "string",
            "enum": [
             "conversational_search"
            ]
           },
           "accept-language": {
            "type": "string"
           }
          }
         },
         "meta": {
          "type": "object",
          "properties": {
           "version": {
            "type": "string"
           }
          }
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "NLWeb answer (or a NO_RESULTS failure, HTTP 200 as NLWeb asks). With streaming: SSE events start, result, complete.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NLWebAnswer"
        }
       },
       "text/event-stream": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "400": {
      "description": "NLWeb failure",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NLWebFailure"
        }
       }
      }
     },
     "503": {
      "description": "NLWeb failure",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NLWebFailure"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "object",
      "required": [
       "code",
       "message",
       "hint"
      ],
      "properties": {
       "code": {
        "type": "string",
        "description": "Machine-readable error code, e.g. not_found, missing_query, bad_locale, method_not_allowed, unavailable."
       },
       "message": {
        "type": "string"
       },
       "hint": {
        "type": "string",
        "description": "What to do next."
       },
       "docs": {
        "type": "string",
        "format": "uri"
       },
       "openapi": {
        "type": "string",
        "format": "uri"
       }
      }
     }
    }
   },
   "Pricing": {
    "type": "object",
    "properties": {
     "product": {
      "type": "string"
     },
     "currency": {
      "type": "string"
     },
     "updated": {
      "type": "string",
      "format": "date"
     },
     "plans": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string",
         "enum": [
          "free",
          "pro_monthly",
          "pro_annual"
         ]
        },
        "name": {
         "type": "string"
        },
        "price": {
         "type": "number"
        },
        "period": {
         "type": [
          "string",
          "null"
         ]
        },
        "posts": {
         "type": [
          "integer",
          "string"
         ]
        },
        "shares": {
         "type": [
          "integer",
          "string"
         ]
        }
       }
      }
     },
     "pro_adds": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "refund": {
      "type": "object"
     },
     "cancel": {
      "type": "object"
     },
     "install_url": {
      "type": "string",
      "format": "uri"
     },
     "docs": {
      "type": "string",
      "format": "uri"
     }
    },
    "additionalProperties": true
   },
   "NLWebAnswer": {
    "type": "object",
    "required": [
     "_meta",
     "results"
    ],
    "properties": {
     "_meta": {
      "type": "object",
      "required": [
       "response_type",
       "version"
      ],
      "properties": {
       "response_type": {
        "type": "string",
        "enum": [
         "answer",
         "failure"
        ]
       },
       "response_format": {
        "type": "string"
       },
       "version": {
        "type": "string",
        "example": "0.55"
       }
      }
     },
     "results": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "@type": {
         "type": "string"
        },
        "url": {
         "type": "string",
         "format": "uri"
        },
        "name": {
         "type": "string"
        },
        "site": {
         "type": "string"
        },
        "score": {
         "type": "number"
        },
        "description": {
         "type": "string"
        },
        "schema_object": {
         "type": "object"
        }
       }
      }
     }
    }
   },
   "NLWebFailure": {
    "type": "object",
    "required": [
     "_meta",
     "error"
    ],
    "properties": {
     "_meta": {
      "type": "object",
      "properties": {
       "response_type": {
        "type": "string",
        "enum": [
         "failure"
        ]
       },
       "version": {
        "type": "string"
       }
      }
     },
     "error": {
      "type": "object",
      "required": [
       "code",
       "message"
      ],
      "properties": {
       "code": {
        "type": "string",
        "example": "INVALID_QUERY"
       },
       "message": {
        "type": "string"
       },
       "hint": {
        "type": "string"
       }
      }
     }
    }
   }
  }
 }
}
