Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/DincaAlex/unilink/llms.txt

Use this file to discover all available pages before exploring further.

The /jobs/:id route renders the complete profile of a single internship listing. Where the feed card shows a summary, the detail page exposes the full description, a numbered requirements list, and all required skills — plus the primary action for students: applying with a single button click. Company-role accounts see this same page for any listing they have published, and they gain access to the Nueva oferta flow to create new listings.

Fields displayed

The page assembles its content from a single job record. The header metadata strip shows four key facts; the three content cards below it hold the full listing body.

Header metadata strip

FieldDescription
locationCity and workplace string, e.g. "Lima, Híbrido"
salaryFormatted salary string, e.g. "S/ 1,800 / mes"
postedHuman-readable posting age, e.g. "Hace 2 días"
applicantsCurrent number of applicants

Content cards

CardFieldDescription
Descripción del puestodescriptionFull prose description of the role
RequisitosrequirementsNumbered list of requirements
Habilidades requeridasskillsSkill tags displayed as inline badges

Applying to a listing

Students click the Postular button in the top-right corner of the header block. The app calls:
POST /api/applications
Content-Type: application/json

{ "jobId": 4 }
The backend creates an application record and returns it with an initial status of en_revision. The button state updates immediately in the UI to show a Postulación enviada confirmation — no page reload is required.

Duplicate protection

If the same student submits a second request for a job they have already applied to, the API returns the existing application record with HTTP 200 rather than creating a duplicate entry. The frontend’s applyToJob function in AppDataContext also guards the local state: it only appends the new record if no matching jobId already exists in the applications array. See the API — Applications reference for the full request and response schema.

Posting a new listing (empresa role)

Accounts with the empresa role see a Nueva oferta link in the navigation bar. Clicking it opens the form at /jobs/new, which submits to:
POST /api/jobs
x-role: empresa
Content-Type: application/json
The x-role: empresa header is required. Requests without it, or with x-role: estudiante, are rejected by the backend with HTTP 403.

New job form fields

FieldTypeNotes
titlestringJob title
companystringAuto-populated from the company profile (companyName)
typeinterna / externaListing type
modalityPresencial / Híbrido / RemotoWork mode
areastringFunctional area, e.g. "Tecnología"
locationstringe.g. "Lima, Presencial"
salaryNumnumberMonthly salary in soles; formatted automatically as "S/ X / mes"
hoursPerWeeknumberWeekly hours commitment
durationstringContract length, e.g. "6 meses"
deadlinedateApplication deadline in YYYY-MM-DD format
descriptionstringFull role description
requirementsstring[]One requirement per line in the form; stored as a JSON array
benefitsstring[]One benefit per line; stored as a JSON array
skillsstring[]One skill per line; stored as a JSON array
After a successful POST, the user is redirected to the new listing’s detail page at /jobs/:id.

API references

Build docs developers (and LLMs) love