> ## Documentation Index
> Fetch the complete documentation index at: https://jobo.world/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload a resume

> Attach or replace the resume file on a profile. The stored file is what gets uploaded into application forms that ask for a resume — without one, forms with a required resume field cannot be completed. Uploading here does **not** re-run the AI import; use `POST /api/auto-apply/profiles/import` to build profile data from a resume. Accepts PDF, DOC, DOCX, TXT, RTF, or MD up to 10 MB.



## OpenAPI

````yaml /openapi.yaml put /api/auto-apply/profiles/{id}/resume
openapi: 3.1.0
info:
  title: Jobo Enterprise API
  description: >
    The Jobo Enterprise API provides programmatic access to job listings,
    intelligent search,

    real-time feeds, automated job applications, and geocoding services.
  version: 1.0.0
  contact:
    name: Jobo Support
    url: https://jobo.world
    email: support@jobo.world
servers:
  - url: https://connect.jobo.world
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: Jobs Search
    description: Search and retrieve job listings
  - name: Jobs Feed
    description: Bulk job feeds and expiration tracking
  - name: Career Sites Feed
    description: Bulk feed of newly discovered career sites with enriched company profiles
  - name: Companies
    description: Company profiles and company-scoped job listings
  - name: Auto Apply Profiles
    description: Resume-first applicant profiles that power automated applications
  - name: Auto Apply Applications
    description: >-
      Fully automated job applications — submit asynchronously and poll for the
      outcome
  - name: Auto Apply Sessions
    description: Interactive, step-by-step application sessions with full answer control
  - name: Locations
    description: Geocoding and location services
paths:
  /api/auto-apply/profiles/{id}/resume:
    put:
      tags:
        - Auto Apply Profiles
      summary: Upload a resume
      description: >-
        Attach or replace the resume file on a profile. The stored file is what
        gets uploaded into application forms that ask for a resume — without
        one, forms with a required resume field cannot be completed. Uploading
        here does **not** re-run the AI import; use `POST
        /api/auto-apply/profiles/import` to build profile data from a resume.
        Accepts PDF, DOC, DOCX, TXT, RTF, or MD up to 10 MB.
      operationId: uploadAutoApplyResume
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Profile ID
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: Resume file (PDF, DOC, DOCX, TXT, RTF, or MD; max 10 MB).
      responses:
        '200':
          description: The updated profile, with the new `resume` metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoApplyProfile'
        '400':
          description: Missing or unreadable file
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Profile not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '413':
          description: File exceeds the 10 MB limit
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '415':
          description: >-
            Unsupported file type (upload accepts PDF, DOC, DOCX, TXT, RTF, or
            MD)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '503':
          description: The file store is temporarily unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
