Skip to main content

Overview

The Profiles API manages freelancer profile information, including skills, languages, and professional descriptions. These endpoints help freelancers showcase their expertise to potential clients.

Queries

getSkills

Retrieve all available skills in the system (public endpoint). Input Parameters: None Response: Array of skill objects ordered alphabetically by name. Example:
const allSkills = await trpc.profile.getSkills.query();

getUserSkills

Get all skills associated with the authenticated user. Input Parameters: None (uses authenticated user from context) Response:
id
string
Skill ID
name
string
Skill name (e.g., “React”, “Node.js”)
value
string
URL-friendly slug
level
string
Proficiency level: beginner, intermediate, advanced, or expert
Example:
const mySkills = await trpc.profile.getUserSkills.query();

for (const skill of mySkills) {
  console.log(`${skill.name}: ${skill.level}`);
}

getLanguages

Retrieve all available languages in the system (public endpoint). Input Parameters: None Response: Array of language objects ordered alphabetically. Example:
const languages = await trpc.profile.getLanguages.query();

getUserLanguages

Get all languages the authenticated user speaks. Input Parameters: None (uses authenticated user from context) Response:
id
string
Language ID
label
string
Language name (e.g., “English”, “Arabic”)
value
string
Language code
nativeName
string
Native name of the language
level
string
Proficiency level: basic, conversational, fluent, or native_or_bilingual
Example:
const myLanguages = await trpc.profile.getUserLanguages.query();

for (const lang of myLanguages) {
  console.log(`${lang.label} (${lang.nativeName}): ${lang.level}`);
}

getUserDescription

Get the professional description for the authenticated user. Input Parameters: None (uses authenticated user from context) Response:
description
string
User’s professional description/bio
Example:
const profile = await trpc.profile.getUserDescription.query();
console.log(profile.description);

Mutations

addSkill

Add a new skill to the authenticated user’s profile. Input Parameters:
name
string
required
Skill name
level
enum
required
Proficiency level:
  • beginner: Just starting out
  • intermediate: Some experience
  • advanced: Extensive experience
  • expert: Mastery level
Response:
success
boolean
Operation success status
user
object
Created skill object
Example:
const result = await trpc.profile.addSkill.mutate({
  name: "React",
  level: "expert"
});

console.log("Skill added:", result.user);

updateSkill

Update an existing skill’s name or proficiency level. Input Parameters:
id
string
required
Skill ID to update
name
string
required
Updated skill name
level
enum
required
Updated proficiency level: beginner, intermediate, advanced, or expert
Response:
success
boolean
Operation success status
user
object
Updated skill object
Example:
await trpc.profile.updateSkill.mutate({
  id: "skill_clxxx...",
  name: "React.js",
  level: "expert"
});

removeSkill

Remove a skill from the user’s profile. Input Parameters:
id
string
required
Skill ID to remove
Response:
success
boolean
Operation success status
Example:
await trpc.profile.removeSkill.mutate({ 
  id: "skill_clxxx..." 
});

addLanguage

Add a language to the user’s profile. Input Parameters:
id
string
required
Language ID from the languages table
level
enum
required
Proficiency level:
  • basic: Basic understanding
  • conversational: Can hold conversations
  • fluent: Fluent speaker
  • native_or_bilingual: Native or bilingual proficiency
Response:
success
boolean
Operation success status
user
object
Created user-language association
Example:
// First, get available languages
const languages = await trpc.profile.getLanguages.query();
const arabic = languages.find(l => l.value === "ar");

// Add Arabic to profile
const result = await trpc.profile.addLanguage.mutate({
  id: arabic.id,
  level: "native_or_bilingual"
});

updateLanguage

Update the proficiency level for a language. Input Parameters:
id
string
required
Language ID
level
enum
required
Updated proficiency level: basic, conversational, fluent, or native_or_bilingual
Response:
success
boolean
Operation success status
user
object
Updated user-language association
Example:
await trpc.profile.updateLanguage.mutate({
  id: "lang_clxxx...",
  level: "fluent"
});

