Skip to content

API Reference Overview

Welcome to the Menon Mobility API documentation. Our REST API enables you to integrate with the platform programmatically for vehicle marketplace operations.

API Overview

The Menon Mobility API allows you to:

  • Listings: Create, read, update, and delete vehicle listings
  • Search: Query vehicles with advanced filters and faceted search
  • Categories & Brands: Access vehicle taxonomy data with specifications
  • Sellers: Retrieve seller profiles, listings, and reviews
  • Messages: Send and receive messages between buyers and sellers
  • Favorites & Comparisons: Manage user favorite lists and vehicle comparisons
  • Subscriptions: Manage subscription plans and billing
  • Notifications: Access user notifications and alerts
  • Webhooks: Receive real-time event notifications

Base URL

All API requests should be made to:

Production: https://api.menonmobility.com/v1
Sandbox:    https://sandbox-api.menonmobility.com/v1

For local development, the API runs at:

http://localhost:5001/api

Authentication

The API supports two authentication methods:

MethodUse CaseHeader Format
JWT TokenUser-authenticated requestsAuthorization: Bearer <jwt_token>
API KeyServer-to-server integrationsX-API-Key: <api_key>

See Authentication for detailed setup instructions.

Quick Start

1. Get API Credentials

For JWT Authentication:

bash
POST /api/auth/login
Content-Type: application/json

{
  "email": "your@email.com",
  "password": "your_password"
}

For API Keys:

  1. Go to Dashboard > Settings > API
  2. Click "Generate API Key"
  3. Copy your key (shown once)

2. Make Your First Request

bash
# List active vehicle listings
curl -X GET "https://api.menonmobility.com/api/listings" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"

3. Handle Response

json
{
  "success": true,
  "data": {
    "listings": [
      {
        "id": "clx1234567890",
        "title": "2022 Volvo FH 500 Euro 6",
        "slug": "2022-volvo-fh-500-euro-6",
        "price": 85000,
        "currency": "EUR",
        "year": 2022,
        "mileage": 180000,
        "status": "ACTIVE"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 150,
      "totalPages": 8
    }
  }
}

API Endpoint Groups

Public Endpoints (No Auth Required)

Endpoint GroupBase PathDescription
Listings/api/listingsBrowse public listings
Search/api/searchSearch with filters
Categories/api/categoriesCategory taxonomy
Brands/api/brandsBrand and model data
Sellers/api/sellers/:slugPublic seller profiles
Subscriptions/api/subscriptions/plansAvailable plans

Authenticated Endpoints (JWT Required)

Endpoint GroupBase PathDescription
Auth/api/authLogin, register, profile
Favorites/api/favoritesSaved listings
Comparisons/api/comparisonsVehicle comparisons
Messages/api/messagesMessaging system
Notifications/api/notificationsUser notifications

Seller Endpoints (SELLER Role Required)

Endpoint GroupBase PathDescription
Seller Dashboard/api/seller/dashboardSeller analytics
Seller Listings/api/seller/listingsManage listings
Bulk Import/api/seller/bulk-importCSV/XML import
Message Templates/api/seller/message-templatesQuick responses
Team/api/seller/teamTeam management
Webhooks/api/seller/webhooksEvent subscriptions

Admin Endpoints (ADMIN Role Required)

Endpoint GroupBase PathDescription
Admin Dashboard/api/admin/dashboardPlatform stats
User Management/api/admin/usersUser CRUD
Listing Moderation/api/admin/listingsApprove/reject
Category Admin/api/admin/categoriesManage categories
Brand Admin/api/admin/brandsManage brands
Settings/api/admin/settingsPlatform config
Translations/api/admin/translationsLanguage content

Response Format

Success Response

json
{
  "success": true,
  "data": {
    // Response payload
  },
  "message": "Optional success message"
}

Error Response

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Validation failed",
    "details": [
      {
        "field": "price",
        "message": "Price must be a positive number"
      }
    ]
  }
}

Paginated Response

json
{
  "success": true,
  "data": {
    "items": [...],
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 150,
      "totalPages": 8,
      "hasMore": true
    }
  }
}

HTTP Status Codes

CodeDescriptionCommon Causes
200SuccessRequest completed successfully
201CreatedResource created successfully
204No ContentSuccessful deletion
400Bad RequestInvalid request body or parameters
401UnauthorizedMissing or invalid authentication
403ForbiddenInsufficient permissions
404Not FoundResource does not exist
409ConflictResource already exists
422UnprocessableValidation error
429Rate LimitedToo many requests
500Server ErrorInternal server error

