Frontend API Consumer Documentation: Blog, Holiday Style & Destination

Base URL: https://high-street-trip-stage-api.oneclicksales.xyz/v1 Note: All endpoints documented below are public (no JWT required) unless otherwise stated.


Table of Contents

  1. Blog APIs
  2. Category (Holiday Style) APIs
  3. Destination APIs
  4. Trip (Itinerary) APIs

Blog APIs

1. List Active Blogs

Returns a lightweight list of all active blogs (minimal fields for cards / listing pages).

Endpoint

GET /blogs/active

Request

Property Type Required Description
No query params or body required

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/blogs/active' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Active blogs fetched successfully.",
  "data": [
    {
      "id": 1,
      "name": "Top 10 Travel Destinations in India",
      "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250101120000_hero.jpg"
    },
    {
      "id": 2,
      "name": "Best Hill Stations for Summer 2025",
      "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250102153000_hillstation.jpg"
    },
    {
      "id": 3,
      "name": "A Complete Guide to Kerala Backwaters",
      "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250103100000_kerala.jpg"
    }
  ]
}

Error Responses

Status Message Description
500 Internal server error Unexpected server error

2. Get Blog Detail

Returns full blog details along with related active blogs.
Related blogs are resolved first by mapped regions, and if none are found, by mapped holiday styles.

Endpoint

GET /blogs/detail/{id}

Path Parameters

Property Type Required Description
id number Yes Blog ID

Request

Property Type Required Description
No query params or body required

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/blogs/detail/1' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Blog detail fetched successfully.",
  "data": {
    "id": 1,
    "title": "Top 10 Travel Destinations in India",
    "slug": "top-10-travel-destinations-in-india",
    "content": "<p>India offers a diverse range of travel experiences...</p>",
    "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250101120000_hero.jpg",
    "isActive": true,
    "createdAt": "2025-01-01T12:00:00.000Z",
    "updatedAt": "2025-01-15T10:30:00.000Z",
    "holidayStyleIds": [1, 3],
    "regionIds": [5, 8, 12],
    "relatedBlogs": [
      {
        "id": 4,
        "name": "Hidden Gems of Rajasthan",
        "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250104110000_rajasthan.jpg"
      },
      {
        "id": 7,
        "name": "Spiritual Journey Through Varanasi",
        "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250107090000_varanasi.jpg"
      }
    ]
  }
}

Response Fields

Field Type Description
id number Blog ID
title string Blog title
slug string URL-safe slug
content string HTML content
thumbnail string | null Full S3 URL of the thumbnail image
isActive boolean Whether the blog is active
createdAt string ISO 8601 creation timestamp
updatedAt string ISO 8601 last-update timestamp
holidayStyleIds number[] IDs of mapped holiday styles (trip categories)
regionIds number[] IDs of mapped region destinations
relatedBlogs array Related active blogs (name + thumbnail only)

Error Responses

Status Message Description
404 Blog not found. Blog with the given ID does not exist
500 Internal server error Unexpected server error

3. Create Blog

Creates a new blog with optional holiday style and region mappings.

Endpoint

POST /blogs

Headers

Header Value Required
Content-Type multipart/form-data Yes
Authorization Bearer <token> Yes (Admin)

Request Body (multipart/form-data)

Property Type Required Description
title string Yes Blog title
content string Yes Blog content (HTML)
thumbImage File No Thumbnail image (max 1)
holidayStyleIds number[] No Array of holiday style (trip category) IDs
regionIds number[] No Array of region destination IDs

cURL

curl -X POST 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/blogs' \
  -H 'Authorization: Bearer <your_admin_token>' \
  -F 'title=My New Blog' \
  -F 'content=<p>This is the blog content.</p>' \
  -F 'holidayStyleIds=1' \
  -F 'holidayStyleIds=3' \
  -F 'regionIds=5' \
  -F 'thumbImage=@/path/to/image.jpg'

Response

Status: 201 Created

{
  "message": "Blog created successfully.",
  "data": {
    "id": 10,
    "title": "My New Blog",
    "slug": "my-new-blog",
    "content": "<p>This is the blog content.</p>",
    "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250101120000_hero.jpg",
    "isActive": true,
    "createdAt": "2025-01-01T12:00:00.000Z",
    "holidayStyleIds": [1, 3],
    "regionIds": [5]
  }
}

Error Responses

Status Message Description
400 Blog slug already exists. A blog with the generated slug already exists
500 Internal server error Unexpected server error

4. Update Blog

Updates an existing blog and its mappings.

Endpoint

PUT /blogs/{id}

Path Parameters

Property Type Required Description
id number Yes Blog ID

Headers

