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
- Blog APIs
- Category (Holiday Style) APIs
- Destination APIs
- 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
- Thumbnail / Image URLs are already full S3 URLs — no additional prefixing is required.
- Content is returned as raw HTML — render it safely using a trusted HTML sanitizer (e.g.,
DOMPurify).
- Related blogs may be an empty array
[] if no related blogs exist for the given mappings.
- All public endpoints are marked with
@PublicRateLimit() — they do not require an Authorization header.
- Admin endpoints (create, update, list all) do require a valid
Bearer token.
- Rate limiting applies to public endpoints:
30 requests / minute / IP.
- The
thumbImage field in blog create/update accepts a single file only (max 1 image).
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).
- Slug-based endpoints (
/blogs/slug/:slug, /destinations/slug/:slug) are SEO-friendly and should be used for public-facing pages.
- 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 |