Portfolio API
Complete REST API for accessing portfolio data, professional information, and contact functionality with live testing and comprehensive documentation
Thakur Ganeshsingh Journey Site API
RESTful API for the professional portfolio of Thakur Ganeshsingh, a Developer Advocate & Solutions Architect. This API provides endpoints for: - Contact form submissions - Newsletter subscription with Resend integration - LinkedIn OAuth integration and auto-publishing for blog posts - Email notifications to subscribers - Site information retrieval - Navigation data - Security health checks - LLM context data All endpoints include comprehensive security measures including CSRF protection, input validation, rate limiting, and detailed logging. Built with Next.js 15 and TypeScript, deployed with security-first architecture.
http://localhost:3000/apiFast & Reliable
Optimized for speed with CDN caching and 99.9% uptime
CORS Enabled
Use from any frontend application without restrictions
No Authentication
Public endpoints accessible without API keys
Start using the Portfolio API in minutes
Newsletter Subscription
Subscribe to the portfolio newsletter with Resend integration
// Subscribe to newsletter
const response = await fetch('https://journey.thakurganeshsingh.com/api/newsletter', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'john.doe@example.com',
source: 'portfolio-website',
interests: ['blogs', 'projects']
})
});
const result = await response.json();
console.log('Subscription:', result);Subscribe with email validation and welcome email
curl -X POST "https://journey.thakurganeshsingh.com/api/newsletter" \
-H "Content-Type: application/json" \
-d '{
"email": "john.doe@example.com",
"source": "portfolio-website",
"interests": ["blogs", "projects"]
}'Command line newsletter subscription
import requests
# Subscribe to newsletter
response = requests.post(
'https://journey.thakurganeshsingh.com/api/newsletter',
json={
'email': 'john.doe@example.com',
'source': 'api-testing',
'interests': ['blogs', 'projects']
}
)
result = response.json()
print('Newsletter signup:', result['message'])Python newsletter subscription with Resend
Get Site Information
Retrieve comprehensive portfolio and professional information
// Get site information
const response = await fetch('https://journey.thakurganeshsingh.com/api/site-info');
const siteInfo = await response.json();
console.log('Site Info:', siteInfo);Fetch comprehensive site and professional information
curl -X GET "https://journey.thakurganeshsingh.com/api/site-info" \
-H "Accept: application/json" \
-H "User-Agent: MyApp/1.0"Command line request for site information
import requests
# Get site information
response = requests.get(
'https://journey.thakurganeshsingh.com/api/site-info',
headers={'User-Agent': 'MyApp/1.0'}
)
site_info = response.json()
print('Professional Info:', site_info['professional'])Python request for site information
LinkedIn Publishing (Authenticated)
Auto-publish blog posts to LinkedIn with authentication
// Publish blog post to LinkedIn (requires INTERNAL_API_KEY)
const response = await fetch('https://journey.thakurganeshsingh.com/api/linkedin-publish', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_INTERNAL_API_KEY'
},
body: JSON.stringify({
title: 'Building Modern APIs with Next.js',
content: 'Learn how to create scalable and secure APIs...',
url: 'https://journey.thakurganeshsingh.com/blog/modern-apis',
tags: ['nextjs', 'api', 'typescript', 'webdev'],
coverImage: 'https://journey.thakurganeshsingh.com/images/blog/api.jpg'
})
});
const result = await response.json();
console.log('LinkedIn Post:', result.postId);Auto-publish blog posts with professional formatting
curl -X POST "https://journey.thakurganeshsingh.com/api/linkedin-publish" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_INTERNAL_API_KEY" \
-d '{
"title": "Building Modern APIs",
"content": "Complete guide to API development...",
"url": "https://journey.thakurganeshsingh.com/blog/modern-apis",
"tags": ["nextjs", "api", "typescript"]
}'Command line LinkedIn publishing
Email Notifications (Authenticated)
Send email notifications to newsletter subscribers
// Notify subscribers about new content
const response = await fetch('https://journey.thakurganeshsingh.com/api/notify-subscribers', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_INTERNAL_API_KEY'
},
body: JSON.stringify({
type: 'blog',
title: 'New Blog Post: React Server Components',
excerpt: 'Deep dive into React Server Components with practical examples...',
url: 'https://journey.thakurganeshsingh.com/blog/react-server-components',
coverImage: 'https://journey.thakurganeshsingh.com/images/blog/react-sc.jpg'
})
});
const result = await response.json();
console.log('Notifications sent:', result.stats.successful);Send beautiful email notifications with Resend
Submit Contact Form
Send a message through the contact form
// Submit contact form
const contactData = {
name: "John Doe",
email: "john@example.com",
subject: "Collaboration Opportunity",
message: "Hi Ganesh, I'd like to discuss a project..."
};
const response = await fetch('https://journey.thakurganeshsingh.com/api/contact', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(contactData)
});
const result = await response.json();
console.log('Contact Result:', result);Submit a contact form with proper validation
Get Navigation Data
Retrieve site navigation structure for docs or blog
// Get documentation navigation
const docsNav = await fetch('https://journey.thakurganeshsingh.com/api/navigation/docs');
const docsNavData = await docsNav.json();
// Get blog navigation
const blogNav = await fetch('https://journey.thakurganeshsingh.com/api/navigation/blog');
const blogNavData = await blogNav.json();
console.log('Docs Navigation:', docsNavData.navigation);Retrieve navigation structures for building menus
API Endpoints
newsletter
Newsletter subscription and management
LinkedIn OAuth integration and content publishing
/linkedin-authInitiate LinkedIn OAuth flow
/linkedin-callbackLinkedIn OAuth callback handler
/linkedin-statusCheck LinkedIn connection status
/blog-auto-publishGet auto-publish status
/blog-auto-publishAuto-publish blog posts to LinkedIn
/linkedin-publishPublish individual blog post to LinkedIn
publishing
Content publishing and distribution
/blog-auto-publishGet auto-publish status
/blog-auto-publishAuto-publish blog posts to LinkedIn
/linkedin-publishPublish individual blog post to LinkedIn
/linkedin-publishCORS preflight for LinkedIn publishing
notifications
Email notifications and subscriber management
/notify-subscribersSend email notifications to subscribers
/notify-subscribersCORS preflight for notifications
contact
Contact form operations
/contactSubmit contact form
/contactCORS preflight for contact form
navigation
Site navigation and structure
site-info
Portfolio and professional information
/site-infoGet comprehensive site and professional information
security
Security monitoring and health checks
/security/healthSecurity health check endpoint
llm-context
AI/LLM optimized content endpoints
/llm-contextGet LLM-optimized context information
License & Legal
Need Help?
Additional Resources
🔧 Developer Tools
- API Health Check - Live API status monitoring
- OpenAPI Spec - Complete API specification download
📚 Integration Examples
- React Widget Example - Embeddable portfolio components
- AI/LLM Context Usage - Using portfolio data in AI applications
- Contact Form Integration - Various contact form implementations
💡 Use Cases
Portfolio Widgets
Create dynamic widgets for websites, dashboards, or applications that display real-time portfolio information.
AI/LLM Applications
Use the comprehensive context data to build AI applications that understand professional background and capabilities.
Contact Integration
Integrate the secure contact form API into any application with built-in validation and spam protection.
Monitoring & Analytics
Monitor API health and performance for applications that depend on portfolio data.
🚀 Quick Integration
Add this simple script to any website to display portfolio information:
<!DOCTYPE html>
<html>
<head>
<title>Portfolio Integration</title>
<style>
.portfolio-card {
border: 1px solid #ddd;
padding: 20px;
border-radius: 8px;
max-width: 400px;
margin: 20px auto;
font-family: Arial, sans-serif;
}
</style>
</head>
<body>
<div id="portfolio-card" class="portfolio-card">
Loading portfolio information...
</div>
<script>
async function loadPortfolioInfo() {
try {
const response = await fetch('https://journey.thakurganeshsingh.com/api/site-info');
const data = await response.json();
document.getElementById('portfolio-card').innerHTML = `
<h2>${data.name}</h2>
<p><strong>${data.title}</strong></p>
<p>${data.description}</p>
<p><strong>Company:</strong> ${data.personal.currentCompany}</p>
<p><strong>Experience:</strong> ${data.personal.experience}</p>
<p><strong>Location:</strong> ${data.personal.location}</p>
<a href="mailto:${data.personal.email}">Contact</a>
`;
} catch (error) {
document.getElementById('portfolio-card').innerHTML =
'<p>Error loading portfolio information</p>';
}
}
loadPortfolioInfo();
</script>
</body>
</html>
📧 Support & Contact
- Email: thakurg785@thakurganeshsingh.com
- LinkedIn: thakur-ganeshsingh
- GitHub: Portfolio API Issues
For technical questions, bug reports, or feature requests, please reach out via email or connect on LinkedIn.