Local development workflow for MindTickle sales enablement and readiness API integration. Provides a fast feedback loop with mock training modules, user progress, and coaching data so you can build sales readiness dashboards without needing a live MindTickle instance. Toggle between mock mode for rapid iteration and sandbox mode for validating against the real MindTickle platform.
cp .env.example .env
# Set your credentials:
# MINDTICKLE_API_KEY=mt_xxxxxxxxxxxx
# MINDTICKLE_BASE_URL=https://api.mindtickle.com/v2
# MOCK_MODE=true
npm install express axios dotenv tsx typescript @types/node
npm install -D vitest supertest @types/express
// src/dev/server.ts
import express from "express";
import { createProxyMiddleware } from "http-proxy-middleware";
const app = express();
app.use(express.json());
const MOCK = process.env.MOCK_MODE === "true";
if (!MOCK) {
app.use("/v2", createProxyMiddleware({
target: process.env.MINDTICKLE_BASE_URL,
changeOrigin: true,
headers: { Authorization: `Bearer ${process.env.MINDTICKLE_API_KEY}` },
}));
} else {
const { mountMockRoutes } = require("./mocks");
mountMockRoutes(app);
}
app.listen(3007, () => console.log(`MindTickle dev server on :3007 [mock=${MOCK}]`));
// src/dev/mocks.ts — realistic sales enablement training data
export function mountMockRoutes(app: any) {
app.get("/v2/modules", (_req: any, res: any) => res.json([
{ id: "mod_1", title: "Q4 Product Launch", type: "course", status: "published", enrolledCount: 85, completionRate: 0.72 },
{ id: "mod_2", title: "Objection Handling", type: "coaching", status: "published", enrolledCount: 120, completionRate: 0.58 },
]));
app.get("/v2/users/:id/progress", (req: any, res: any) => res.json({
userId: req.params.id, completedModules: 8, totalModules: 12, averageScore: 82,
recentActivity: [{ moduleId: "mod_1", score: 91, completedAt: "2025-09-10T15:30:00Z" }],
}));
app.get("/v2/leaderboard", (_req: any, res: any) => res.json({
topPerformers: [
{ userId: "usr_1", name: "Sarah Kim", score: 95, modulesCompleted: 12 },
{ userId: "usr_2", name: "James Park", score: 88, modulesCompleted: 10 },
],
}));
app.post("/v2/coaching/sessions", (req: any, res: any) => res.status(201).json({ id: "cs_1", ...req.body, status: "scheduled" }));
}
npm run dev:mock & # Start mock server in background
npm run test # Unit tests with vitest
npm run test -- --watch # Watch mode for rapid iteration
MOCK_MODE=false npm run test:integration # Integration test against real API
null for users who have not started any modulescoachId and learnerId fields/v2/modules?status=draft to test against unpublished content without affecting live userscompletionRate is a decimal (0.72) not a percentage (72) when building dashboards| Issue | Cause | Fix |
|---|---|---|
401 Unauthorized |
Invalid API key | Regenerate at MindTickle admin console |
403 Forbidden |
Key lacks admin scope | Request API access from MindTickle CSM |
404 Not Found |
User or module ID invalid | Fetch list endpoints to verify IDs |
429 Rate Limited |
Too many requests | Add exponential backoff, use mock mode |
ECONNREFUSED :3007 |
Dev server not running | Run npm run dev:mock first |
See mindtickle-debug-bundle.