Header Value Required
Content-Type multipart/form-data Yes
Authorization Bearer <token> Yes (Admin)

Request Body (multipart/form-data)

Property Type Required Description
title string No Blog title
content string No Blog content (HTML)
thumbImage File No New thumbnail image (replaces existing)
holidayStyleIds number[] No Array of holiday style IDs (replaces existing)
regionIds number[] No Array of region IDs (replaces existing)

cURL

curl -X PUT 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/blogs/10' \
  -H 'Authorization: Bearer <your_admin_token>' \
  -F 'title=Updated Blog Title' \
  -F 'content=<p>Updated content.</p>' \
  -F 'holidayStyleIds=2' \
  -F 'regionIds=6' \
  -F 'thumbImage=@/path/to/new-image.jpg'

Response

Status: 200 OK

{
  "message": "Blog updated successfully.",
  "data": {
    "id": 10,
    "title": "Updated Blog Title",
    "slug": "updated-blog-title",
    "content": "<p>Updated content.</p>",
    "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250101130000_new.jpg",
    "isActive": true,
    "updatedAt": "2025-01-15T10:30:00.000Z",
    "holidayStyleIds": [2],
    "regionIds": [6]
  }
}

Error Responses

Status Message Description
404 Blog not found. Blog with the given ID does not exist
400 Blog slug already exists. Slug conflict after update
500 Internal server error Unexpected server error

5. Get Blog by Slug

Returns full blog details (without related blogs) using the URL slug.

Endpoint

GET /blogs/slug/{slug}

Path Parameters

Property Type Required Description
slug string Yes Blog slug

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/blogs/slug/top-10-travel-destinations-in-india' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Blog fetched successfully.",
  "data": {
    "id": 1,
    "title": "Top 10 Travel Destinations in India",
    "slug": "top-10-travel-destinations-in-india",
    "content": "<p>India offers a diverse range of travel experiences...</p>",
    "image": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250101120000_hero.jpg",
    "isActive": true,
    "createdAt": "2025-01-01T12:00:00.000Z",
    "updatedAt": "2025-01-15T10:30:00.000Z"
  }
}

Error Responses

Status Message Description
404 Blog not found. Blog with the given slug does not exist

6. List All Blogs (Paginated)

Returns a paginated list of all blogs (active or inactive). Useful for admin listing pages.

Endpoint

GET /blogs

Query Parameters

Property Type Required Default Description
isActive boolean No Filter by active status (true / false)
page number No 1 Page number
limit number No 10 Items per page

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/blogs?isActive=true&page=1&limit=10' \
  -H 'Authorization: Bearer <your_admin_token>'

Response

Status: 200 OK

{
  "message": "Blog list fetched successfully.",
  "data": {
    "blogs": [
      {
        "id": 3,
        "title": "A Complete Guide to Kerala Backwaters",
        "slug": "a-complete-guide-to-kerala-backwaters",
        "image": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250103100000_kerala.jpg",
        "isActive": true,
        "createdAt": "2025-01-03T10:00:00.000Z"
      },
      {
        "id": 2,
        "title": "Best Hill Stations for Summer 2025",
        "slug": "best-hill-stations-for-summer-2025",
        "image": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250102153000_hillstation.jpg",
        "isActive": true,
        "createdAt": "2025-01-02T15:30:00.000Z"
      }
    ],
    "totalCount": 3,
    "page": 1,
    "limit": 10,
    "totalPages": 1
  }
}

Category (Holiday Style) APIs

7. List Active Categories

Lists all active holiday styles (trip categories) with minimal fields.

Endpoint

GET /category/active-list

Request

Property Type Required Description
No query params or body required

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/category/active-list' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Active categories fetched successfully.",
  "data": [
    {
      "id": 1,
      "name": "Adventure",
      "slug": "adventure",
      "description": "Thrilling adventure trips across the globe",
      "image": "https://d3pexkay1bejqx.cloudfront.net/category-images/adventure.jpg"
    },
    {
      "id": 2,
      "name": "Honeymoon",
      "slug": "honeymoon",
      "description": "Romantic getaways for couples",
      "image": "https://d3pexkay1bejqx.cloudfront.net/category-images/honeymoon.jpg"
    },
    {
      "id": 3,
      "name": "Family",
      "slug": "family",
      "description": "Family-friendly holiday packages",
      "image": "https://d3pexkay1bejqx.cloudfront.net/category-images/family.jpg"
    }
  ]
}

8. List All Categories (Admin)

Returns a paginated list of all categories (active and inactive).

Endpoint

GET /category

Query Parameters

Property Type Required Default Description
page number No 1 Page number
limit number No 10 Items per page
isActive boolean No Filter by active status

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/category?page=1&limit=10' \
  -H 'Authorization: Bearer <your_admin_token>'