removeLanguage

Remove a language from the user’s profile. Input Parameters:
id
string
required
Language ID to remove
Response:
success
boolean
Operation success status
Example:
await trpc.profile.removeLanguage.mutate({ 
  id: "lang_clxxx..." 
});

updateUserDescription

Update the user’s professional description/bio. Input Parameters:
description
string
Professional description (optional, can be empty to clear)
Response: Returns the updated User object. Example:
const updated = await trpc.profile.updateUserDescription.mutate({
  description: `Full-stack developer with 8+ years of experience.
  
Specializing in:
  - React & Next.js
  - Node.js & Express
  - MongoDB & PostgreSQL
  
I help businesses build scalable web applications.`
});

Skill Model

Skill Fields

id
string
Unique skill identifier (CUID)
name
string
Skill name
value
string
URL-friendly slug (auto-generated from name)
status
enum
Skill status: active or inactiveDefault: active
level
string
Proficiency level (beginner, intermediate, advanced, expert)
userId
string
ID of user who has this skill
createdAt
DateTime
Creation timestamp
updatedAt
DateTime
Last update timestamp

Language Model

Language Fields

id
string
Unique language identifier (CUID)
name
string
Language name (e.g., “English”)
nativeName
string
Native name (e.g., “العربية” for Arabic)
value
string
Language code (e.g., “en”, “ar”, “fr”)
createdAt
DateTime
Creation timestamp
updatedAt
DateTime
Last update timestamp

UserLanguages Model

Junction table connecting users to languages:
userId
string
User ID
languageId
string
Language ID
level
string
Proficiency level
Composite Primary Key: [userId, languageId]

Server-Side Functions

getUserLanguages(userId: string)

Fetch all languages for a user with formatted output. Returns: Array of language objects with labels and levels Example:
import { getUserLanguages } from "@/server/api/routers/profile";

const languages = await getUserLanguages("user_clxxx...");

getUserSkills(userId: string)

Fetch all skills for a user. Returns: Array of skill objects Example:
import { getUserSkills } from "@/server/api/routers/profile";

const skills = await getUserSkills("user_clxxx...");

getUserDescription(userId: string)

Fetch user description. Returns: Object with description field Example:
import { getUserDescription } from "@/server/api/routers/profile";

const profile = await getUserDescription("user_clxxx...");

Complete Example: Building a Profile

// 1. Add professional description
await trpc.profile.updateUserDescription.mutate({
  description: "Experienced full-stack developer specializing in modern web technologies"
});

// 2. Add skills
const skills = [
  { name: "React", level: "expert" },
  { name: "Node.js", level: "advanced" },
  { name: "TypeScript", level: "expert" },
  { name: "PostgreSQL", level: "intermediate" }
];

for (const skill of skills) {
  await trpc.profile.addSkill.mutate(skill);
}

// 3. Add languages
const languages = await trpc.profile.getLanguages.query();

const english = languages.find(l => l.value === "en");
const arabic = languages.find(l => l.value === "ar");
const french = languages.find(l => l.value === "fr");

await trpc.profile.addLanguage.mutate({
  id: english.id,
  level: "native_or_bilingual"
});

await trpc.profile.addLanguage.mutate({
  id: arabic.id,
  level: "fluent"
});

await trpc.profile.addLanguage.mutate({
  id: french.id,
  level: "conversational"
});

// 4. View complete profile
const mySkills = await trpc.profile.getUserSkills.query();
const myLanguages = await trpc.profile.getUserLanguages.query();
const myDescription = await trpc.profile.getUserDescription.query();

console.log("Profile complete!");
console.log(`Skills: ${mySkills.length}`);
console.log(`Languages: ${myLanguages.length}`);

Build docs developers (and LLMs) love