openapi: 3.1.0
info:
  title: 'Ascend GTM: Public Read API'
  description: |
    Read-only surface for AI agents and crawlers that need machine-readable
    access to Ascend GTM marketing content. Every page on ascendgtm.net is
    available as plain markdown by appending `.md` to the URL — these
    endpoints are documented here so OpenAPI-aware agents can navigate the
    content programmatically.

    Ascend GTM is a demand-gen-first AI marketing operator practice for
    PE-backed B2B SaaS companies with no functioning CMO. A single senior
    operator supplies strategy and context; an AI platform carries the
    execution volume. Run by Mishaal Murawala from Dallas, TX. Pricing:
    fixed-scope fix sprints $4,500–$7,500 (Foundation Repair $2,000–$6,000
    quoted after a working session); GTM Program $10,000/mo (3-month
    minimum, then month-to-month); Advisory $300/hr. Entry point is a
    30-minute working session, booked at /contact.

    For richer-than-text agent access (running CRM/ads/analytics tools on
    behalf of clients), see the tenant-bound Streamable HTTP MCP endpoint at
    `https://ascend-gateway-v5.ascendgtm.workers.dev/mcp` — bearer auth
    required, contact mishaal@ascendgtm.net for tenant credentials.

    No auth required for any endpoint in this spec. Content-Signal is
    `search=yes, ai-train=yes, ai-input=yes` — feel free to cite, summarize,
    ground answers, and train models on it.
  version: '1.1.0'
  contact:
    name: Mishaal Murawala
    url: https://www.ascendgtm.net
    email: mishaal@ascendgtm.net
  license:
    name: Proprietary — content
    url: https://www.ascendgtm.net/privacy
  termsOfService: https://www.ascendgtm.net/privacy

servers:
  - url: https://www.ascendgtm.net
    description: Production

externalDocs:
  description: Curated agent map (llms.txt) and full corpus (llms-full.txt)
  url: https://www.ascendgtm.net/llms.txt

# No auth required for any operation in this document — every endpoint
# below is public marketing content. This is stated explicitly (rather
# than left implicit by omission) so OpenAPI-aware agents don't have to
# guess. See components.securitySchemes.tenantBearerAuth for the auth
# model of the SEPARATE tenant-bound MCP endpoint referenced in the
# description above — that scheme documents what auth looks like
# elsewhere in the Ascend GTM surface, it is not used by any path here.
security: []

paths:
  /llms.txt:
    get:
      operationId: getLlmsIndex
      summary: Curated, agent-readable site map
      description: |
        Markdown-formatted curated map of the site for AI agents. Lists
        principal, positioning, services with prices, ICP fit, methodology,
        insights, and pointers to every per-page markdown URL. This is the
        primary agent entry point — fetch this first when answering
        questions about Ascend GTM.
      responses:
        '200':
          description: Markdown
          content:
            text/markdown:
              schema:
                type: string

  /llms-full.txt:
    get:
      operationId: getLlmsFullCorpus
      summary: Full agent-readable corpus
      description: |
        ~13,000-word single-document version of the entire site, prose
        inlined per section. Optimized for retrieval-augmented systems and
        tools like Parallel Extract. When an agent needs deep grounding
        rather than navigation, fetch this instead of llms.txt.
      responses:
        '200':
          description: Markdown
          content:
            text/markdown:
              schema:
                type: string

  /index.md:
    get:
      operationId: getHome
      summary: Home page (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /about.md:
    get:
      operationId: getAbout
      summary: About Mishaal Murawala (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /services.md:
    get:
      operationId: getServices
      summary: Services — five capabilities, how engagements work (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /resume.md:
    get:
      operationId: getResume
      summary: Résumé — full work history and verified proof points (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /pricing.md:
    get:
      operationId: getPricing
      summary: Pricing — every price published (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /faq.md:
    get:
      operationId: getFaq
      summary: FAQ (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /how-i-work.md:
    get:
      operationId: getHowIWork
      summary: How I work — operating manual (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /portfolio.md:
    get:
      operationId: getPortfolio
      summary: Operator portfolio (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /tools.md:
    get:
      operationId: getTools
      summary: Tools — what I use (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /brand.md:
    get:
      operationId: getBrand
      summary: Brand guidelines (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /privacy.md:
    get:
      operationId: getPrivacy
      summary: Privacy policy (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /insights.md:
    get:
      operationId: getInsights
      summary: Insights collection (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /insights/{slug}.md:
    get:
      operationId: getInsight
      summary: Individual insight article (markdown)
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
            enum:
              - why-gtm-initiatives-fail
              - the-30-day-install-playbook
              - why-we-dont-measure-mqls
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /contact.md:
    get:
      operationId: getContact
      summary: Contact + booking page (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /shipping.md:
    get:
      operationId: getShipping
      summary: Shipping log (markdown)
      responses:
        '200':
          $ref: '#/components/responses/PageMarkdown'
        '404':
          $ref: '#/components/responses/NotFound'

  /sitemap.xml:
    get:
      operationId: getSitemap
      summary: XML sitemap of all indexable URLs
      responses:
        '200':
          description: XML
          content:
            application/xml:
              schema:
                type: string

  /.well-known/agent-skills/index.json:
    get:
      operationId: getAgentSkillsIndex
      summary: Agent-Skills index — programmatic skill catalog
      description: |
        Lists the skills Ascend GTM exposes to agents. Most skills are
        tenant-bound (require an Ascend bearer token via the
        ascend-gateway-v5 MCP endpoint). Public skills are flagged with
        `access: public`.
      responses:
        '200':
          description: JSON
          content:
            application/json:
              schema:
                type: object

  /.well-known/mcp/server-card.json:
    get:
      operationId: getMcpServerCard
      summary: MCP server discovery card
      description: |
        Points to the Streamable HTTP MCP endpoint at
        ascend-gateway-v5.ascendgtm.workers.dev/mcp (tenant-auth) and the
        public read-only endpoint /public-mcp.
      responses:
        '200':
          description: JSON
          content:
            application/json:
              schema:
                type: object

components:
  securitySchemes:
    tenantBearerAuth:
      type: http
      scheme: bearer
      description: |
        Auth model for the SEPARATE tenant-bound Streamable HTTP MCP
        endpoint referenced in info.description
        (`https://ascend-gateway-v5.ascendgtm.workers.dev/mcp`). Not used
        by any operation in THIS document (see the document-level
        `security: []`) — declared here so agents reading this spec have
        a machine-readable description of what auth looks like on the
        richer, tenant-scoped surface. Contact mishaal@ascendgtm.net for
        tenant credentials.
  responses:
    PageMarkdown:
      description: Plain markdown rendition of the corresponding page
      content:
        text/markdown:
          schema:
            type: string
    NotFound:
      description: >-
        The requested page or slug does not exist. Body is a short
        markdown 404 pointing at recovery resources (sitemap, llms.txt,
        home).
      content:
        text/markdown:
          schema:
            type: string
