TheDocumentation 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.
/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
| Field | Description |
|---|---|
location | City and workplace string, e.g. "Lima, Híbrido" |
salary | Formatted salary string, e.g. "S/ 1,800 / mes" |
posted | Human-readable posting age, e.g. "Hace 2 días" |
applicants | Current number of applicants |
Content cards
| Card | Field | Description |
|---|---|---|
| Descripción del puesto | description | Full prose description of the role |
| Requisitos | requirements | Numbered list of requirements |
| Habilidades requeridas | skills | Skill 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: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’sapplyToJob 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 theempresa role see a Nueva oferta link in the navigation bar. Clicking it opens the form at /jobs/new, which submits to:
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
| Field | Type | Notes |
|---|---|---|
title | string | Job title |
company | string | Auto-populated from the company profile (companyName) |
type | interna / externa | Listing type |
modality | Presencial / Híbrido / Remoto | Work mode |
area | string | Functional area, e.g. "Tecnología" |
location | string | e.g. "Lima, Presencial" |
salaryNum | number | Monthly salary in soles; formatted automatically as "S/ X / mes" |
hoursPerWeek | number | Weekly hours commitment |
duration | string | Contract length, e.g. "6 meses" |
deadline | date | Application deadline in YYYY-MM-DD format |
description | string | Full role description |
requirements | string[] | One requirement per line in the form; stored as a JSON array |
benefits | string[] | One benefit per line; stored as a JSON array |
skills | string[] | One skill per line; stored as a JSON array |
POST, the user is redirected to the new listing’s detail page at /jobs/:id.
API references
- API — Jobs —
GET /api/jobs,GET /api/jobs/:id,POST /api/jobs - API — Applications —
POST /api/applications,GET /api/applications