Rate Limiting

API requests are rate-limited to ensure fair usage:

Endpoint TypeLimitWindow
Authentication10 requests15 minutes
Public Listings60 requests1 minute
Search30 requests1 minute
Seller Operations120 requests1 minute
File Uploads20 requests1 minute

Rate limit headers are included in all responses:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 55
X-RateLimit-Reset: 1642248000

Pagination

List endpoints support pagination with these parameters:

ParameterTypeDescriptionDefault
pageintegerPage number (1-based)1
limitintegerItems per page (max 100)20
sortstringSort fieldcreatedAt
orderstringSort direction: asc or descdesc

Example:

bash
GET /api/listings?page=2&limit=50&sort=price&order=asc

Filtering

Most list endpoints support filtering via query parameters:

bash
# Filter listings by multiple criteria
GET /api/listings?category=trucks&brand=volvo&minPrice=50000&maxPrice=100000&year=2020

# Search with text query
GET /api/search?q=volvo+fh+500&category=trucks

Caching

Many endpoints support caching:

EndpointCache Duration
Categories5 minutes
Brands5 minutes
Single Listing2 minutes
Listing List1 minute
Search1 minute
Search Suggestions30 seconds

The Cache-Control header indicates cache duration for each response.

Versioning

The API is versioned via URL path:

  • Current version: v1 (implied in /api/ prefix)
  • Explicit version: /api/v1/ (for external API access)

We maintain backwards compatibility within major versions. Breaking changes will be announced with a deprecation period.

SDKs & Libraries

Official SDKs

  • JavaScript/Node.js: npm install @menonmobility/sdk
  • Python: pip install menonmobility
  • PHP: composer require menonmobility/sdk

JavaScript Example

javascript
const MenonMobility = require('@menonmobility/sdk');

const client = new MenonMobility({
  apiKey: process.env.MENON_API_KEY
});

// List trucks under EUR 100,000
const listings = await client.listings.list({
  category: 'trucks',
  maxPrice: 100000,
  limit: 10
});

// Search for Volvo vehicles
const results = await client.search({
  q: 'Volvo FH',
  category: 'trucks'
});

cURL Examples

bash
# Get all categories
curl -X GET "https://api.menonmobility.com/api/categories"

# Search listings
curl -X GET "https://api.menonmobility.com/api/search?q=volvo&category=trucks"

# Get single listing by slug
curl -X GET "https://api.menonmobility.com/api/listings/2022-volvo-fh-500"

Sandbox Environment

Test your integration without affecting production data:

https://sandbox-api.menonmobility.com/api

Sandbox features:

  • Isolated test environment
  • Test API keys (generate from sandbox dashboard)
  • No real transactions or payments
  • Reset data on demand
  • Full feature parity with production

Error Handling

Common Error Codes

CodeDescriptionResolution
INVALID_TOKENJWT token is invalidRe-authenticate
TOKEN_EXPIREDJWT token has expiredRefresh token
INVALID_API_KEYAPI key is invalidCheck key
RATE_LIMITEDToo many requestsWait and retry
VALIDATION_ERRORInvalid input dataCheck request body
NOT_FOUNDResource not foundVerify ID/slug
FORBIDDENInsufficient permissionsCheck user role
LISTING_LIMIT_EXCEEDEDPlan limit reachedUpgrade plan

Retry Strategy

For transient errors (5xx, 429), implement exponential backoff:

javascript
async function fetchWithRetry(url, options, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      const response = await fetch(url, options);
      if (response.ok) return response.json();
      if (response.status === 429 || response.status >= 500) {
        await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
        continue;
      }
      throw new Error(`HTTP ${response.status}`);
    } catch (error) {
      if (i === retries - 1) throw error;
    }
  }
}

Support

Getting Help

  • Documentation: This API reference
  • Status Page: status.menonmobility.com
  • Technical Support: api-support@menonmobility.com
  • Developer Forum: community.menonmobility.com

Reporting Issues

When reporting API issues, include:

  1. Request ID (from response headers if available)
  2. Endpoint called (method + URL)
  3. Request body (redact sensitive data)
  4. Response received
  5. Expected behavior
  6. Timestamp of the request

Commercial Vehicle Marketplace