Skip to main content
Vepler API Reference

Base URL

All API requests should be made to:
https://api.vepler.com/v1

Headers

Required headers for all requests:
HeaderValueDescription
x-api-keyYOUR_API_KEYYour API key for authentication
Content-Typeapplication/jsonRequest content type
Acceptapplication/jsonExpected response format
X-API-Version1.0API version (optional)

Response Format

All API responses follow a consistent format:

Success Response

{
  "data": {
    // Response data here
  }
}

Error Response

{
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "Property with ID p_0x000123 not found",
    "details": {
      "resource": "property",
      "id": "p_0x000123"
    },
    "request_id": "req_abc123",
    "timestamp": "2024-01-01T12:00:00Z"
  }
}

Pagination

List endpoints support pagination using cursor-based pagination:
const response = await vepler.property.list({
  limit: 20,
  cursor: "eyJpZCI6MTIzfQ"
});

// Response includes:
{
  "data": [...],
  "pagination": {
    "hasMore": true,
    "nextCursor": "eyJpZCI6MTQzfQ",
    "totalCount": 150
  }
}

Filtering

Most list endpoints support filtering:
const properties = await vepler.property.query({
  filters: {
    propertyType: "flat",
    bedrooms: { min: 2, max: 4 },
    price: { max: 500000 },
    location: {
      radius: 2000, // meters
      lat: 51.5074,
      lng: -0.1278
    }
  },
  sort: "price:asc"
});

Field Selection

Optimize response size by selecting specific fields:
const property = await vepler.property.get('UK-123', {
  fields: ['id', 'address', 'price', 'bedrooms']
});

Rate Limiting

API requests are rate limited based on your plan:
PlanRequests/SecondRequests/MonthBurst Limit
Free21,00010
Starter1010,00050
Professional50100,000200
Enterprise500+UnlimitedCustom
Rate limit headers in responses:
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1640995200

Status Codes

CodeDescription
200Success - Request completed successfully
201Created - Resource created successfully
204No Content - Request succeeded with no response body
400Bad Request - Invalid request parameters
401Unauthorized - Invalid or missing API key
403Forbidden - Valid key but insufficient permissions
404Not Found - Requested resource doesn’t exist
409Conflict - Request conflicts with current state
422Unprocessable Entity - Valid request but semantic errors
429Too Many Requests - Rate limit exceeded
500Internal Server Error - Server error
503Service Unavailable - Service temporarily unavailable

Versioning

The API uses URL versioning. The current version is v1.
Breaking changes will result in a new API version. Non-breaking changes may be added to the current version at any time.

Idempotency

For POST requests, include an idempotency key to prevent duplicate operations:
const response = await fetch('https://api.vepler.com/v1/property', {
  method: 'POST',
  headers: {
    'x-api-key': 'YOUR_API_KEY',
    'Idempotency-Key': 'unique-request-id-123'
  },
  body: JSON.stringify(data)
});

Webhooks

Configure webhooks to receive real-time updates:
const webhook = await vepler.webhooks.create({
  url: 'https://yourapp.com/webhooks/vepler',
  events: ['property.updated', 'listing.created'],
  secret: 'whsec_abc123'
});

Available Endpoints

OpenAPI Specification

Download our OpenAPI specification to integrate with your favourite API tools:

Testing

Use our sandbox environment for testing:
import { Vepler } from 'vepler-sdk';

const vepler = new Vepler({
  apiKey: process.env.VEPLER_TEST_KEY,
  baseURL: 'https://sandbox.api.vepler.com'
});

// Sandbox data is reset daily
const testProperty = await vepler.property.get('p_0xTEST123456789');

Contact

For support: hello@vepler.com