Refresh token

/api/token/refresh

Creates new access and refresh tokens

Request format:

        
            {
                "refresh_token": "9ea7b7aa7f7225794..."
            }
        
    

User GET

/api/user

Returns all users.

/api/user/{id}

Returns user.

User POST

/api/user

Returns current user

Empty body

REGISTER POST

/api/register

Creates a user via email and password

Request format:

        
            {
                "email": "string",
                "username": "string",
                "password": "string",

                "role" : "ROLE_EMPLOYER"  ***(optional parameter, logs in as EMPLOYER)***
            }
        
    

LOGIN POST

/api/media/login

Logs in / Creates a user via social media

Request format:

        
            {
                "id": int,
                "media": "string",  ***('google' or 'facebook' value only)***
                "username": "string",

                "role" : "ROLE_EMPLOYER"  ***(optional parameter, logs in as EMPLOYER)***
            }
        
    

/api/user-login

Logs in a user via email and password

Request format:

        
            {
                "email": "string",
                "password": "string",

                "role" : "ROLE_EMPLOYER"  ***(optional parameter, logs in as EMPLOYER)***
            }
        
    

/api/delete-user

Deletes a user (current user will be deleted)

/api/update-email

Updates email and password

Request format:

        
            {
                "email": "string",
                "newPassword": "string",

                "password": "string"  ***((old password) optional parameter, needed only if user already has email and password)***
            }
        
    

/api/update-name

Updates name and surname

Request format:

        
            {
                "name": "string",
                "surname": "string"  ***(optional parameter)***
            }
        
    

/api/media/connect

Connects social media to current user

Request format:

        
            {
                "id": int,
                "media": "string"  ***('google' or 'facebook' value only)***
            }
        
    

/api/upload-avatar

Creates user's avatar

Request format: form-data

        
            "image": file
        
    

/api/notifications-settings

Sets notifications settings

Request format:

        
            {
                "key": "string",  ***('website_notifications', 'email_notifications' or 'email_subscription' value only)***
                "value": boolean
            }
        
    

TELEGRAM

/login/telegram

Logs in / Creates a user via telegram. Optional parameter ?role=ROLE_EMPLOYER

Request format:

Redirect user to this route: /login/telegram

After, user will be redirected to '/' with tokens inside cookies

==========================

/api/connect/telegram

Adds telegram to social media connections

After, user will be redirected to '/'

Request format:

        
            {
                "connect": boolean  ***(true to connect, false to disconnect)***
            }
        
    

APPLICATION EMPLOYEE GET

/employee-application

Returns employee-application teasers

Possible filters:

        
Press for details ?localization=Poland,Krakow,Warsaw &language=en,pl &minExperience={int} // days of experience &maxExperience={int} // days of experience &minAge={int} // years (age) &maxAge={int} // years (age) &age=20-25,40-55 // years (age) &specialization=building,it &skill=building%201 &maxSalary=25 &minSalary=25 &jobType=regular &education=high &gender=sp,male,female

/api/my-employee-application

Returns full Application

Request format: json

        
Press for details { "applicationId": {int} }

APPLICATION EMPLOYEE POST

/api/create-employee-application

Create employee-application