Response

Status: 200 OK

{
  "message": "Category list fetched successfully.",
  "data": {
    "categories": [
      {
        "id": 1,
        "name": "Adventure",
        "slug": "adventure",
        "description": "Thrilling adventure trips",
        "image": "https://d3pexkay1bejqx.cloudfront.net/category-images/adventure.jpg",
        "isActive": true,
        "createdAt": "2025-01-01T10:00:00.000Z"
      }
    ],
    "totalCount": 1,
    "page": 1,
    "limit": 10,
    "totalPages": 1
  }
}

Destination APIs

9. List Regions

Lists all destination regions (countries and sub-regions).

Endpoint

GET /destinations/regions

Request

Property Type Required Description
No query params or body required

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/destinations/regions' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Regions fetched successfully.",
  "data": [
    {
      "id": 2,
      "name": "India",
      "slug": "india",
      "type": "country"
    },
    {
      "id": 3,
      "name": "Kerala",
      "slug": "kerala",
      "type": "region"
    },
    {
      "id": 4,
      "name": "Rajasthan",
      "slug": "rajasthan",
      "type": "region"
    }
  ]
}

10. List Nested Destinations

Returns a nested tree structure of all destinations: World Area → Countries → Regions.

Endpoint

GET /destinations/nested

Request

Property Type Required Description
No query params or body required

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/destinations/nested' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Nested destinations fetched successfully.",
  "data": [
    {
      "id": 1,
      "name": "Asia",
      "slug": "asia",
      "type": "world_area",
      "countries": [
        {
          "id": 2,
          "name": "India",
          "slug": "india",
          "type": "country",
          "regions": [
            {
              "id": 3,
              "name": "Kerala",
              "slug": "kerala",
              "type": "region"
            },
            {
              "id": 4,
              "name": "Rajasthan",
              "slug": "rajasthan",
              "type": "region"
            }
          ]
        },
        {
          "id": 5,
          "name": "Thailand",
          "slug": "thailand",
          "type": "country",
          "regions": [
            {
              "id": 6,
              "name": "Phuket",
              "slug": "phuket",
              "type": "region"
            }
          ]
        }
      ]
    },
    {
      "id": 7,
      "name": "Europe",
      "slug": "europe",
      "type": "world_area",
      "countries": [
        {
          "id": 8,
          "name": "France",
          "slug": "france",
          "type": "country",
          "regions": [
            {
              "id": 9,
              "name": "Paris",
              "slug": "paris",
              "type": "region"
            }
          ]
        }
      ]
    }
  ]
}

11. Get Destination by Slug

Returns full destination details along with related active blogs.

Endpoint

GET /destinations/slug/{slug}

Path Parameters

Property Type Required Description
slug string Yes Destination slug

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/destinations/slug/india' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Destination details with overview and sections fetched successfully.",
  "data": {
    "id": 2,
    "name": "India",
    "slug": "india",
    "description": "Incredible India",
    "type": "country",
    "parentId": 1,
    "isActive": true,
    "createdAt": "2025-01-01T10:00:00.000Z",
    "updatedAt": "2025-01-10T08:00:00.000Z",
    "overview": {
      "id": 1,
      "description": "India is a diverse country...",
      "media": [
        {
          "id": 1,
          "url": "https://d3pexkay1bejqx.cloudfront.net/destination-media/india-hero.jpg",
          "type": "image"
        }
      ]
    },
    "sections": [
      {
        "id": 1,
        "title": "Highlights",
        "type": "highlights",
        "content": "<p>Key highlights of India...</p>",
        "media": []
      }
    ],
    "relatedBlogs": [
      {
        "id": 1,
        "name": "Top 10 Travel Destinations in India",
        "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250101120000_hero.jpg"
      },
      {
        "id": 3,
        "name": "A Complete Guide to Kerala Backwaters",
        "thumbnail": "https://d3pexkay1bejqx.cloudfront.net/blog-images/20250103100000_kerala.jpg"
      }
    ]
  }
}

Error Responses

Status Message Description
404 Destination not found. Destination with the given slug does not exist

Trip (Itinerary) APIs

12. Get Trips by Category

Lists published, active trips for a given holiday style (category).

Endpoint

GET /itinerary/category/{categoryId}

Path Parameters

Property Type Required Description
categoryId number Yes Trip category (holiday style) ID

Query Parameters

Property Type Required Default Description
page number No 1 Page number
limit number No 10 Items per page

cURL

curl -X GET 'https://high-street-trip-stage-api.oneclicksales.xyz/v1/itinerary/category/1?page=1&limit=10' \
  -H 'accept: application/json'

Response

