curl -X GET 'https://your-domain.com/api/programs' \
  -H 'Authorization: Bearer SESSION_TOKEN'
[
  {
    "id": "prog_123456",
    "name": "Computer Science",
    "description": "Bachelor of Science in Computer Science",
    "code": "CS-BS",
    "cipCode": "11.0701",
    "organizationId": "org_789012",
    "courseOrder": ["course_1", "course_2"],
    "metadata": [],
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
]

Overview

The Mapademics API provides programmatic access to your organization’s academic data, enabling you to integrate course information, skills analysis, and job matching capabilities into existing systems like Student Information Systems (SIS), Learning Management Systems (LMS), or custom applications.
The Mapademics API uses RESTful principles with JSON requests and responses. All endpoints require proper authentication and are organization-scoped for data security.

Getting Started

Base URL

All API requests should be made to:
https://your-mapademics-domain.com/api

Authentication Methods

Mapademics supports two primary authentication methods depending on your use case:
Used for public-facing integrations like embeddable widgets where data needs to be accessible without user sessions.Use Cases:
  • Embeddable program widgets
  • Public course catalogs
  • Career pathway displays
Security: Lower security but requires explicit API key

Getting Your API Credentials

1

Locate Your Organization API Key

Your Public API Key is automatically generated when your organization is created. Contact your Mapademics administrator or support team to retrieve it.
Public API keys follow the format: pk_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
2

Set up Authentication Headers

For session-based authentication, you’ll need to implement OAuth or session management with your existing authentication system.
Never expose API keys in client-side code. Use server-side proxy endpoints for secure API access.

Available API Endpoints

Academic Data Endpoints

Programs

curl -X GET 'https://your-domain.com/api/programs' \
  -H 'Authorization: Bearer SESSION_TOKEN'
[
  {
    "id": "prog_123456",
    "name": "Computer Science",
    "description": "Bachelor of Science in Computer Science",
    "code": "CS-BS",
    "cipCode": "11.0701",
    "organizationId": "org_789012",
    "courseOrder": ["course_1", "course_2"],
    "metadata": [],
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
]
Purpose: Retrieve all programs within your organization for curriculum management or catalog integration.

Courses

curl -X GET 'https://your-domain.com/api/courses' \
  -H 'Authorization: Bearer SESSION_TOKEN'
[
  {
    "id": "course_123456",
    "name": "Introduction to Programming",
    "description": "Fundamentals of computer programming",
    "code": "CS101",
    "organizationId": "org_789012",
    "defaultSectionId": "section_987654",
    "syllabusHref": "https://storage.com/syllabus.pdf",
    "skills": [
      {
        "name": "Python Programming",
        "category": "Technical",
        "confidence": 0.95
      }
    ],
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
]
Purpose: Access course data including extracted skills for academic planning and skills mapping.

Courses with Sections

curl -X GET 'https://your-domain.com/api/courses/with-sections' \
  -H 'Authorization: Bearer SESSION_TOKEN'
[
  {
    "id": "course_123456",
    "name": "Introduction to Programming",
    "code": "CS101",
    "courseSections": [
      {
        "id": "section_987654",
        "name": "Fall 2024 - Section A",
        "description": "Morning section",
        "instructor": {
          "id": "instr_111222",
          "name": "Dr. Jane Smith"
        },
        "syllabusHref": "https://storage.com/section-syllabus.pdf",
        "skills": [
          {
            "name": "Python Programming",
            "category": "Technical",
            "confidence": 0.95
          }
        ]
      }
    ]
  }
]
Purpose: Retrieve detailed course structure including sections and instructor assignments for comprehensive academic management.

Instructors

curl -X GET 'https://your-domain.com/api/instructors' \
  -H 'Authorization: Bearer SESSION_TOKEN'
[
  {
    "id": "instr_111222",
    "name": "Dr. Jane Smith",
    "email": "jane.smith@university.edu",
    "details": "Professor of Computer Science with 15 years experience",
    "organizationId": "org_789012",
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
]
Purpose: Access instructor information for faculty management and course assignment workflows.

Job Market Data Endpoints

Custom Jobs

curl -X GET 'https://your-domain.com/api/custom-jobs' \
  -H 'Authorization: Bearer SESSION_TOKEN'
[
  {
    "id": "job_123456",
    "name": "Software Developer",
    "description": "Entry-level software development position",
    "organizationId": "org_789012",
    "employerId": "emp_987654",
    "jobDescriptionHref": "https://storage.com/job-desc.pdf",
    "skills": [
      {
        "name": "JavaScript",
        "category": "Programming Language",
        "confidence": 0.92
      },
      {
        "name": "Problem Solving",
        "category": "Cognitive",
        "confidence": 0.88
      }
    ],
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
]
Purpose: Retrieve job data with extracted skills for career pathway analysis and job matching algorithms.

Widget Integration Endpoints

Program Widget Data

curl -X GET 'https://your-domain.com/api/widget/prog_123456?apiKey=pk_your_api_key' \
  -H 'Access-Control-Allow-Origin: *'
{
  "success": true,
  "data": {
    "programId": "prog_123456",
    "programName": "Computer Science",
    "cipCode": "11.0701",
    "occupations": [
      {
        "id": "15-1252",
        "name": "Software Developers",
        "medianWage": 110140,
        "totalEmployment": 1847900,
        "employmentChange": 0.25,
        "annualOpenings": 189200,
        "degreeRequired": "Bachelor's degree",
        "experienceNeeded": "None"
      }
    ],
    "averages": {
      "medianWage": 95250,
      "totalEmployment": 1205600,
      "employmentChange": 0.18
    }
  }
}
Purpose: Public API endpoint for embedding career outcome widgets in external websites or applications.
apiKey
string
required
Your organization’s public API key starting with pk_
programId
string
required
The unique identifier for the program you want widget data for

Authentication Implementation

Public API Key Authentication

Use this method for widget integrations and public-facing features:
const response = await fetch(`https://your-domain.com/api/widget/${programId}?apiKey=${publicApiKey}`, {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
});

if (!response.ok) {
  throw new Error(`API Error: ${response.status}`);
}

const data = await response.json();

Session-Based Authentication

For internal system integration, implement session management:
// Middleware to validate Mapademics session
const validateMapademicsSession = async (req, res, next) => {
  const sessionToken = req.headers.authorization?.replace('Bearer ', '');
  
  if (!sessionToken) {
    return res.status(401).json({ error: 'No session token provided' });
  }
  
  try {
    // Validate session with your authentication system
    const session = await validateSession(sessionToken);
    req.user = session.user;
    req.organization = session.organization;
    next();
  } catch (error) {
    res.status(401).json({ error: 'Invalid session' });
  }
};

// Protected route example
app.get('/api/courses', validateMapademicsSession, async (req, res) => {
  // Access courses for the authenticated organization
  const courses = await getCourses(req.organization.id);
  res.json(courses);
});

Data Schemas

Core Data Models

Program Schema

id
string
required
Unique identifier for the program (format: prog_xxxxxxxxx)
name
string
required
Display name of the academic program
description
string
Detailed description of the program
code
string
Internal program code used by the institution
cipCode
string
Classification of Instructional Programs (CIP) code for federal reporting
courseOrder
array
Array of course IDs defining the recommended sequence

Skills Schema

skills
array
Array of extracted skills from course content or job descriptions

Error Handling

HTTP Status Codes

The Mapademics API uses standard HTTP status codes to indicate success or failure:

Error Response Format

All API errors return a consistent JSON structure:
{
  "error": "Invalid API key",
  "status": 401,
  "details": {
    "code": "INVALID_API_KEY",
    "message": "The provided API key is invalid or has been revoked",
    "timestamp": "2024-01-15T10:30:00Z"
  }
}

Rate Limiting

The Mapademics API implements rate limiting to ensure fair usage and system stability.

Rate Limit Details

  • Public API (Widget): 1000 requests per hour per API key
  • Private API (Session-based): 5000 requests per hour per organization
  • Bulk Operations: 100 requests per hour per organization

Rate Limit Headers

All API responses include rate limiting information in headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1642248000

Handling Rate Limits

const makeAPIRequest = async (url, options, retries = 3) => {
  try {
    const response = await fetch(url, options);
    
    if (response.status === 429) {
      const resetTime = parseInt(response.headers.get('X-RateLimit-Reset'));
      const waitTime = resetTime * 1000 - Date.now();
      
      if (retries > 0 && waitTime > 0) {
        console.log(`Rate limited. Waiting ${waitTime}ms before retry...`);
        await new Promise(resolve => setTimeout(resolve, waitTime));
        return makeAPIRequest(url, options, retries - 1);
      }
    }
    
    return response;
  } catch (error) {
    console.error('API request failed:', error);
    throw error;
  }
};

Integration Examples

Student Information System (SIS) Integration

Synchronize program and course data with your SIS:
const syncProgramsWithSIS = async () => {
  try {
    // Get programs from Mapademics
    const mapademicsPrograms = await fetch('/api/programs', {
      headers: { 'Authorization': `Bearer ${sessionToken}` }
    }).then(res => res.json());
    
    // Get programs from SIS
    const sisPrograms = await getSISPrograms();
    
    // Sync logic
    for (const mapademicsProgram of mapademicsPrograms) {
      const sisProgram = sisPrograms.find(p => p.cipCode === mapademicsProgram.cipCode);
      
      if (!sisProgram) {
        // Create new program in SIS
        await createProgramInSIS({
          name: mapademicsProgram.name,
          code: mapademicsProgram.code,
          cipCode: mapademicsProgram.cipCode,
          description: mapademicsProgram.description
        });
        console.log(`Created program: ${mapademicsProgram.name}`);
      } else {
        // Update existing program
        await updateProgramInSIS(sisProgram.id, {
          description: mapademicsProgram.description,
          lastSyncDate: new Date().toISOString()
        });
        console.log(`Updated program: ${mapademicsProgram.name}`);
      }
    }
    
    console.log('SIS sync completed successfully');
  } catch (error) {
    console.error('SIS sync failed:', error);
    throw error;
  }
};

// Run sync daily
setInterval(syncProgramsWithSIS, 24 * 60 * 60 * 1000);

Career Services Dashboard

Create a career outcomes dashboard using widget data:
import React, { useState, useEffect } from 'react';

const CareerOutcomesDashboard = ({ programIds, apiKey }) => {
  const [programData, setProgramData] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  
  useEffect(() => {
    const fetchProgramData = async () => {
      try {
        setLoading(true);
        const promises = programIds.map(id => 
          fetch(`/api/widget/${id}?apiKey=${apiKey}`)
            .then(res => res.json())
        );
        
        const results = await Promise.all(promises);
        const validResults = results.filter(result => result.success);
        setProgramData(validResults.map(result => result.data));
        
      } catch (err) {
        setError('Failed to fetch career outcomes data');
        console.error(err);
      } finally {
        setLoading(false);
      }
    };
    
    if (programIds && programIds.length > 0) {
      fetchProgramData();
    }
  }, [programIds, apiKey]);
  
  if (loading) return <div>Loading career outcomes...</div>;
  if (error) return <div>Error: {error}</div>;
  
  return (
    <div className="career-dashboard">
      <h2>Career Outcomes by Program</h2>
      {programData.map(program => (
        <div key={program.programId} className="program-card">
          <h3>{program.programName}</h3>
          <div className="outcomes-grid">
            <div className="outcome-item">
              <label>Median Salary</label>
              <value>${program.averages.medianWage?.toLocaleString()}</value>
            </div>
            <div className="outcome-item">
              <label>Employment Growth</label>
              <value>{(program.averages.employmentChange * 100).toFixed(1)}%</value>
            </div>
            <div className="outcome-item">
              <label>Job Opportunities</label>
              <value>{program.averages.totalEmployment?.toLocaleString()} jobs</value>
            </div>
          </div>
          
          <h4>Top Career Paths</h4>
          {program.occupations.slice(0, 3).map(occupation => (
            <div key={occupation.id} className="occupation-item">
              <span className="occupation-title">{occupation.name}</span>
              <span className="occupation-wage">${occupation.medianWage?.toLocaleString()}</span>
            </div>
          ))}
        </div>
      ))}
    </div>
  );
};

export default CareerOutcomesDashboard;

Security Best Practices

Following security best practices is crucial when integrating with the Mapademics API to protect sensitive academic data.

API Key Security

1

Server-Side Storage

Store API keys securely on your server, never in client-side code or version control.
Environment Variables
# .env file
MAPADEMICS_PUBLIC_API_KEY=pk_your_key_here
MAPADEMICS_SESSION_SECRET=your_session_secret
2

Key Rotation

Implement a key rotation strategy and monitor API key usage for suspicious activity.
Contact support to rotate compromised API keys immediately.
3

Access Control

Limit API access to specific IP addresses or network ranges when possible.

Data Handling

  • Encryption in Transit: All API communication uses HTTPS/TLS encryption
  • Data Minimization: Only request and store data necessary for your use case
  • Access Logging: Log all API requests for security auditing
  • Data Retention: Implement appropriate data retention policies

Troubleshooting

Common Issues

Support & Resources

Getting Help

  • Documentation Issues: Report errors or request additions via your support channel
  • API Questions: Contact technical support with specific endpoint and use case details
  • Integration Assistance: Schedule consultation calls for complex integration projects
  • Feature Requests: Submit requests through your customer success manager

Additional Resources

The Mapademics API is actively developed with new endpoints and features added regularly. Subscribe to API updates through your account settings to stay informed of changes.