openapi: 3.2.0 info: contact: email: support@aiapplyd.com name: AI Applyd url: https://aiapplyd.com description: 'The AI Applyd API runs the whole job hunt for you: it matches you to roles that fit your profile, rewrites your resume for each posting, writes the cover letter the form asks for, and auto-applies across the major applicant tracking systems.' license: name: Proprietary url: https://aiapplyd.com/legal/terms title: AI Applyd Resume Builder API version: 115c47ce servers: - description: Current environment url: https://api.aiapplyd.com/api/v1 security: - BearerAuth: [] tags: - name: resume-builder paths: /resume-builder: get: tags: - resume-builder summary: List Resume Builds description: Get all resume builds for the authenticated user. responses: '200': description: List of resume builds content: application/json: schema: $ref: '#/components/schemas/ResumeBuildListResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: getResumeBuilder post: tags: - resume-builder summary: Create Resume Build description: Create a new resume build. requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateResumeBuildRequest' responses: '201': description: Resume build created successfully content: application/json: schema: $ref: '#/components/schemas/ResumeBuildCreatedResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilder /resume-builder/templates: get: tags: - resume-builder summary: List Resume Templates description: Get all available resume templates. responses: '200': description: List of available templates content: application/json: schema: $ref: '#/components/schemas/TemplateListResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: getResumeBuilderTemplates /resume-builder/import: post: tags: - resume-builder summary: Import Resume from Document description: Use AI to parse an uploaded document (with extracted text) into a structured resume build. requestBody: content: application/json: schema: $ref: '#/components/schemas/ImportFromDocumentRequest' responses: '201': description: Resume build created from imported document content: application/json: schema: $ref: '#/components/schemas/ImportFromDocumentResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderImport /resume-builder/{id}/import-inline: post: tags: - resume-builder summary: Import File Inline into Existing Resume description: Upload a file, extract text with AI, and populate an existing resume build in-place. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: multipart/form-data: schema: type: object properties: file: type: string format: binary required: - file responses: '200': description: Resume build updated with imported content content: application/json: schema: $ref: '#/components/schemas/ResumeBuildResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdImportInline /resume-builder/{id}: get: tags: - resume-builder summary: Get Resume Build description: Get a specific resume build by ID. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id responses: '200': description: Resume build details content: application/json: schema: $ref: '#/components/schemas/ResumeBuildResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: getResumeBuilderById put: tags: - resume-builder summary: Update Resume Build description: Update an existing resume build. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateResumeBuildRequest' responses: '200': description: Resume build updated successfully content: application/json: schema: $ref: '#/components/schemas/ResumeBuildResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: putResumeBuilderById delete: tags: - resume-builder summary: Delete Resume Build description: Delete a resume build. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id responses: '200': description: Resume build deleted successfully content: application/json: schema: $ref: '#/components/schemas/ResumeBuilderSuccessResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: deleteResumeBuilderById /resume-builder/{id}/artifact: post: tags: - resume-builder summary: Save Rendered Resume Build PDF description: Publish the exact preview PDF for a saved build revision without importing or parsing it. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: multipart/form-data: schema: type: object properties: artifactRevision: type: string maxLength: 128 file: type: string format: binary required: - artifactRevision - file additionalProperties: false responses: '200': description: Preview PDF saved to the build-owned document content: application/json: schema: $ref: '#/components/schemas/ResumeBuildArtifactResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '503': description: Service Unavailable content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdArtifact /resume-builder/{id}/set-default: post: tags: - resume-builder summary: Set Default Resume description: Set a resume build as the default. Unsets any previously default resume for the user. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id responses: '200': description: Default resume updated successfully content: application/json: schema: $ref: '#/components/schemas/SetDefaultResumeResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdSetDefault /resume-builder/{id}/ats-score: post: tags: - resume-builder summary: ATS Score Resume description: Analyze a resume build for ATS compatibility. Optionally score against a specific job description. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/AtsScoreRequest' responses: '200': description: ATS score analysis content: application/json: schema: $ref: '#/components/schemas/AtsScoreResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdAtsScore /resume-builder/{id}/ats-optimize: post: tags: - resume-builder summary: ATS Optimize Resume description: 'One-button optimization: rewrite the resume to maximize ATS compatibility. Optionally provide a job description and previous suggestions.' parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/AtsOptimizeRequest' responses: '202': description: ATS optimization job accepted, poll the resume build detail for optimizeStatus content: application/json: schema: $ref: '#/components/schemas/PollingResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdAtsOptimize /resume-builder/{id}/generate-cover-letter: post: tags: - resume-builder summary: Generate Cover Letter description: Use AI to generate a personalized cover letter from a resume build. Optionally target a specific job or job match. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/GenerateCoverLetterRequest' responses: '202': description: Cover letter generation job accepted, poll the resume build detail for coverLetterStatus content: application/json: schema: $ref: '#/components/schemas/PollingResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdGenerateCoverLetter /resume-builder/{id}/translate: post: tags: - resume-builder summary: Translate Resume Build description: Use AI to translate a resume build into one or more languages. Creates a new resume build per language. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/TranslateResumeRequest' responses: '202': description: Translation job accepted, poll the resume build detail for translateStatus content: application/json: schema: $ref: '#/components/schemas/PollingResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdTranslate /resume-builder/{id}/share: post: tags: - resume-builder summary: Share Resume Build description: Generate a share token and toggle public visibility for a resume build. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/ShareResumeRequest' responses: '200': description: Share settings updated content: application/json: schema: $ref: '#/components/schemas/ShareResumeResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdShare /resume-builder/{id}/chat-thread: get: tags: - resume-builder summary: Get Resume Builder Chat Thread description: Load the persisted chat thread (UIMessage array) for a resume build. Returns an empty array if no thread exists yet. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id responses: '200': description: Persisted chat thread for this resume build content: application/json: schema: $ref: '#/components/schemas/ChatThreadResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: getResumeBuilderByIdChatThread put: tags: - resume-builder summary: Upsert Resume Builder Chat Thread description: Persist the chat thread (UIMessage array) for a resume build. Upserts on (userId, resumeBuildId). parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/UpsertChatThreadRequest' responses: '200': description: Chat thread persisted content: application/json: schema: $ref: '#/components/schemas/ChatThreadResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: putResumeBuilderByIdChatThread /resume-builder/shared/{token}: get: tags: - resume-builder summary: View Shared Resume description: View a publicly shared resume build. No authentication required. parameters: - schema: type: string minLength: 1 description: Share token for the resume example: abc123def456 required: true description: Share token for the resume in: path name: token responses: '200': description: Shared resume details content: application/json: schema: $ref: '#/components/schemas/SharedResumeBuildResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: getResumeBuilderSharedByToken /resume-builder/{id}/tex: post: tags: - resume-builder summary: Generate LaTeX (.tex) Source description: Render a resume build as a LaTeX `.tex` source string. Used by the LaTeX template to support "Download .tex" + "Open in Overleaf". parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id responses: '200': description: LaTeX source string for the resume content: application/json: schema: $ref: '#/components/schemas/GenerateTexResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdTex /cover-letter/suggest-tone: post: tags: - resume-builder summary: Suggest Cover Letter Tone description: Recommend a persona preset (tone) for the cover letter based on a job match's title + description. One AI call, returns persona + one-line rationale. requestBody: content: application/json: schema: $ref: '#/components/schemas/SuggestCoverLetterToneRequest' responses: '200': description: Recommended persona preset + one-line rationale content: application/json: schema: $ref: '#/components/schemas/SuggestCoverLetterToneResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postCoverLetterSuggestTone /resume-builder/{id}/suggest-section: post: tags: - resume-builder summary: Suggest Section Content description: Synthesize suggested items for a blank section in the resume builder using the user's other resumes as context. Returns 0-8 items the user can Add / Replace / Edit-before-adding. parameters: - schema: type: string pattern: ^\d+$ description: Resume build identifier example: '1' required: true description: Resume build identifier in: path name: id requestBody: content: application/json: schema: $ref: '#/components/schemas/SuggestResumeSectionRequest' responses: '200': description: Suggested items for the requested section content: application/json: schema: $ref: '#/components/schemas/SuggestResumeSectionResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postResumeBuilderByIdSuggestSection components: schemas: AtsRequirementMapping: type: object properties: matchStrength: type: string enum: - strong - partial - missing description: How well the resume matches a specific requirement example: strong requirement: type: string description: Specific requirement from the job description resumeMatch: type: - string - 'null' description: Matching content found in resume, or null if no match section: type: - string - 'null' description: Resume section where match was found required: - matchStrength - requirement - resumeMatch - section additionalProperties: false ChatThreadResponse: type: object properties: data: $ref: '#/components/schemas/ChatThreadData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response AtsKeywordStrategy: type: - object - 'null' properties: competencyTags: type: array items: type: string description: 6-8 keyword phrases for a competency grid experienceKeywords: type: array items: type: string description: Keywords to weave into experience bullets skillsKeywords: type: array items: type: string description: Keywords for skills section summaryKeywords: type: array items: type: string description: Top 5 keywords to add to professional summary required: - competencyTags - experienceKeywords - skillsKeywords - summaryKeywords additionalProperties: false description: Keyword injection strategy by resume section (populated when jobDescription is provided, null otherwise) ResumeBuildListResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/ResumeBuildListItem' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response AtsRoleClassification: type: - object - 'null' properties: archetype: type: string description: Role archetype (e.g. Backend Engineer, AI/ML, Product Manager, DevOps, etc.) domain: type: string description: Domain/industry focus remote: type: - string - 'null' description: Remote policy if detectable seniority: type: string description: Detected seniority level from JD required: - archetype - domain - remote - seniority additionalProperties: false description: Role classification and archetype detection (populated when jobDescription is provided, null otherwise) SetDefaultResumeResponse: type: object properties: data: type: object properties: success: type: boolean enum: - true required: - success additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ExperienceEntry: type: object properties: bullets: type: array items: type: string example: - Led migration of monolithic architecture to microservices, reducing deployment time by 60% company: type: string example: Acme Corp current: type: - boolean - 'null' endDate: type: - string - 'null' example: 2024-01 location: type: - string - 'null' startDate: type: string example: 2020-01 title: type: string example: Senior Engineer required: - bullets - company - startDate - title additionalProperties: false ResumeTemplate: type: object properties: description: type: string example: Clean, traditional resume format id: type: string example: classic name: type: string example: Classic previewUrl: type: string required: - description - id - name additionalProperties: false GenerateTexResponse: type: object properties: data: $ref: '#/components/schemas/GenerateTexResponseData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response PersonalInfo: type: object properties: email: anyOf: - type: string format: email - type: string enum: - '' - {} example: name@example.com fullName: type: - string - 'null' example: Ada Lovelace linkedin: type: - string - 'null' location: type: - string - 'null' example: San Francisco, CA phone: type: - string - 'null' example: +1 (555) 123-4567 title: type: - string - 'null' example: Senior Software Engineer website: type: - string - 'null' additionalProperties: false SuggestCoverLetterToneData: type: object properties: type: type: string enum: - cover-letter-tone description: Discriminator for the suggestion engine union (R5-1). persona: type: string enum: - balanced - the_professional - the_conversationalist - the_storyteller - the_closer - the_enthusiast - custom description: Recommended persona preset for this job. example: balanced rationale: type: string minLength: 1 maxLength: 280 description: One-line rationale shown next to the recommended persona. example: This role values formal, concise communication. required: - type - persona - rationale additionalProperties: false SuggestResumeSectionResponse: type: object properties: data: $ref: '#/components/schemas/ResumeSectionSuggestion' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ResumeBuildListItem: type: object properties: buildType: type: string enum: - resume - cover_letter description: Type of build (resume or cover letter) example: resume createdAt: type: - string - 'null' id: type: integer isDefault: type: integer linkedDocumentId: type: - integer - 'null' sourceDocumentId: type: - integer - 'null' templateId: type: string title: type: string updatedAt: type: - string - 'null' required: - buildType - createdAt - id - isDefault - linkedDocumentId - sourceDocumentId - templateId - title - updatedAt additionalProperties: false SuggestResumeSectionRequest: type: object properties: sectionType: type: string enum: - summary - experience - education - skills description: Resume sections that the auto-suggest engine supports. example: experience anchorContext: type: object properties: company: type: string maxLength: 200 title: type: string maxLength: 200 institution: type: string maxLength: 200 degree: type: string maxLength: 200 additionalProperties: false required: - sectionType additionalProperties: false ResumeBuildCreatedResponse: type: object properties: data: type: object properties: id: type: integer title: type: string required: - id - title additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ResumeBuildResponse: type: object properties: data: $ref: '#/components/schemas/ResumeBuild' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response PollingEnvelope: type: object properties: message: type: string description: Human-readable description of the async operation state example: Resume optimization started resourceId: type: string description: Identifier of the resource whose detail endpoint should be polled example: '42' retryAfterMs: type: integer minimum: 0 description: Suggested delay before the next poll, in milliseconds example: 3000 status: type: string enum: - pending - processing - streaming - completed - failed description: Status of async polling operation example: processing throttled: type: boolean description: True when the per-user hourly auto-generation cap was hit; no work was enqueued and the client should not poll. example: true required: - message - retryAfterMs - status additionalProperties: false AtsOptimizeRequest: type: object properties: jobDescription: type: string maxLength: 50000 description: Job description to optimize against suggestions: type: array items: $ref: '#/components/schemas/AtsSuggestion' description: Previous ATS score suggestions to apply. If omitted, AI generates its own analysis first. additionalProperties: false ResumeBuilderSuccessResponse: type: object properties: data: type: object properties: success: type: boolean enum: - true required: - success additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response AtsScoreData: type: object properties: formattingIssues: type: array items: type: string description: ATS formatting issues detected example: - Headers use images instead of text - Tables may not parse correctly gapAnalysis: type: - array - 'null' items: $ref: '#/components/schemas/AtsGapAnalysis' description: Gap analysis with severity and mitigation strategies (populated when jobDescription is provided, null otherwise) keywordStrategy: $ref: '#/components/schemas/AtsKeywordStrategy' matchingKeywords: type: array items: type: string description: Keywords found in the resume that match the job description example: - JavaScript - React - Node.js missingKeywords: type: array items: type: string description: Important keywords from the job description missing from the resume example: - TypeScript - GraphQL - CI/CD overallScore: type: number minimum: 0 maximum: 100 description: Overall ATS compatibility score (0-100) example: 72 requirementMapping: type: - array - 'null' items: $ref: '#/components/schemas/AtsRequirementMapping' description: Per-requirement mapping of JD requirements to resume content (populated when jobDescription is provided, null otherwise) roleClassification: $ref: '#/components/schemas/AtsRoleClassification' strengths: type: array items: type: string description: Resume strengths for ATS parsing example: - Strong action verbs in bullet points - Quantified achievements suggestions: type: array items: $ref: '#/components/schemas/AtsSuggestion' description: Section-specific improvement suggestions required: - formattingIssues - gapAnalysis - keywordStrategy - matchingKeywords - missingKeywords - overallScore - requirementMapping - roleClassification - strengths - suggestions additionalProperties: false ResumeSectionSuggestionItem: oneOf: - type: object properties: type: type: string enum: - summary text: type: string minLength: 1 maxLength: 2000 required: - type - text additionalProperties: false - type: object properties: type: type: string enum: - experience text: type: string minLength: 1 maxLength: 500 anchorTitle: type: string maxLength: 200 anchorCompany: type: string maxLength: 200 required: - type - text additionalProperties: false - type: object properties: type: type: string enum: - education text: type: string minLength: 1 maxLength: 300 anchorInstitution: type: string maxLength: 200 anchorDegree: type: string maxLength: 200 required: - type - text additionalProperties: false - type: object properties: type: type: string enum: - skill text: type: string minLength: 1 maxLength: 100 required: - type - text additionalProperties: false ShareResumeData: type: object properties: isPublic: type: boolean description: Whether the resource is currently public example: true shareToken: type: - string - 'null' description: Share token for public URL (null if private) example: a1b2c3d4e5f6... shareUrl: type: - string - 'null' description: Public share URL (null if private) example: https://aiapplyd.com/document/a1b2c3... required: - isPublic - shareToken - shareUrl additionalProperties: false UpsertChatThreadRequest: type: object properties: messages: type: array items: $ref: '#/components/schemas/ChatThreadUIMessage' maxItems: 200 description: UIMessage array (max 200) to persist for this resume build. required: - messages additionalProperties: false ChatThreadUIMessage: type: object properties: id: type: string minLength: 1 maxLength: 200 role: type: string enum: - system - user - assistant description: Role of a message in an AI chat thread example: user parts: type: array items: type: object properties: type: type: string minLength: 1 maxLength: 100 required: - type maxItems: 100 required: - id - role - parts ShareResumeRequest: type: object properties: isPublic: type: boolean description: Whether the resource should be publicly accessible example: true required: - isPublic additionalProperties: false ImportFromDocumentResponse: type: object properties: data: type: object properties: id: type: integer title: type: string required: - id - title additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ResumeSectionSuggestion: type: object properties: type: type: string enum: - resume-section sectionType: type: string enum: - summary - experience - education - skills description: Resume sections that the auto-suggest engine supports. example: experience items: type: array items: $ref: '#/components/schemas/ResumeSectionSuggestionItem' minItems: 0 maxItems: 8 description: Suggested items for the requested section, 0-8 depending on section type. cached: type: boolean description: True when this suggestion was served from cache (free, no tokens billed). sourceResumeId: type: - integer - 'null' description: ID of the resume_build the suggestion drew evidence from, when applicable. required: - type - sectionType - items - cached - sourceResumeId additionalProperties: false SharedResumeBuildResponse: type: object properties: data: allOf: - $ref: '#/components/schemas/ResumeBuild' - type: object properties: atsScore: type: - integer - 'null' description: ATS score from linked document (if scored) example: 78 required: - atsScore additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response CreateResumeBuildRequest: type: object properties: buildType: type: string enum: - resume - cover_letter default: resume description: Type of build (resume or cover letter) example: resume certifications: type: array items: type: string maxLength: 200 maxItems: 20 coverLetterBody: type: string maxLength: 10000 education: type: array items: $ref: '#/components/schemas/EducationEntry' maxItems: 10 experience: type: array items: $ref: '#/components/schemas/ExperienceEntry' maxItems: 20 fontFamily: type: string maxLength: 200 personalInfo: $ref: '#/components/schemas/PersonalInfo' recipientCompany: type: string maxLength: 200 recipientName: type: string maxLength: 200 recipientPosition: type: string maxLength: 200 sectionOrder: type: array items: type: string maxLength: 50 maxItems: 20 skills: type: array items: type: string maxLength: 100 maxItems: 200 summary: type: string maxLength: 2000 templateId: type: string maxLength: 50 default: classic title: type: string minLength: 1 maxLength: 200 example: My Software Engineer Resume required: - title additionalProperties: false ImportFromDocumentRequest: type: object properties: documentId: type: integer description: ID of the user document to import resume data from example: 1 exclusiveMinimum: 0 templateId: type: string maxLength: 50 default: classic description: Resume template to use example: classic title: type: string minLength: 1 maxLength: 200 description: Title for the new resume build example: Imported Resume - Software Engineer required: - documentId - title additionalProperties: false ResumeBuildArtifactResponse: type: object properties: data: type: object properties: artifactRevision: type: string maxLength: 128 pattern: ^resume-build:[1-9]\d*:[a-f0-9]{64}$ documentId: type: integer exclusiveMinimum: 0 required: - artifactRevision - documentId additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response GenerateCoverLetterRequest: type: object properties: company: type: string maxLength: 200 description: Target company name (used if no jobMatchId provided) example: Acme Corp jobDescription: type: string maxLength: 50000 description: Job description text (used if no jobMatchId provided) example: We are looking for a Senior Software Engineer... jobMatchId: type: integer description: If generating for a saved job match, provide its ID to auto-fill job details example: 42 exclusiveMinimum: 0 jobTitle: type: string maxLength: 200 description: Target job title (used if no jobMatchId provided) example: Senior Software Engineer additionalProperties: false AtsSuggestion: type: object properties: fix: type: string example: Add "TypeScript" and "React" to your skills section and weave them into experience bullets issue: type: string example: Missing key technical skills mentioned in the job description section: type: string example: skills required: - fix - issue - section additionalProperties: false GenerateTexResponseData: type: object properties: filename: type: string example: cv.tex tex: type: string description: 'LaTeX source string for the resume. Self-contained: paste into Overleaf or run `latexmk -pdf` locally.' required: - filename - tex additionalProperties: false ApiErrorResponse: type: object properties: error: type: object properties: code: type: string context: oneOf: - type: object properties: errorType: type: string enum: - validation field: type: string fieldErrors: type: array items: type: object properties: code: type: string expected: type: string field: type: string message: type: string received: type: string required: - field - message schemaName: type: string required: - errorType - type: object properties: attemptedEmail: type: string format: email errorType: type: string enum: - authentication failureReason: type: string enum: - invalid_credentials - account_locked - expired_token - token_expired - missing_token - invalid_token - session_expired description: Reason for authentication failure example: token_expired ipAddress: type: string operation: type: string service: type: string userAgent: type: string required: - errorType - type: object properties: actualPermission: type: string errorType: type: string enum: - authorization requiredPermission: type: string resource: type: string resourceId: type: string userId: type: string required: - errorType - type: object properties: constraint: type: string errorType: type: string enum: - database operation: type: string enum: - insert - update - delete - select - batch - transaction - migration description: Type of database operation example: select resourceId: type: string sqlState: type: string table: type: string userId: type: string required: - errorType - type: object properties: endpoint: type: string errorType: type: string enum: - external_service httpStatus: type: number operation: type: string resourceId: type: string responseTime: type: number retryAttempt: type: integer service: type: string serviceName: type: string userId: type: string required: - errorType - type: object properties: errorType: type: string enum: - resource resource: type: string resourceId: type: string service: type: string userId: type: string required: - errorType - type: object properties: errorType: type: string enum: - rate_limit limit: type: number resetTime: type: string windowMs: type: number required: - errorType - type: object properties: configKey: type: string errorType: type: string enum: - configuration operation: type: string service: type: string required: - errorType description: Type-safe error context information example: errorType: validation fieldErrors: - field: email message: Invalid email format details: oneOf: - type: object properties: detailType: type: string enum: - validation validationErrors: type: array items: type: object properties: code: type: string field: type: string message: type: string required: - field - message required: - detailType - validationErrors additionalProperties: false - type: object properties: detailType: type: string enum: - service_error originalError: type: string serviceName: type: string required: - detailType - serviceName additionalProperties: false - type: object properties: currentSize: type: number detailType: type: string enum: - batch originalError: type: string statementCount: type: number required: - detailType additionalProperties: false - type: object properties: detailType: type: string enum: - rate_limit limit: type: number resetTime: type: string windowMs: type: number required: - detailType - limit - resetTime - windowMs additionalProperties: false - type: object properties: conflictingField: type: string detailType: type: string enum: - resource resourceId: anyOf: - type: string - type: number resourceType: type: string required: - detailType additionalProperties: false - type: object properties: detailType: type: string enum: - generic info: type: string required: - detailType additionalProperties: false - type: object properties: currentTokens: type: integer minimum: 0 detailType: type: string enum: - insufficient_tokens requiredTokens: type: integer minimum: 0 required: - currentTokens - detailType - requiredTokens additionalProperties: false message: type: string validation: type: array items: type: object properties: code: type: string field: type: string message: type: string required: - field - message additionalProperties: false required: - code - message additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - false required: - error - success additionalProperties: false ResumeBuild: type: object properties: artifactRevision: type: string maxLength: 128 pattern: ^resume-build:[1-9]\d*:[a-f0-9]{64}$ description: Receipt for the persisted rendering inputs returned by Save. Required to publish its preview PDF. buildType: type: string enum: - resume - cover_letter description: Type of build (resume or cover letter) example: resume certifications: type: - array - 'null' items: type: string coverLetterBody: type: - string - 'null' coverLetterStatus: type: - string - 'null' enum: - idle - generating - completed - failed - null description: Status of async AI cover-letter generation for this build example: idle coverLetterTraces: type: - array - 'null' items: type: object properties: claim: type: string confidence: type: number minimum: 0 maximum: 1 sourceLine: type: - string - 'null' required: - claim - confidence - sourceLine description: Per-claim CV-evidence traces from the cover-letter generator (career-ops F6). Null until a cover letter is generated. createdAt: type: - string - 'null' education: type: - array - 'null' items: $ref: '#/components/schemas/EducationEntry' experience: type: - array - 'null' items: $ref: '#/components/schemas/ExperienceEntry' fontFamily: type: - string - 'null' id: type: integer importStatus: type: - string - 'null' enum: - idle - generating - completed - failed - null description: Status of async AI resume import into this build example: idle isDefault: type: integer optimizeStatus: type: - string - 'null' enum: - idle - generating - completed - failed - null description: Status of async AI ATS-optimize run against this build example: idle translateStatus: type: - string - 'null' enum: - idle - generating - completed - failed - null description: Status of async AI translation run against this build example: idle isPublic: type: boolean linkedDocumentId: type: - integer - 'null' shareToken: type: - string - 'null' personalInfo: allOf: - $ref: '#/components/schemas/PersonalInfo' - {} recipientCompany: type: - string - 'null' recipientName: type: - string - 'null' recipientPosition: type: - string - 'null' sectionOrder: type: - array - 'null' items: type: string skills: type: - array - 'null' items: type: string summary: type: - string - 'null' templateId: type: string title: type: string updatedAt: type: - string - 'null' required: - buildType - certifications - coverLetterStatus - createdAt - education - experience - fontFamily - id - importStatus - isDefault - optimizeStatus - translateStatus - isPublic - linkedDocumentId - shareToken - personalInfo - sectionOrder - skills - summary - templateId - title - updatedAt additionalProperties: false PollingResponse: type: object properties: data: $ref: '#/components/schemas/PollingEnvelope' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ResponseMetadata: type: object properties: duration: type: number description: Request duration in milliseconds example: 150 exclusiveMinimum: 0 performance: type: object properties: dbQueries: type: integer minimum: 0 totalDbTime: type: number minimum: 0 description: Performance metrics (preview/local only) requestId: type: string description: Unique request identifier example: req_abc123 timestamp: type: string format: date-time description: ISO 8601 timestamp example: '2026-09-25T17:29:47.224Z' version: type: string description: API version example: v1 AtsScoreRequest: type: object properties: jobDescription: type: string minLength: 50 maxLength: 20000 description: Job description to score against. Required, 50-20000 characters - an ATS score with no role to match against is not a match score. example: We are looking for a Senior Software Engineer with 5+ years experience in React and TypeScript... required: - jobDescription additionalProperties: false ChatThreadData: type: object properties: messages: type: array items: $ref: '#/components/schemas/ChatThreadUIMessage' description: Persisted UIMessage array for this resume build (empty if no thread yet). updatedAt: type: - string - 'null' required: - messages - updatedAt additionalProperties: false AtsGapAnalysis: type: object properties: adjacentExperience: type: - string - 'null' description: Related experience that partially covers this gap gap: type: string description: Missing requirement or skill mitigation: type: string description: Strategy to address this gap (adjacent experience, transferable skills, etc) severity: type: string enum: - hard_blocker - nice_to_have - soft_gap description: How critical a missing requirement is example: soft_gap required: - adjacentExperience - gap - mitigation - severity additionalProperties: false SuggestCoverLetterToneResponse: type: object properties: data: $ref: '#/components/schemas/SuggestCoverLetterToneData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response AtsScoreResponse: type: object properties: data: $ref: '#/components/schemas/AtsScoreData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response SuggestCoverLetterToneRequest: type: object properties: jobMatchId: type: integer description: Job match to read context from when picking a recommended tone. example: 42 exclusiveMinimum: 0 required: - jobMatchId additionalProperties: false EducationEntry: type: object properties: degree: type: string example: B.S. Computer Science endDate: type: - string - 'null' gpa: type: - string - 'null' highlights: type: - array - 'null' items: type: string institution: type: string example: MIT location: type: - string - 'null' startDate: type: - string - 'null' required: - degree - institution additionalProperties: false TemplateListResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/ResumeTemplate' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ShareResumeResponse: type: object properties: data: $ref: '#/components/schemas/ShareResumeData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response UpdateResumeBuildRequest: type: object properties: buildType: type: string enum: - resume - cover_letter default: resume description: Type of build (resume or cover letter) example: resume certifications: type: array items: type: string maxLength: 200 maxItems: 20 coverLetterBody: type: string maxLength: 10000 education: type: array items: $ref: '#/components/schemas/EducationEntry' maxItems: 10 experience: type: array items: $ref: '#/components/schemas/ExperienceEntry' maxItems: 20 fontFamily: type: string maxLength: 200 personalInfo: $ref: '#/components/schemas/PersonalInfo' recipientCompany: type: string maxLength: 200 recipientName: type: string maxLength: 200 recipientPosition: type: string maxLength: 200 sectionOrder: type: array items: type: string maxLength: 50 maxItems: 20 skills: type: array items: type: string maxLength: 100 maxItems: 200 summary: type: string maxLength: 2000 templateId: type: string maxLength: 50 default: classic title: type: string minLength: 1 maxLength: 200 example: My Software Engineer Resume linkedDocumentId: type: integer exclusiveMinimum: 0 additionalProperties: false TranslateResumeRequest: type: object properties: targetLanguage: type: string minLength: 1 maxLength: 50 description: Single target language for translation (prefer targetLanguages for batch) example: Spanish targetLanguages: type: array items: type: string minLength: 1 maxLength: 50 minItems: 1 maxItems: 10 description: Array of target languages for batch translation example: - Spanish - French - German additionalProperties: false securitySchemes: BearerAuth: description: 'Session token from signing in to AI Applyd, sent as `Authorization: Bearer `.' scheme: bearer type: http