Status: 200 OK

{
  "message": "Trips fetched successfully.",
  "data": {
    "trips": [
      {
        "id": 1,
        "name": "Golden Triangle Tour",
        "description": "Explore Delhi, Agra, and Jaipur in this classic tour.",
        "bannerImage": "https://d3pexkay1bejqx.cloudfront.net/banner-images/golden-triangle.jpg",
        "perPersonPrice": 25000,
        "currencyType": "INR"
      },
      {
        "id": 2,
        "name": "Kerala Backwaters Retreat",
        "description": "Relax in the serene backwaters of Kerala.",
        "bannerImage": "https://d3pexkay1bejqx.cloudfront.net/banner-images/kerala-backwaters.jpg",
        "perPersonPrice": 18000,
        "currencyType": "INR"
      },
      {
        "id": 3,
        "name": "Himalayan Trekking Adventure",
        "description": "Experience the thrill of trekking in the Himalayas.",
        "bannerImage": "https://d3pexkay1bejqx.cloudfront.net/banner-images/himalayan-trek.jpg",
        "perPersonPrice": 35000,
        "currencyType": "INR"
      }
    ],
    "totalCount": 3,
    "page": 1,
    "limit": 10,
    "totalPages": 1
  }
}

Error Responses

Status Message Description
404 Category not found. Category with the given ID does not exist
500 Internal server error Unexpected server error

Data Types Reference

Blog List Item

interface BlogListItem {
  id: number;
  name: string;
  thumbnail: string | null;
}

Blog Detail

interface BlogDetail {
  id: number;
  title: string;
  slug: string;
  content: string;
  thumbnail: string | null;
  isActive: boolean;
  createdAt: string; // ISO 8601
  updatedAt: string; // ISO 8601
  holidayStyleIds: number[];
  regionIds: number[];
  relatedBlogs: BlogListItem[];
}

Category (Holiday Style)

interface Category {
  id: number;
  name: string;
  slug: string;
  description: string | null;
  image: string | null;
  isActive?: boolean;
}

Nested Destination

interface NestedDestination {
  id: number;
  name: string;
  slug: string;
  type: "world_area" | "country" | "region";
  countries?: NestedDestination[];
  regions?: NestedDestination[];
}

Destination Detail

interface DestinationDetail {
  id: number;
  name: string;
  slug: string;
  description: string | null;
  type: string;
  parentId: number | null;
  isActive: boolean;
  overview?: {
    id: number;
    description: string;
    media: { id: number; url: string; type: string }[];
  };
  sections?: {
    id: number;
    title: string;
    type: string;
    content: string;
    media: { id: number; url: string; type: string }[];
  }[];
  relatedBlogs: BlogListItem[];
}

Trip

interface Trip {
  id: number;
  name: string;
  description: string | null;
  bannerImage: string | null;
  perPersonPrice: number;
  currencyType: string;
}

Notes for Frontend Developers

  1. Thumbnail / Image URLs are already full S3 URLs — no additional prefixing is required.
  2. Content is returned as raw HTML — render it safely using a trusted HTML sanitizer (e.g., DOMPurify).
  3. Related blogs may be an empty array [] if no related blogs exist for the given mappings.
  4. All public endpoints are marked with @PublicRateLimit() — they do not require an Authorization header.
  5. Admin endpoints (create, update, list all) do require a valid Bearer token.
  6. Rate limiting applies to public endpoints: 30 requests / minute / IP.
  7. The thumbImage field in blog create/update accepts a single file only (max 1 image).
  8. holidayStyleIds and regionIds in blog create/update are arrays of numbers. When using multipart/form-data, send them as repeated fields (e.g., holidayStyleIds=1&holidayStyleIds=3).
  9. Slug-based endpoints (/blogs/slug/:slug, /destinations/slug/:slug) are SEO-friendly and should be used for public-facing pages.
  10. Category ID in the trips endpoint refers to the holiday style / trip category ID (e.g., Adventure, Honeymoon, Family).

Endpoint Summary

# Method Endpoint Auth Description
1 GET /blogs/active Public List active blogs
2 GET /blogs/detail/:id Public Blog detail + related blogs
3 POST /blogs Admin Create blog with mappings
4 PUT /blogs/:id Admin Update blog with mappings
5 GET /blogs/slug/:slug Public Blog by slug
6 GET /blogs Admin Paginated blog list
7 GET /category/active-list Public Active holiday styles
8 GET /category Admin All categories (paginated)
9 GET /destinations/regions Public List regions
10 GET /destinations/nested Public Nested destination tree
11 GET /destinations/slug/:slug Public Destination detail + blogs
12 GET /itinerary/category/:categoryId Public Trips by category