Creates new access and refresh tokens
Request format:
{
"refresh_token": "9ea7b7aa7f7225794..."
}
Returns all users.
Returns user.
Returns current user
Empty body
Creates a user via email and password
Request format:
{
"email": "string",
"username": "string",
"password": "string",
"role" : "ROLE_EMPLOYER" ***(optional parameter, logs in as EMPLOYER)***
}
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)***
}
Logs in a user via email and password
Request format:
{
"email": "string",
"password": "string",
"role" : "ROLE_EMPLOYER" ***(optional parameter, logs in as EMPLOYER)***
}
Deletes a user (current user will be deleted)
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)***
}
Updates name and surname
Request format:
{
"name": "string",
"surname": "string" ***(optional parameter)***
}
Connects social media to current user
Request format:
{
"id": int,
"media": "string" ***('google' or 'facebook' value only)***
}
Creates user's avatar
Request format: form-data
"image": file
Sets notifications settings
Request format:
{
"key": "string", ***('website_notifications', 'email_notifications' or 'email_subscription' value only)***
"value": boolean
}
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
Adds telegram to social media connections
After, user will be redirected to '/'
Request format:
{
"connect": boolean ***(true to connect, false to disconnect)***
}
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
Returns full Application
Request format: json
Press for details
{ "applicationId": {int} }
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}
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}
Deletes Application
Request format: json
Press for details
{ "applicationId": {int} }
returns applications of the current user
Empty body
Returns application of the user (for spectators)
Request format: json
Press for details
{ "applicationId": {int} }
Returns current user company-application
Empty body
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>
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>
Deletes company application
Request format: json
Press for details
{ "applicationId": {int} }
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>
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>
Deletes vacancy
Request format: json
Press for details
{ "vacancyId": {int} }
returns current user vacancy (
Request format: json
Press for details
{ "vacancyId": {int} }
returns user vacancy
Request format: json
Press for details
{ "vacancyId": {int} }
returns user vacancies
empty body
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
sends an Application to Employer
Press for details
{ "vacancyId": {int} "applicationId": {int} "message": {string} // optional }
invites an Application
Press for details
{ "vacancyId": {int} "applicationId": {int} "message": {string} // optional }
cancels sending an Application to Employer
Press for details
{ "vacancyId": {int} }
cancels sending an Invitation to Employee
Press for details
{ "applicationId": {int} }
approves an Application sent to Employer
Press for details
{ "applicationId": {int} }
rejects an Application sent to Employer
Press for details
{ "applicationId": {int} }
approves an Invitation sent to Employee
Press for details
{ "vacancyId": {int} }
rejects an Invitation sent to Employee
Press for details
{ "vacancyId": {int} }
sends proposition to Employer to end the job / ends the job
Press for details
{ "vacancyId": {int} }
sends proposition to Employee to end the job / ends the job
Press for details
{ "applicationId": {int} }
endpoint for Employee: returns status of interaction with Vacancy
Press for details
{ "vacancyId": {int} }
endpoint for Employer: returns status of interaction with Application
Press for details
{ "applicationId": {int} }
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
returns interactions of the Employee
empty body
returns interactions of the Employer
empty body