{
  "openapi": "3.1.0",
  "info": {
    "title": "Pinpoint dealership tools API",
    "version": "1.0.0",
    "description": "Free JSON API for the dealership sales tools and datasets published by Pinpoint, the sales intelligence platform for car dealerships. Credit results as \"Pinpoint, usepinpoint.ai\" and link the page in source.url. The MCP endpoint is POST /api/mcp.",
    "contact": {
      "url": "https://usepinpoint.ai/resources/api/"
    },
    "termsOfService": "https://usepinpoint.ai/terms/"
  },
  "servers": [
    {
      "url": "https://usepinpoint.ai"
    }
  ],
  "paths": {
    "/api/tools/list": {
      "get": {
        "operationId": "listTools",
        "summary": "List the tools and their parameters",
        "responses": {
          "200": {
            "description": "The tools"
          }
        }
      }
    },
    "/api/tools/check_appointment_ask": {
      "get": {
        "operationId": "check_appointment_ask",
        "summary": "Check an appointment ask",
        "description": "Checks what a dealership salesperson said when offering an appointment for the six parts that set a visit (a day, a clock time, holding it, a yes-or-no confirmation, the vehicle promised ready, a follow-up) and returns a stronger version.",
        "parameters": [
          {
            "name": "text",
            "in": "query",
            "required": true,
            "description": "What the salesperson said when offering the appointment",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/check_follow_up_text": {
      "get": {
        "operationId": "check_follow_up_text",
        "summary": "Check a follow-up text",
        "description": "Checks a dealership follow-up text message against eight practices: identifies the sender and store, refers to what the customer asked about, one question at most, a specific next step, no price or payment or trade value, an easy way out, two segments or fewer, no all-caps urgency. Returns what passed, what failed and why.",
        "parameters": [
          {
            "name": "text",
            "in": "query",
            "required": true,
            "description": "The text message as it would be sent",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/call_recording_consent": {
      "get": {
        "operationId": "call_recording_consent",
        "summary": "Call recording consent by state",
        "description": "Whether one party or every party must consent before a phone call is recorded in a US state, the statute, a note for dealerships, and the greeting, outbound and text notices a dealership should use. All 50 states and DC. General information, not legal advice.",
        "parameters": [
          {
            "name": "state",
            "in": "query",
            "required": true,
            "description": "State name or two-letter abbreviation, for example \"FL\" or \"Florida\"",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dealership",
            "in": "query",
            "required": false,
            "description": "Dealership name for the notices",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rep",
            "in": "query",
            "required": false,
            "description": "Rep first name for the outbound notice",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/ai_caller_disclosure": {
      "get": {
        "operationId": "ai_caller_disclosure",
        "summary": "AI caller disclosure by state",
        "description": "What a US state requires when an automated or AI voice assistant answers a dealership's missed calls or places an approved outbound call: the AI disclosure rule, the consent rule for automated calls, the statute, the federal baseline, and what the assistant should say. All 50 states and DC. General information, not legal advice.",
        "parameters": [
          {
            "name": "state",
            "in": "query",
            "required": true,
            "description": "State name or two-letter abbreviation",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dealership",
            "in": "query",
            "required": false,
            "description": "Dealership name for the scripts",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/follow_up_cadence": {
      "get": {
        "operationId": "follow_up_cadence",
        "summary": "Follow-up cadence for a situation",
        "description": "The follow-up sequence for a dealership sales situation (new internet lead, missed inbound call, unconfirmed appointment, no-show, quote without an appointment, trade question without an appointment, text thread gone quiet, sold first week): each step's day, time, channel, purpose, message with the names filled in, and the reply that stops it.",
        "parameters": [
          {
            "name": "situation",
            "in": "query",
            "required": true,
            "description": "The situation slug",
            "schema": {
              "type": "string",
              "enum": [
                "new-internet-lead",
                "missed-inbound-call",
                "appointment-unconfirmed",
                "no-show",
                "quote-without-appointment",
                "trade-question-without-appointment",
                "text-thread-gone-quiet",
                "sold-first-week"
              ]
            }
          },
          {
            "name": "customer_first_name",
            "in": "query",
            "required": false,
            "description": "The customer's first name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rep",
            "in": "query",
            "required": false,
            "description": "The salesperson's first name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dealership",
            "in": "query",
            "required": false,
            "description": "The dealership name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "day_and_time",
            "in": "query",
            "required": false,
            "description": "The day and time on the table, for example \"Saturday at 12:30\"",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "vehicle",
            "in": "query",
            "required": false,
            "description": "The vehicle of interest",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/roleplay_card": {
      "get": {
        "operationId": "roleplay_card",
        "summary": "Sales roleplay card",
        "description": "A practice card for a dealership sales roleplay: a customer type (twelve, from the price shopper to the callback who went quiet) and an objection (eight, from \"I need to think about it\" to \"just email me the numbers\"): the customer's opening line, what they want and fear, their tells, the objection as the customer says it, the salesperson's goal, what a strong answer sounds like, and the feedback checklist.",
        "parameters": [
          {
            "name": "customer_type",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "price-shopper",
                "payment-shopper",
                "spouse-or-co-buyer",
                "trade-in-anchor",
                "out-of-market-buyer",
                "lease-end-shopper",
                "internet-lead-with-quote",
                "service-customer-upgrading",
                "credit-worried-buyer",
                "specific-vehicle-stock-check",
                "just-looking-caller",
                "quiet-callback"
              ]
            }
          },
          {
            "name": "objection",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "need-to-think-about-it",
                "best-price-over-the-phone",
                "cheaper-somewhere-else",
                "not-ready-to-come-in",
                "talk-to-my-spouse",
                "what-is-my-trade-worth",
                "credit-is-not-great",
                "just-email-me-the-numbers"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/crm_note_checklist": {
      "get": {
        "operationId": "crm_note_checklist",
        "summary": "CRM note checklist",
        "description": "What a complete CRM note carries after a dealership sales call or text thread, in five sections, with an example of a strong note and the lead statuses that mislead managers.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/call_scorecard": {
      "get": {
        "operationId": "call_scorecard",
        "summary": "BDC call scorecard",
        "description": "The eighteen-item pass-or-fail scorecard for a dealership sales call, in five groups (open, discovery, the ask, control, close and record), with the scoring rules and the four-minute review method.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/conversation_signals": {
      "get": {
        "operationId": "conversation_signals",
        "summary": "Conversation signals library",
        "description": "The 40 moments in a dealership sale worth acting on, in six groups (buying signals, appointment handling, follow-up gaps, coaching moments, record gaps, agent handoffs). Without a signal, returns the list; with a signal slug, returns what it sounds like, why it matters, what to do next, how to coach it and how to practice it.",
        "parameters": [
          {
            "name": "signal",
            "in": "query",
            "required": false,
            "description": "A signal slug from the list",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/tools/dealership_glossary": {
      "get": {
        "operationId": "dealership_glossary",
        "summary": "Dealership sales glossary",
        "description": "Plain definitions of 100 terms dealership sales teams use, from appointment set rate and BDC to approved action and human handoff. Returns the matching term, or the closest matches.",
        "parameters": [
          {
            "name": "term",
            "in": "query",
            "required": true,
            "description": "The term or a word in it",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JSON result with a source block crediting Pinpoint"
          },
          "400": {
            "description": "Missing or invalid parameter"
          },
          "404": {
            "description": "Unknown value"
          }
        }
      }
    },
    "/api/ask": {
      "post": {
        "operationId": "ask",
        "summary": "The assistant behind the tools",
        "description": "tool is one of ask-checker, composer, text-check, crm-note, cadence, scorecard, notice, disclosure (with input and optional context), or roleplay and roleplay-feedback (with messages). Twenty requests per address every ten minutes.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tool": {
                    "type": "string"
                  },
                  "input": {
                    "type": "string"
                  },
                  "context": {
                    "type": "string"
                  },
                  "messages": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "role": {
                          "type": "string",
                          "enum": [
                            "user",
                            "assistant"
                          ]
                        },
                        "content": {
                          "type": "string"
                        }
                      }
                    }
                  }
                },
                "required": [
                  "tool"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ text, source }"
          },
          "429": {
            "description": "Too many requests"
          },
          "503": {
            "description": "The assistant is not configured"
          }
        }
      }
    },
    "/api/mcp": {
      "post": {
        "operationId": "mcp",
        "summary": "Model Context Protocol endpoint (Streamable HTTP, stateless, JSON-RPC 2.0)",
        "responses": {
          "200": {
            "description": "JSON-RPC response"
          }
        }
      }
    }
  }
}