Skip to main content

Overview

The Renderer API provides public endpoints for fetching portfolio data. These endpoints are used to display user portfolios without authentication.
Renderer endpoints are public and do NOT require authentication.

Get User Portfolio Data

Fetch complete portfolio data for a user by their username.
GET /api/v1/renderer/:username

Path Parameters

username
string
required
The unique username of the portfolio to fetch

Response

status
boolean
true if user found, false otherwise
message
string
Human-readable status message
data
object
Complete portfolio data object

Example Request

curl -X GET https://api.gitfolio.in/api/v1/renderer/johndoe

Success Response

Status: 200 OK
{
  "status": true,
  "message": "Data fetched",
  "data": {
    "id": "user_123",
    "username": "johndoe",
    "firstname": "John",
    "lastname": "Doe",
    "email": "[email protected]",
    "profileImg": "https://example.com/avatar.jpg",
    "bio": "Full-stack developer passionate about open source",
    "tagline": "Building the future, one commit at a time",
    "location": "San Francisco, CA",
    "website": "https://johndoe.dev",
    "githubLink": "https://github.com/johndoe",
    "followers": 250,
    "following": 100,
    "socialAccounts": {
      "twitter": "https://twitter.com/johndoe",
      "linkedin": "https://linkedin.com/in/johndoe"
    },
    "skills": ["JavaScript", "TypeScript", "React", "Node.js"],
    "accountType": "PREMIUM",
    "activeTemplateId": "template_789",
    "repos": [
      {
        "id": "repo_456",
        "name": "awesome-project",
        "description": "An awesome open source project",
        "topics": ["javascript", "react"],
        "languages": {"JavaScript": 80, "CSS": 20},
        "stars": 150,
        "forks": 25,
        "repoLink": "https://github.com/johndoe/awesome-project",
        "liveLink": "https://awesome-project.com",
        "thumbnail": "https://example.com/project.png",
        "isPinned": true,
        "isIncluded": true
      }
    ],
    "educations": [
      {
        "id": "edu_123",
        "title": "BS in Computer Science",
        "institution": "Stanford University",
        "description": "Focus on AI and software engineering",
        "logo": "https://example.com/stanford.png",
        "start_date": "2018-09",
        "end_date": "2022-06"
      }
    ],
    "experiences": [
      {
        "id": "exp_789",
        "company": "Tech Corp",
        "role": "Senior Software Engineer",
        "description": "Led microservices development",
        "logo": "https://example.com/techcorp.png",
        "start_date": "2022-07",
        "end_date": null
      }
    ],
    "purchasedTemplates": []
  }
}

Error Response

Status: 404 Not Found
{
  "status": false,
  "message": "no user found"
}

Get User Image Data

Fetch image-specific data for a user’s portfolio. This endpoint returns optimized data for generating portfolio preview images or social media cards.
GET /api/v1/renderer/image/:username

Path Parameters

username
string
required
The unique username of the portfolio

Response

status
boolean
true if user found, false otherwise
message
string
Human-readable status message
data
object
Image-optimized portfolio data

Example Request

curl -X GET https://api.gitfolio.in/api/v1/renderer/image/johndoe

Success Response

Status: 200 OK
{
  "status": true,
  "message": "Data fetched",
  "data": {
    "username": "johndoe",
    "firstname": "John",
    "lastname": "Doe",
    "profileImg": "https://example.com/avatar.jpg",
    "tagline": "Building the future, one commit at a time",
    "bio": "Full-stack developer passionate about open source",
    "skills": ["JavaScript", "TypeScript", "React"],
    "activeTemplateId": "template_789"
  }
}

Error Response

Status: 404 Not Found
{
  "status": false,
  "message": "no user found"
}

Use Cases

Portfolio Display

The main renderer endpoint (/renderer/:username) is used to fetch all data needed to display a user’s portfolio:
async function loadPortfolio(username) {
  const response = await fetch(`https://api.gitfolio.in/api/v1/renderer/${username}`);
  const { status, data } = await response.json();
  
  if (status) {
    // Render portfolio with data
    renderPortfolio(data);
  } else {
    // Show 404 page
    show404();
  }
}

Social Media Cards

The image endpoint (/renderer/image/:username) provides optimized data for generating Open Graph images and Twitter cards:
async function generateSocialCard(username) {
  const response = await fetch(
    `https://api.gitfolio.in/api/v1/renderer/image/${username}`
  );
  const { status, data } = await response.json();
  
  if (status) {
    return {
      title: `${data.firstname} ${data.lastname} - Portfolio`,
      description: data.tagline,
      image: data.profileImg,
      skills: data.skills.join(', ')
    };
  }
}

Portfolio Preview

Fetch minimal data for portfolio previews or listings:
async function getPortfolioPreview(username) {
  const response = await fetch(
    `https://api.gitfolio.in/api/v1/renderer/image/${username}`
  );
  const { data } = await response.json();
  
  return {
    name: `${data.firstname} ${data.lastname}`,
    avatar: data.profileImg,
    tagline: data.tagline,
    url: `https://gitfolio.in/${username}`
  };
}

Performance Considerations

Portfolio data changes infrequently. Consider caching responses:
  • Use HTTP caching headers (Cache-Control, ETag)
  • Implement client-side caching for 5-10 minutes
  • Use CDN caching for static portfolio data
The full portfolio endpoint can return large responses. For better performance:
  • Use the /image/:username endpoint when you only need basic info
  • Implement lazy loading for repositories and experiences
  • Consider pagination for users with many repos
Always handle 404 responses gracefully:
  • Show a friendly “Portfolio not found” page
  • Suggest correct username if similar ones exist
  • Provide a link to create a portfolio

Privacy & Visibility

All data returned by renderer endpoints is:
  • Publicly accessible - No authentication required
  • User-controlled - Users choose what to include via isIncluded flags
  • Searchable - Can be indexed by search engines
Users control visibility through:
  • Repository isIncluded field (hide specific repos)
  • Template settings (some templates hide certain sections)
  • Account settings (future: private portfolios)

Build docs developers (and LLMs) love