Request format: formData

        
Press for details HTML ( changed '<>' to '{}' ) {form id="create-product" enctype="application/json"} {label for="avatar"}Upload Avatar{/label} {input type="file" name="avatar" id="avatar"> {label for="portfolio"}Upload Portfolio{/label} {input type="file" id="portfolio" name="portfolio[]" multiple accept="image/*"} {label for="relatedAvatar"}Upload Related Avatar{/label} {input type="file" name="relatedAvatar" id="relatedAvatar"} {label for="relatedPortfolio"}Upload Related Portfolio{/label} {input type="file" id="relatedPortfolio" name="relatedPortfolio[]" multiple accept="image/*"} {button type="submit"}Submit{/button} {/form} {script} const experience = [ { name: 'name_1', start: '2025-01-01', end: '2025-02-01' }, { name: 'name_2', start: '2025-03-01', end: 'now' } ]; const relatedApplication = { name: 'related name', surname: 'related surname', birthday: '2025-03-24', annotation: 'related annotation', videoLink: 'https://www.youtube.com/watch=iy5ig4trkfd', gender: 'female', localization: ['Warsaw', 'Poland'], specialization: ['building', 'it'], skills: ['building 1', 'it 1'], education: 'high', jobType: 'regular', experience: JSON.stringify(experience), language: ['en', 'ua'], salary: 60, aboutUser: 'about related user', showContacts: false, phone: 'phone', email: 'email', telegram: 'telegram', facebook: 'facebook', } const language = ['en', 'ua'] const localization = ['Warsaw', 'Poland'] const specialization = ['building', 'it'] const skills = ['building 1', 'it 1'] const createProductForm = document.getElementById('create-product'); createProductForm.addEventListener("submit", async (event) => { event.preventDefault(); const imageFile = createProductForm.querySelector('#avatar').files[0]; const relatedImageFile = createProductForm.querySelector('#relatedAvatar').files[0]; const formData = new FormData(); formData.append("name", 'user name'); formData.append("surname", 'user surname'); formData.append("birthday", '2025-03-24'); formData.append("annotation", 'user annotation'); formData.append("videoLink", 'https://www.youtube.com/watch=iy...'); formData.append("gender", 'sssp'); formData.append("localization", localization); formData.append("specialization", specialization); formData.append("skills", skills); formData.append("education", 'high'); formData.append("jobType", 'regular'); formData.append("experience", JSON.stringify(experience)); formData.append("language", language); formData.append("relatedApplication", JSON.stringify(relatedApplication)); formData.append("salary", 23); formData.append("aboutUser", 'about user text'); formData.append("needHousing", false); formData.append("lookingUrgently", false); formData.append("showContacts", true); formData.append("phone", 'user phone'); formData.append("email", 'user email'); formData.append("telegram", 'user telegram'); formData.append("facebook", 'user facebook'); formData.append("status", true); formData.append("visibility", true); formData.append("avatar", imageFile); formData.append("relatedAvatar", relatedImageFile); const portfolioFiles = document.getElementById('portfolio').files; for (let i = 0; i < portfolioFiles.length; i++) { formData.append('portfolio[]', portfolioFiles[i]); } const relatedPortfolioFiles = document.getElementById('relatedPortfolio').files; for (let i = 0; i < relatedPortfolioFiles.length; i++) { formData.append('relatedPortfolio[]', relatedPortfolioFiles[i]); } try { const response = await fetch("/api/create-employee-application", { method: "POST", headers: { 'Authorization': 'Bearer ' + 'eyJ0eXAiOiJK...' }, body: formData }); if (!response.ok) { throw new Error("error"); } const result = await response.json(); console.log(result); } catch (error) { console.error("error:", error); } }); {/script}

/api/edit-employee-application

Edit employee-application

Request format: formData

        
Press for details HTML ( changed '<>' to '{}' ) {form id="create-product" enctype="application/json"} {label for="avatar"}Upload Avatar{/label} {input type="file" name="avatar" id="avatar"> {label for="portfolio"}Upload Portfolio{/label} {input type="file" id="portfolio" name="portfolio[]" multiple accept="image/*"} {label for="relatedAvatar"}Upload Related Avatar{/label} {input type="file" name="relatedAvatar" id="relatedAvatar"} {label for="relatedPortfolio"}Upload Related Portfolio{/label} {input type="file" id="relatedPortfolio" name="relatedPortfolio[]" multiple accept="image/*"} {button type="submit"}Submit{/button} {/form} {script} const experience = [ { name: 'name_1', start: '2025-01-01', end: '2025-02-01' }, { name: 'name_2', start: '2025-03-01', end: 'now' } ]; const relatedApplication = { name: 'related name', surname: 'related surname', birthday: '2025-03-24', annotation: 'related annotation', videoLink: 'https://www.youtube.com/watch=iy5ig4trkfd', gender: 'female', localization: ['Warsaw', 'Poland'], specialization: ['building', 'it'], skills: ['building 1', 'it 1'], education: 'high', jobType: 'regular', experience: JSON.stringify(experience), language: ['en', 'ua'], salary: 60, aboutUser: 'about related user', showContacts: false, phone: 'phone', email: 'email', telegram: 'telegram', facebook: 'facebook', avatar: "/uploads/user/employee_application/avatar/67f74668e9c96.svg", portfolio: ["/uploads/user/employee_application/avatar/67f74668e9c96.svg", "/uploads/user/employee_application/avatar/67f74668e9c96.svg"] // empty array [] to delete images } const language = ['en', 'ua'] const localization = ['Warsaw', 'Poland'] const specialization = ['building', 'it'] const skills = ['building 1', 'it 1'] const createProductForm = document.getElementById('create-product'); createProductForm.addEventListener("submit", async (event) => { event.preventDefault(); const imageFile = createProductForm.querySelector('#avatar').files[0]; const relatedImageFile = createProductForm.querySelector('#relatedAvatar').files[0]; const formData = new FormData(); formData.append("id", 1); formData.append("name", 'user name'); formData.append("surname", 'user surname'); formData.append("birthday", '2025-03-24'); formData.append("annotation", 'user annotation'); formData.append("videoLink", 'https://www.youtube.com/watch=iy...'); formData.append("gender", 'sp'); formData.append("localization", localization); formData.append("specialization", specialization); formData.append("skills", skills); formData.append("education", 'high'); formData.append("jobType", 'regular'); formData.append("experience", JSON.stringify(experience)); formData.append("language", language); formData.append("relatedApplication", JSON.stringify(relatedApplication)); formData.append("salary", 23); formData.append("aboutUser", 'about user text'); formData.append("needHousing", false); formData.append("lookingUrgently", false); formData.append("showContacts", true); formData.append("phone", 'user phone'); formData.append("email", 'user email'); formData.append("telegram", 'user telegram'); formData.append("facebook", 'user facebook'); formData.append("status", true); formData.append("visibility", true); formData.append("avatar", imageFile); formData.append("relatedAvatar", relatedImageFile); formData.append("avatar", '/uploads/user/employee_application/avatar/67f88154be200.svg'); formData.append("portfolio", ["/uploads/user/employee_application/avatar/67f74668e9c96.svg", "/uploads/user/employee_application/avatar/67f74668e9c96.svg"]); // empty array [] to delete images const portfolioFiles = document.getElementById('portfolio').files; for (let i = 0; i < portfolioFiles.length; i++) { formData.append('portfolio[]', portfolioFiles[i]); } const relatedPortfolioFiles = document.getElementById('relatedPortfolio').files; for (let i = 0; i < relatedPortfolioFiles.length; i++) { formData.append('relatedPortfolio[]', relatedPortfolioFiles[i]); } try { const response = await fetch("/api/edit-employee-application", { method: "POST", headers: { 'Authorization': 'Bearer ' + 'eyJ0eXAiOiJK...' }, body: formData }); if (!response.ok) { throw new Error("error"); } const result = await response.json(); console.log(result); } catch (error) { console.error("error:", error); } }); {/script}

/api/delete-employee-application

Deletes Application

Request format: json

        
Press for details { "applicationId": {int} }

/api/my-employee-application

returns applications of the current user

Empty body

    

/employee-application

Returns application of the user (for spectators)

Request format: json

        
Press for details { "applicationId": {int} }

COMPANY APPLICATION POST

/api/my-company-applications

Returns current user company-application

Empty body

    

/api/create-company-applications

Creates company application

Request format: formData

        
Press for details {form id="create-company-employee" enctype="application/json"} {label for="create-company-employee-avatar"}Upload Avatar{/label} {input type="file" name="create-company-employee-avatar" id="create-company-employee-avatar"} {label for="create-company-employee-avatar2"}Upload Avatar{/label} {input type="file" name="create-company-employee-avatar2" id="create-company-employee-avatar2"} {button type="submit"}Submit{/button} {/form} {script> const companyName = 'company name' const description = 'company description' const addressCity = 'company addressCity' const addressStreet = 'company addressStreet' const phone = 'company phone' const email = 'company email' const telegram = 'company telegram' const name = 'company name' const surname = 'company surname' const birthday = '2000-01-01' const gender = 'male' const status = 'success' const createProductForms = document.getElementById('create-company-employee'); createProductForms.addEventListener("submit", async (event) => { event.preventDefault(); const imageFiles = createProductForms.querySelector('#create-company-employee-avatar').files[0]; const formData = new FormData(); formData.append("applicationId", 4); formData.append("avatar", imageFiles); formData.append("companyName", companyName); formData.append("description", description); formData.append("addressCity", addressCity); formData.append("addressStreet", addressStreet); formData.append("phone", phone); formData.append("email", email); formData.append("telegram", telegram); formData.append("name", name); formData.append("surname", surname); formData.append("birthday", birthday); formData.append("gender", gender); formData.append("status", status); try { const response = await fetch("/api/create-company-applications", { method: "POST", headers: { 'Authorization': 'Bearer ' + 'eyJ0eXAi...' }, body: formData }); if (!response.ok) { throw new Error("Помилка під час надсилання даних"); } const result = await response.json(); console.log(result); } catch (error) { console.error("Помилка:", error); } }) {/script>

/api/edit-company-applications

Edits company application

Request format: formData

        
Press for details {form id="create-company-employee" enctype="application/json"} {label for="create-company-employee-avatar"}Upload Avatar{/label} {input type="file" name="create-company-employee-avatar" id="create-company-employee-avatar"} {label for="create-company-employee-avatar2"}Upload Avatar{/label} {input type="file" name="create-company-employee-avatar2" id="create-company-employee-avatar2"} {button type="submit"}Submit{/button} {/form} {script> const companyName = 'company name' const description = 'company description' const addressCity = 'company addressCity' const addressStreet = 'company addressStreet' const phone = 'company phone' const email = 'company email' const telegram = 'company telegram' const name = 'company name' const surname = 'company surname' const birthday = '2000-01-01' const gender = 'male' const status = 'success' const createProductForms = document.getElementById('create-company-employee'); createProductForms.addEventListener("submit", async (event) => { event.preventDefault(); const imageFiles = createProductForms.querySelector('#create-company-employee-avatar').files[0]; const formData = new FormData(); formData.append("applicationId", 4); formData.append("avatar", imageFiles); formData.append("companyName", companyName); formData.append("description", description); formData.append("addressCity", addressCity); formData.append("addressStreet", addressStreet); formData.append("phone", phone); formData.append("email", email); formData.append("telegram", telegram); formData.append("name", name); formData.append("surname", surname); formData.append("birthday", birthday); formData.append("gender", gender); formData.append("status", status); formData.append("avatar", "/uploads/user/employee_application/avatar/67f8aae1058c5.webp"); try { const response = await fetch("/api/edit-company-applications", { method: "POST", headers: { 'Authorization': 'Bearer ' + 'eyJ0eXAi...' }, body: formData }); if (!response.ok) { throw new Error("Помилка під час надсилання даних"); } const result = await response.json(); console.log(result); } catch (error) { console.error("Помилка:", error); } }) {/script>

/api/delete-company-application

Deletes company application

Request format: json

        
Press for details { "applicationId": {int} }

VACANCY POST

/api/create-vacancy

Creates Vacancy

Request format: formData

        
Press for details {form id="create-vacancy" enctype="application/json"> {div>create vacancy Images{/div> {label for="vacancyAvatar">Upload vacancy Avatar{/label> {input type="file" name="vacancyAvatar" id="vacancyAvatar"> {label for="create-vacancy-portfolio">Upload vacancy images{/label> {input type="file" id="create-vacancy-portfolio" name="create-vacancy-portfolio[]" multiple accept="image/*"> {button type="submit">Submit{/button> {/form> {script> const vacancyName = 'vacancy name' const vacancyType = 'vacancy' const vacancyDescription = 'company addressStreet' const vacancyLocalization = ['Warsaw', 'Krakow'] const vacancySpecialization = ['building', 'it'] const minAge = 20 const maxAge = 30 const vacancyGender = ['male', 'female'] const shift = 3 const vacancySalary = 25 const workHours = 40 const vacancyJobType = 'jobType 1' const vacancyEducation = ['high', 'medium'] const vacancyLanguage = ['en', 'pl'] const visibleContacts = true const isOpen = true const vacancyStatus = 'success' const housing = { rooms: 2, area: 34, videoLinks: ['link1'] } const createVacancy = document.getElementById('create-vacancy'); createVacancy.addEventListener("submit", async (event) => { event.preventDefault(); const vacancyAvatar = createVacancy.querySelector('#vacancyAvatar').files[0]; const formData = new FormData(); formData.append("avatar", vacancyAvatar); formData.append("name", vacancyName); formData.append("vacancyType", vacancyType); formData.append("description", vacancyDescription); formData.append("localization", vacancyLocalization); formData.append("specialization", vacancySpecialization); formData.append("minAge", minAge); formData.append("maxAge", maxAge); formData.append("gender", vacancyGender); formData.append("shift", shift); formData.append("salary", vacancySalary); formData.append("workHours", workHours); formData.append("jobType", vacancyJobType); formData.append("education", vacancyEducation); formData.append("language", vacancyLanguage); formData.append("visibleContacts", visibleContacts); formData.append("isOpen", isOpen); formData.append("status", vacancyStatus); formData.append("housing", JSON.stringify(housing)); const vacancyFiles = document.getElementById('create-vacancy-portfolio').files; for (let i = 0; i < vacancyFiles.length; i++) { formData.append('portfolio[]', vacancyFiles[i]); } try { const response = await fetch("/api/create-vacancy", { method: "POST", headers: { 'Authorization': 'Bearer ' + 'eyJ0eX...' }, body: formData }); if (!response.ok) { throw new Error("error"); } const result = await response.json(); console.log(result); } catch (error) { console.error("error:", error); } }) {/script>

/api/edit-vacancy

edits Vacancy

Request format: formData

        
Press for details {form id="create-vacancy" enctype="application/json"> {div>create vacancy Images{/div> {label for="vacancyAvatar">Upload vacancy Avatar{/label> {input type="file" name="vacancyAvatar" id="vacancyAvatar"> {label for="create-vacancy-portfolio">Upload vacancy images{/label> {input type="file" id="create-vacancy-portfolio" name="create-vacancy-portfolio[]" multiple accept="image/*"> {button type="submit">Submit{/button> {/form> {script> const vacancyName = 'vacancy name' const vacancyType = 'vacancy' const vacancyDescription = 'company addressStreet' const vacancyLocalization = ['Warsaw', 'Krakow'] const vacancySpecialization = ['building', 'it'] const minAge = 20 const maxAge = 30 const vacancyGender = ['male', 'female'] const shift = 3 const vacancySalary = 25 const workHours = 40 const vacancyJobType = 'jobType 1' const vacancyEducation = ['high', 'medium'] const vacancyLanguage = ['en', 'pl'] const visibleContacts = true const isOpen = true const vacancyStatus = 'success' const housing = { rooms: 2, area: 34, videoLinks: ['link1'] portfolio: ["/uploads/user/employee_application/portfolio/67f8aa0c609d6.svg", "/uploads/user/employee_application/portfolio/67f8aa0c60d8d.webp"] // empty array [] to delete images } const createVacancy = document.getElementById('create-vacancy'); createVacancy.addEventListener("submit", async (event) => { event.preventDefault(); const vacancyAvatar = createVacancy.querySelector('#vacancyAvatar').files[0]; const formData = new FormData(); formData.append("applicationId", 5); formData.append("avatar", vacancyAvatar); formData.append("name", vacancyName); formData.append("vacancyType", vacancyType); formData.append("description", vacancyDescription); formData.append("localization", vacancyLocalization); formData.append("specialization", vacancySpecialization); formData.append("minAge", minAge); formData.append("maxAge", maxAge); formData.append("gender", vacancyGender); formData.append("shift", shift); formData.append("salary", vacancySalary); formData.append("workHours", workHours); formData.append("jobType", vacancyJobType); formData.append("education", vacancyEducation); formData.append("language", vacancyLanguage); formData.append("visibleContacts", visibleContacts); formData.append("isOpen", isOpen); formData.append("status", vacancyStatus); formData.append("housing", JSON.stringify(housing)); formData.append("avatar", '/uploads/user/employee_application/avatar/67f8aa0c615ea.svg'); const vacancyFiles = document.getElementById('create-vacancy-portfolio').files; for (let i = 0; i < vacancyFiles.length; i++) { formData.append('portfolio[]', vacancyFiles[i]); } try { const response = await fetch("/api/edit-vacancy", { method: "POST", headers: { 'Authorization': 'Bearer ' + 'eyJ0eX...' }, body: formData }); if (!response.ok) { throw new Error("error"); } const result = await response.json(); console.log(result); } catch (error) { console.error("error:", error); } }) {/script>

/api/delete-vacancy

Deletes vacancy

Request format: json

        
Press for details { "vacancyId": {int} }

/api/my-vacancy

returns current user vacancy (

Request format: json

        
Press for details { "vacancyId": {int} }

/vacancy

returns user vacancy

Request format: json

        
Press for details { "vacancyId": {int} }

/api/my-vacancies

returns user vacancies

empty body

    

/VACANCY GET

/api/vacancies

returns vacancies (with filters)

possible filters

        
Press for details ?localization=Poland,Krakow,Warsaw &language=en,pl &needHousing=true &minAge={int} // years (age) &maxAge={int} // years (age) &specialization=building,it &minSalary=25 &jobType=vacancy &education=high &gender=sp,male,female

APPLICATION_VACANCY POST

/api/send-application

sends an Application to Employer

        
Press for details { "vacancyId": {int} "applicationId": {int} "message": {string} // optional }

APPLICATION_VACANCY POST

/api/invite-application

invites an Application

        
Press for details { "vacancyId": {int} "applicationId": {int} "message": {string} // optional }

APPLICATION_VACANCY POST

/api/cancel-send-application

cancels sending an Application to Employer

        
Press for details { "vacancyId": {int} }

APPLICATION_VACANCY POST

/api/cancel-invite-application

cancels sending an Invitation to Employee

        
Press for details { "applicationId": {int} }

APPLICATION_VACANCY POST

/api/approve-application

approves an Application sent to Employer

        
Press for details { "applicationId": {int} }

APPLICATION_VACANCY POST

/api/reject-application

rejects an Application sent to Employer

        
Press for details { "applicationId": {int} }

APPLICATION_VACANCY POST

/api/approve-invitation

approves an Invitation sent to Employee

        
Press for details { "vacancyId": {int} }

APPLICATION_VACANCY POST

/api/reject-invitation

rejects an Invitation sent to Employee

        
Press for details { "vacancyId": {int} }

APPLICATION_VACANCY POST

/api/vacancy-job-completed

sends proposition to Employer to end the job / ends the job

        
Press for details { "vacancyId": {int} }

APPLICATION_VACANCY POST

/api/application-job-completed

sends proposition to Employee to end the job / ends the job

        
Press for details { "applicationId": {int} }

APPLICATION_VACANCY POST

/api/get-vacancy-status

endpoint for Employee: returns status of interaction with Vacancy

        
Press for details { "vacancyId": {int} }

APPLICATION_VACANCY POST

/api/get-application-status

endpoint for Employer: returns status of interaction with Application

        
Press for details { "applicationId": {int} }

APPLICATION_VACANCY POST

/api/delete-connection/{vacancyApplicationId}

endpoint for testing. ( vacancyApplicationId - (int)id of interaction, can be found here: /api/vacancy-connections or /api/employee-connections )

deletes interaction between application and vacancy

empty body

    

APPLICATION_VACANCY POST

/api/employee-interactions

returns interactions of the Employee

empty body

    

APPLICATION_VACANCY POST

/api/vacancy-interactions

returns interactions of the Employer

empty body