Prokoi is a comprehensive career development platform that helps users build skills, find jobs, and create personalized learning roadmaps. This documentation provides detailed information about all available API endpoints.
Most endpoints require authentication using a Bearer token. Include the token in the Authorization header:
Authorization: Bearer <your-jwt-token>
http://localhost:8000
- Endpoint:
POST /users/signup - Description: Create a new user account
- Request Body:
{ "full_name": "string", "email": "string", "password_hash": "string", "role": "jobseeker|recruiter" } - Response: User object
- Endpoint:
POST /users/login - Description: Authenticate user and get access token
- Request Body:
{ "email": "string", "password": "string" } - Response: Token object with access token
- Endpoint:
GET /api/skills - Description: Get all global skills
- Response: Array of skill objects
- Endpoint:
GET /api/skills/{skill_id} - Description: Get a specific skill by ID
- Response: Skill object
- Endpoint:
POST /api/skills - Description: Create a new skill (admin only)
- Request Body:
{ "name": "string", "category": "Technical|Soft Skill|Design|Business", "description": "string" } - Response: Created skill object
- Endpoint:
GET /api/users/{user_id}/skills - Description: Get all skills for a specific user
- Response: User skills list response
- Endpoint:
POST /api/users/{user_id}/skills/{skill_id} - Description: Add a skill to a user's profile
- Request Body:
{ "proficiency_level": "Beginner|Intermediate|Advanced|Expert" } - Response: User skill object
- Endpoint:
PUT /api/users/{user_id}/skills/{skill_id} - Description: Update proficiency level for a user's skill
- Request Body:
{ "proficiency_level": "Beginner|Intermediate|Advanced|Expert" } - Response: Updated user skill object
- Endpoint:
DELETE /api/users/{user_id}/skills/{skill_id} - Description: Remove a skill from a user's profile
- Response: Success message
- Endpoint:
GET /api/users/{user_id}/experiences - Description: Get all experiences for a user
- Response: User experiences list response
- Endpoint:
POST /api/users/{user_id}/experiences - Description: Add a new experience to user's profile
- Request Body:
{ "title": "string", "description": "string", "type": "Project|Work|Internship|Freelance|Volunteer", "company": "string", "start_date": "2023-01-01", "end_date": "2023-12-31", "is_current": true } - Response: Created experience object
- Endpoint:
PUT /api/experiences/{experience_id} - Description: Update a user experience
- Request Body:
{ "title": "string", "description": "string", "type": "Project|Work|Internship|Freelance|Volunteer", "company": "string", "start_date": "2023-01-01", "end_date": "2023-12-31", "is_current": true } - Response: Updated experience object
- Endpoint:
DELETE /api/experiences/{experience_id} - Description: Remove an experience from user's profile
- Response: Success message
- Endpoint:
POST /api/ - Description: Create a new job posting (recruiters only)
- Request Body:
{ "title": "string", "company": "string", "location": "string", "is_remote": true, "recommended_experience": "Fresher|Junior|Mid|Senior", "job_type": "Full-time|Part-time|Internship|Freelance|Contract", "description": "string", "requirements": "string", "responsibilities": "string", "salary_range": "string", "application_deadline": "2023-12-31T00:00:00" } - Response: Created job object
- Endpoint:
GET /api/search/{job_id} - Description: Get a specific job by ID
- Response: Job object
- Endpoint:
PUT /api/update/{job_id} - Description: Update a job posting (recruiters only)
- Request Body:
{ "title": "string", "company": "string", "location": "string", "is_remote": true, "recommended_experience": "Fresher|Junior|Mid|Senior", "job_type": "Full-time|Part-time|Internship|Freelance|Contract", "description": "string", "requirements": "string", "responsibilities": "string", "salary_range": "string", "application_deadline": "2023-12-31T00:00:00", "is_active": true } - Response: Updated job object
- Endpoint:
DELETE /api/put/{job_id} - Description: Delete a job posting (recruiters only)
- Response: Success message
- Endpoint:
GET /api/get - Description: Search jobs with filters
- Query Parameters:
search_term: string (optional)location: string (optional)job_type: string (optional)is_remote: boolean (optional)limit: integer (default: 20)offset: integer (default: 0)
- Response: List of jobs
- Endpoint:
POST /api/{job_id}/skills/{skill_id} - Description: Add a skill requirement to a job (recruiters only)
- Response: Success message
- Endpoint:
DELETE /api/{job_id}/skills/{skill_id} - Description: Remove a skill requirement from a job (recruiters only)
- Response: Success message
- Endpoint:
GET /api/{job_id}/skills - Description: Get all skills required for a job
- Response: List of skills
- Endpoint:
POST /api/{job_id}/apply - Description: Apply for a job (jobseekers only)
- Request Body:
{ "cover_letter": "string", "resume_url": "string" } - Response: Job application object
- Endpoint:
GET /api/applications/my - Description: Get all job applications for the current user (jobseekers only)
- Response: List of job applications
- Endpoint:
GET /api/{job_id}/applications - Description: Get all applications for a job (recruiters only)
- Response: List of job applications
- Endpoint:
PUT /api/applications/{application_id}/status - Description: Update job application status (recruiters only)
- Query Parameters:
status: string (pending, reviewed, shortlisted, rejected, accepted)notes: string (optional)
- Response: Updated job application object
- Endpoint:
POST /api/resources/create - Description: Create a new learning resource
- Request Body:
{ "title": "string", "platform": "YouTube|Udemy|Coursera|edX|LinkedIn Learning|Other", "url": "string", "cost": "Free|Paid|Freemium", "description": "string", "duration_hours": 5.5, "difficulty_level": "Beginner|Intermediate|Advanced", "rating": 4.5 } - Response: Created resource object
- Endpoint:
GET /api/resources/get/{resource_id} - Description: Get a specific resource by ID
- Response: Resource object
- Endpoint:
PUT /api/resources/put/{resource_id} - Description: Update a resource
- Request Body:
{ "title": "string", "platform": "YouTube|Udemy|Coursera|edX|LinkedIn Learning|Other", "url": "string", "cost": "Free|Paid|Freemium", "description": "string", "duration_hours": 5.5, "difficulty_level": "Beginner|Intermediate|Advanced", "rating": 4.5, "is_active": true } - Response: Updated resource object
- Endpoint:
DELETE /api/resources/del/{resource_id} - Description: Delete a resource
- Response: Success message
- Endpoint:
GET /api/resources/getall - Description: Get all resources with optional filters
- Query Parameters:
platform: string (optional)cost: string (optional)difficulty_level: string (optional)min_rating: number (optional)limit: integer (default: 20)offset: integer (default: 0)
- Response: List of resources
- Endpoint:
POST /api/resources/{resource_id}/skills/{skill_id} - Description: Add a skill to a resource
- Response: Success message
- Endpoint:
DELETE /api/resources/{resource_id}/skills/{skill_id} - Description: Remove a skill from a resource
- Response: Success message
- Endpoint:
GET /api/resources/{resource_id}/skills - Description: Get all skills for a resource
- Response: List of skills
- Endpoint:
POST /api/resources/{resource_id}/progress/start - Description: Start tracking progress for a resource
- Response: Progress object
- Endpoint:
PUT /api/resources/{resource_id}/progress - Description: Update user progress for a resource
- Request Body:
{ "status": "not_started|in_progress|completed", "progress_percentage": 0, "test_taken": true, "test_score": 85, "test_passed": true } - Response: Updated progress object
- Endpoint:
GET /api/resources/{resource_id}/progress - Description: Get user progress for a specific resource
- Response: Progress object
- Endpoint:
GET /api/resources/progress/my - Description: Get all resources progress for the current user
- Query Parameters:
status: string (optional)limit: integer (default: 20)offset: integer (default: 0)
- Response: List of progress objects
- Endpoint:
POST /api/bookmarks/ - Description: Create a new bookmark
- Request Body:
{ "bookmark_type": "job|resource", "bookmark_id": "string" } - Response: Created bookmark object
- Endpoint:
GET /api/bookmarks/{bookmark_id} - Description: Get a specific bookmark by ID
- Response: Bookmark object
- Endpoint:
DELETE /api/bookmarks/{bookmark_id} - Description: Delete a bookmark by ID
- Response: Success message
- Endpoint:
GET /api/bookmarks/ - Description: Get all bookmarks for the current user
- Query Parameters:
bookmark_type: string (job|resource) (optional)limit: integer (default: 20)offset: integer (default: 0)
- Response: List of bookmarks
- Endpoint:
POST /api/bookmarks/check - Description: Check if a specific item is bookmarked by the current user
- Request Body:
{ "bookmark_type": "job|resource", "bookmark_id": "string" } - Response: Bookmark check response
- Endpoint:
DELETE /api/bookmarks/user/{bookmark_type}/{bookmark_id} - Description: Delete a specific bookmark for the current user
- Response: Success message
- Endpoint:
POST /api/roadmaps/ - Description: Create a new career roadmap
- Request Body:
{ "target_role": "string", "time_frame": 0, "hours_per_week": 0, "summary": "string", "roadmap_data": {} } - Response: Created roadmap object
- Endpoint:
GET /api/roadmaps/{roadmap_id} - Description: Get a specific roadmap by ID
- Response: Roadmap object
- Endpoint:
PUT /api/roadmaps/{roadmap_id} - Description: Update a roadmap
- Request Body:
{ "target_role": "string", "time_frame": 0, "hours_per_week": 0, "summary": "string", "roadmap_data": {} } - Response: Updated roadmap object
- Endpoint:
DELETE /api/roadmaps/{roadmap_id} - Description: Delete a roadmap
- Response: Success message
- Endpoint:
GET /api/roadmaps/ - Description: Get all roadmaps for the current user
- Query Parameters:
limit: integer (default: 20)offset: integer (default: 0)
- Response: List of roadmaps
- Endpoint:
POST /api/skill-tests/ - Description: Create a new skill verification test result
- Request Body:
{ "skill_id": "string", "resource_id": "string", "test_data": {}, "score": 0, "total_questions": 0, "passed": true } - Response: Created test object
- Endpoint:
GET /api/skill-tests/{test_id} - Description: Get a specific test by ID
- Response: Test object
- Endpoint:
DELETE /api/skill-tests/{test_id} - Description: Delete a test by ID
- Response: Success message
- Endpoint:
GET /api/skill-tests/ - Description: Get all tests for the current user
- Query Parameters:
skill_id: string (optional)passed: boolean (optional)limit: integer (default: 20)offset: integer (default: 0)
- Response: List of tests
- Endpoint:
GET /api/skill-tests/skill/{skill_id} - Description: Get all tests for a specific skill for the current user
- Response: List of tests for the skill
- Endpoint:
POST /api/cv-uploads/ - Description: Create a new CV upload record
- Request Body:
{ "file_name": "string", "file_url": "string", "file_type": "string", "extracted_data": {} } - Response: Created CV upload object
- Endpoint:
GET /api/cv-uploads/{upload_id} - Description: Get a specific CV upload by ID
- Response: CV upload object
- Endpoint:
DELETE /api/cv-uploads/{upload_id} - Description: Delete a CV upload by ID
- Response: Success message
- Endpoint:
GET /api/cv-uploads/ - Description: Get all CV uploads for the current user
- Query Parameters:
limit: integer (default: 20)offset: integer (default: 0)
- Response: List of CV uploads
- Endpoint:
POST /api/cv-notes/ - Description: Create or update CV notes for the current user
- Request Body:
{ "notes": "string" } - Response: CV notes object
- Endpoint:
GET /api/cv-notes/ - Description: Get CV notes for the current user
- Response: CV notes object
- Endpoint:
PUT /api/cv-notes/{note_id} - Description: Update CV notes by ID
- Request Body:
{ "notes": "string" } - Response: Updated CV notes object
- Endpoint:
DELETE /api/cv-notes/{note_id} - Description: Delete CV notes by ID
- Response: Success message
- Endpoint:
POST /run-learning-recommendations - Description: Generate personalized learning recommendations using AI
- Request Body:
{ "input": "string", "user_id": "string" } - Response: AI-generated recommendations
All endpoints follow standard HTTP status codes:
200: Success201: Created400: Bad Request401: Unauthorized403: Forbidden404: Not Found500: Internal Server Error
Error responses follow this format:
{
"detail": "Error message"
}The API implements rate limiting to prevent abuse. Exceeding the limit will result in a 429 (Too Many Requests) response.
For API support, contact the development team or refer to the project documentation.