components:
  schemas:
    AutoApplyProfile:
      type: object
      description: >-
        A resume-first applicant profile. The resume file is the canonical
        source — importing one fills contact, links, work_experience, education,
        and memories automatically. Explicit sections carry only what a resume
        cannot state (eligibility, preferences, voluntary self-identification).
      properties:
        id:
          type: string
          format: uuid
          description: Stable profile identifier.
          example: 8c5e6d0a-9f2b-4c1e-b7a3-2f4d5e6a7b8c
        name:
          type: string
          description: Friendly profile label.
          example: Default
        status:
          $ref: '#/components/schemas/ProfileStatus'
        import_error:
          type: string
          nullable: true
          description: >-
            Why the resume import failed. Only set when `status` is
            `import_failed`.
          example: null
        contact:
          $ref: '#/components/schemas/ProfileContact'
        location:
          $ref: '#/components/schemas/ProfileLocation'
        links:
          $ref: '#/components/schemas/ProfileLinks'
        work_experience:
          type: array
          items:
            $ref: '#/components/schemas/WorkExperienceEntry'
          description: Work history, most recent first.
        education:
          type: array
          items:
            $ref: '#/components/schemas/EducationEntry'
          description: Education history.
        eligibility:
          $ref: '#/components/schemas/ProfileEligibility'
        preferences:
          $ref: '#/components/schemas/ProfilePreferences'
        self_identification:
          $ref: '#/components/schemas/ProfileSelfIdentification'
        memories:
          type: array
          items:
            type: string
          description: >-
            Freeform facts the AI uses as context when answering screening
            questions. Resume import generates them automatically; you can add
            your own via PATCH.
          example:
            - 8 years of backend engineering experience
            - 'Key skills: Go, Kubernetes, PostgreSQL'
        cover_letter_template:
          type: string
          nullable: true
          description: Optional cover letter template the AI personalizes per job.
          example: null
        resume:
          oneOf:
            - $ref: '#/components/schemas/ProfileResume'
          nullable: true
          description: Resume file metadata, or null when no file has been uploaded.
        created_at:
          type: string
          format: date-time
          description: UTC timestamp the profile was created.
          example: '2026-07-01T12:00:00Z'
        updated_at:
          type: string
          format: date-time
          description: UTC timestamp the profile was last updated.
          example: '2026-07-05T09:30:00Z'
    ProblemDetails:
      type: object
      description: RFC 7807 problem details object returned for error responses.
      properties:
        type:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        status:
          type: integer
          nullable: true
        detail:
          type: string
          nullable: true
        instance:
          type: string
          nullable: true
    ProfileStatus:
      type: string
      description: >-
        Lifecycle of a profile, driven by the async resume import. `ready` —
        complete and usable for applications; `importing` — a resume import is
        building the profile, poll until it leaves this state; `import_failed` —
        the import failed, see `import_error` (fix with `PATCH` or re-import).
      enum:
        - ready
        - importing
        - import_failed
      example: ready
    ProfileContact:
      type: object
      description: >-
        Contact details. `first_name`, `last_name`, and `email` are required on
        create.
      properties:
        first_name:
          type: string
          nullable: true
          description: Legal first name. Required on create; max 100 characters.
          example: Ada
        last_name:
          type: string
          nullable: true
          description: Legal last name. Required on create; max 100 characters.
          example: Lovelace
        preferred_name:
          type: string
          nullable: true
          description: >-
            Preferred / chosen name, when it differs from the legal first name.
            Max 100 characters.
          example: null
        email:
          type: string
          format: email
          nullable: true
          description: Email address applications are submitted with. Required on create.
          example: ada@example.com
        phone:
          type: string
          nullable: true
          description: Phone number, ideally in international format. Max 50 characters.
          example: +1 415 555 0100
        date_of_birth:
          type: string
          format: date
          nullable: true
          description: >-
            ISO date (`YYYY-MM-DD`). Explicit input only — never parsed from the
            resume. Only used when a form explicitly asks for it.
          example: '1990-04-12'
    ProfileLocation:
      type: object
      description: Where the applicant lives. All fields optional.
      properties:
        address_line1:
          type: string
          nullable: true
          description: Street address. Max 200 characters.
          example: 1 Analytical Engine Way
        city:
          type: string
          nullable: true
          description: City. Max 200 characters.
          example: Austin
        state:
          type: string
          nullable: true
          description: State, province, or region. Max 200 characters.
          example: TX
        postal_code:
          type: string
          nullable: true
          description: Postal / ZIP code. Max 20 characters.
          example: '78701'
        country:
          type: string
          nullable: true
          description: Country name. Max 200 characters.
          example: United States
    ProfileLinks:
      type: object
      description: >-
        Public profile links. Each must be an absolute http(s) URL, max 500
        characters.
      properties:
        linkedin:
          type: string
          nullable: true
          description: LinkedIn profile URL.
          example: https://www.linkedin.com/in/ada-lovelace
        github:
          type: string
          nullable: true
          description: GitHub profile URL.
          example: https://github.com/adalovelace
        portfolio:
          type: string
          nullable: true
          description: Portfolio URL.
          example: null
        website:
          type: string
          nullable: true
          description: Personal website URL.
          example: https://adalovelace.dev
    WorkExperienceEntry:
      type: object
      description: One work-experience entry. A profile holds at most 50.
      properties:
        company:
          type: string
          nullable: true
          description: Employer name.
          example: Analytical Engines Ltd
        title:
          type: string
          nullable: true
          description: Job title held.
          example: Senior Backend Engineer
        location:
          type: string
          nullable: true
          description: Where the role was based.
          example: London, UK
        start_date:
          type: string
          nullable: true
          description: Start date as `YYYY` or `YYYY-MM`.
          example: 2021-03
        end_date:
          type: string
          nullable: true
          description: End date as `YYYY` or `YYYY-MM`. Ignored when `is_current` is true.
          example: 2023-01
        is_current:
          type: boolean
          description: True when this is the applicant's current role.
          example: false
        description:
          type: string
          nullable: true
          description: What the role involved. Max 4000 characters.
          example: >-
            Led the payments platform team; built a Go/Kubernetes event pipeline
            handling 2B events/day.
    EducationEntry:
      type: object
      description: One education entry. A profile holds at most 20.
      properties:
        school:
          type: string
          nullable: true
          description: Institution name.
          example: University of London
        degree:
          type: string
          nullable: true
          description: Degree obtained or in progress.
          example: BSc
        field_of_study:
          type: string
          nullable: true
          description: Major / field of study.
          example: Mathematics
        start_date:
          type: string
          nullable: true
          description: Start date as `YYYY` or `YYYY-MM`.
          example: '2016'
        end_date:
          type: string
          nullable: true
          description: Graduation (or expected graduation) date as `YYYY` or `YYYY-MM`.
          example: '2020'
        gpa:
          type: string
          nullable: true
          description: Free-form GPA, e.g. `"3.8"` or `"3.8/4.0"`. Max 20 characters.
          example: 3.8/4.0
    ProfileEligibility:
      type: object
      description: Work authorization — facts a resume cannot state.
      properties:
        work_authorized_countries:
          type: array
          items:
            type: string
          description: >-
            Country names the applicant is legally authorized to work in. Max 50
            entries.
          example:
            - United States
        requires_sponsorship:
          type: boolean
          nullable: true
          description: >-
            Whether the applicant now or in the future requires visa
            sponsorship.
          example: false
    ProfilePreferences:
      type: object
      description: >-
        Job preferences used to answer salary, start-date, relocation, and
        remote questions.
      properties:
        salary_expectation:
          oneOf:
            - $ref: '#/components/schemas/SalaryExpectation'
          nullable: true
          description: Expected compensation, or null to leave salary questions to the AI.
        earliest_start_date:
          type: string
          format: date
          nullable: true
          description: ISO date (`YYYY-MM-DD`) the applicant could start.
          example: '2026-08-01'
        willing_to_relocate:
          type: boolean
          nullable: true
          description: Whether the applicant is open to relocating.
          example: true
        remote_preference:
          type: string
          nullable: true
          enum:
            - remote
            - hybrid
            - on_site
            - flexible
            - null
          description: Preferred working arrangement.
          example: remote
        preferred_locations:
          type: array
          items:
            type: string
          description: Locations the applicant prefers to work in. Max 20 entries.
          example:
            - Austin, TX
    ProfileSelfIdentification:
      type: object
      description: >-
        Voluntary EEO self-identification. Everything here is optional — omitted
        or `prefer_not_to_say` values make the applicant decline those questions
        on application forms.
      properties:
        gender:
          type: string
          nullable: true
          enum:
            - male
            - female
            - non_binary
            - prefer_not_to_say
            - null
          description: Gender identity.
          example: female
        ethnicity:
          type: string
          nullable: true
          enum:
            - black_or_african_american
            - east_asian
            - southeast_asian
            - south_asian
            - hispanic_or_latino
            - middle_eastern
            - native_hawaiian_or_pacific_islander
            - american_indian_or_alaska_native
            - white
            - two_or_more
            - prefer_not_to_say
            - null
          description: >-
            Ethnicity category, matching the option sets ATS vendors use on EEO
            forms.
          example: prefer_not_to_say
        veteran_status:
          type: string
          nullable: true
          enum:
            - veteran
            - not_a_veteran
            - prefer_not_to_say
            - null
          description: Protected veteran status (US forms).
          example: not_a_veteran
        disability_status:
          type: string
          nullable: true
          enum:
            - 'yes'
            - 'no'
            - prefer_not_to_say
            - null
          description: Disability self-identification.
          example: prefer_not_to_say
        lgbtq_status:
          type: string
          nullable: true
          enum:
            - 'yes'
            - 'no'
            - prefer_not_to_say
            - null
          description: LGBTQ+ self-identification.
          example: prefer_not_to_say
    ProfileResume:
      type: object
      description: >-
        Read-only resume file metadata, managed via the resume endpoints (`PUT`
        / `GET` / `DELETE /api/auto-apply/profiles/{id}/resume`).
      properties:
        file_name:
          type: string
          description: Original file name.
          example: ada-lovelace.pdf
        content_type:
          type: string
          description: MIME type of the stored file.
          example: application/pdf
        size_bytes:
          type: integer
          format: int64
          description: File size in bytes.
          example: 182333
        uploaded_at:
          type: string
          format: date-time
          description: UTC timestamp the file was uploaded.
          example: '2026-07-01T12:00:00Z'
        download_url:
          type: string
          description: Host-relative URL that streams the resume bytes back.
          example: /api/auto-apply/profiles/8c5e6d0a-9f2b-4c1e-b7a3-2f4d5e6a7b8c/resume
    SalaryExpectation:
      type: object
      description: Expected compensation.
      properties:
        amount:
          type: number
          description: Expected amount. Must be greater than 0.
          example: 120000
        currency:
          type: string
          default: USD
          description: ISO 4217 currency code.
          example: USD
        period:
          type: string
          enum:
            - year
            - month
            - hour
          default: year
          description: The period the amount covers.
          example: year
  responses:
    Unauthorized:
      description: Missing or invalid API key
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-Api-Key
      description: API key provided by Jobo

````