Files
Reactive-Resume/docs/spec.json
T
2026-06-18 18:53:01 +02:00

3207 lines
122 KiB
JSON

{
"info": {
"title": "Reactive Resume",
"version": "5.1.0",
"description": "Reactive Resume API",
"license": { "name": "MIT", "url": "https://github.com/amruthpillai/reactive-resume/blob/main/LICENSE" },
"contact": { "name": "Amruth Pillai", "email": "hello@amruthpillai.com", "url": "https://amruthpillai.com" }
},
"servers": [{ "url": "http://localhost:3000/api/openapi" }],
"externalDocs": { "url": "https://docs.rxresu.me", "description": "Reactive Resume Documentation" },
"components": {
"securitySchemes": {
"apiKey": {
"type": "apiKey",
"name": "x-api-key",
"in": "header",
"description": "The API key to authenticate requests."
}
},
"schemas": {
"ResumeData": {
"type": "object",
"properties": {
"picture": {
"type": "object",
"properties": {
"hidden": { "type": "boolean", "description": "Whether to hide the picture from the resume." },
"url": {
"type": "string",
"description": "The URL to the picture to display on the resume. Prefer local app-served paths (for example /uploads/...) populated via upload."
},
"size": {
"type": "number",
"minimum": 32,
"maximum": 512,
"description": "The size of the picture to display on the resume, defined in points (pt)."
},
"rotation": {
"type": "number",
"minimum": 0,
"maximum": 360,
"description": "The rotation of the picture to display on the resume, defined in degrees (°)."
},
"aspectRatio": {
"type": "number",
"minimum": 0.5,
"maximum": 2.5,
"description": "The aspect ratio of the picture to display on the resume, defined as width / height (e.g. 1.5 for 1.5:1 or 0.5 for 1:2)."
},
"borderRadius": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "The border radius of the picture to display on the resume, defined in points (pt)."
},
"borderColor": {
"type": "string",
"description": "The color of the border of the picture to display on the resume, defined as rgba(r, g, b, a)."
},
"borderWidth": {
"type": "number",
"minimum": 0,
"description": "The width of the border of the picture to display on the resume, defined in points (pt)."
},
"shadowColor": {
"type": "string",
"description": "The color of the shadow of the picture to display on the resume, defined as rgba(r, g, b, a)."
},
"shadowWidth": {
"type": "number",
"minimum": 0,
"description": "The width of the shadow of the picture to display on the resume, defined in points (pt)."
}
},
"required": [
"hidden",
"url",
"size",
"rotation",
"aspectRatio",
"borderRadius",
"borderColor",
"borderWidth",
"shadowColor",
"shadowWidth"
],
"description": "Configuration for photograph displayed on the resume"
},
"basics": {
"type": "object",
"properties": {
"name": { "type": "string", "description": "The full name of the author of the resume." },
"headline": { "type": "string", "description": "The headline of the author of the resume." },
"email": { "type": "string", "description": "The email address of the author of the resume." },
"phone": { "type": "string", "description": "The phone number of the author of the resume." },
"location": { "type": "string", "description": "The location of the author of the resume." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
}
},
"required": ["url", "label"],
"description": "The website of the author of the resume."
},
"customFields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the custom field. Usually generated as a UUID."
},
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"text": { "type": "string", "description": "The text to display for the custom field." },
"link": {
"type": "string",
"description": "If the custom field should be a link, the URL to link to."
}
},
"required": ["id", "icon", "text", "link"]
},
"description": "The custom fields to display on the resume."
}
},
"required": ["name", "headline", "email", "phone", "location", "website", "customFields"],
"description": "Basic information about the author, such as name, email, phone, location, and website"
},
"summary": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the summary of the resume." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the summary should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the summary from the resume." },
"content": {
"type": "string",
"description": "The content of the summary of the resume. This should be a HTML-formatted string."
}
},
"required": ["title", "columns", "hidden", "content"],
"description": "Summary section of the resume, useful for a short bio or introduction"
},
"sections": {
"type": "object",
"properties": {
"profiles": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"iconColor": {
"type": "string",
"description": "Custom color for the icon, defined as rgba(r, g, b, a). Leave blank to use the template default icon color."
},
"network": {
"type": "string",
"minLength": 1,
"description": "The name of the network or platform."
},
"username": {
"type": "string",
"description": "The username of the author on the network or platform."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the profile of the author on the network or platform, if any."
}
},
"required": ["id", "hidden", "icon", "iconColor", "network", "username", "website"]
},
"description": "The items to display in the profiles section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the profiles of the author."
},
"experience": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"company": {
"type": "string",
"minLength": 1,
"description": "The name of the company or organization."
},
"position": {
"type": "string",
"description": "The position held at the company or organization. Used when there is only a single role. If multiple roles are provided in the 'roles' field, this serves as a summary title or can be left blank."
},
"location": { "type": "string", "description": "The location of the company or organization." },
"period": {
"type": "string",
"description": "The overall period of time at the company. When multiple roles are used, this should reflect the total tenure."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the company or organization, if any."
},
"description": {
"type": "string",
"description": "The description of the experience. This should be a HTML-formatted string."
},
"roles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the role. Usually generated as a UUID."
},
"position": {
"type": "string",
"description": "The position or job title for this role."
},
"period": { "type": "string", "description": "The period of time this role was held." },
"description": {
"type": "string",
"description": "The description of this specific role. This should be a HTML-formatted string."
}
},
"required": ["id", "position", "period", "description"]
},
"description": "List of individual roles held at this company to show career progression."
}
},
"required": [
"id",
"hidden",
"company",
"position",
"location",
"period",
"website",
"description",
"roles"
]
},
"description": "The items to display in the experience section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the experience of the author."
},
"education": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"school": {
"type": "string",
"minLength": 1,
"description": "The name of the school or institution."
},
"degree": { "type": "string", "description": "The degree or qualification obtained." },
"area": { "type": "string", "description": "The area of study or specialization." },
"grade": { "type": "string", "description": "The grade or score achieved." },
"location": { "type": "string", "description": "The location of the school or institution." },
"period": {
"type": "string",
"description": "The period of time the education was obtained over."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the school or institution, if any."
},
"description": {
"type": "string",
"description": "The description of the education. This should be a HTML-formatted string."
}
},
"required": [
"id",
"hidden",
"school",
"degree",
"area",
"grade",
"location",
"period",
"website",
"description"
]
},
"description": "The items to display in the education section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the education of the author."
},
"projects": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the project." },
"period": { "type": "string", "description": "The period of time the project was worked on." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the project, if any."
},
"description": {
"type": "string",
"description": "The description of the project. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "name", "period", "website", "description"]
},
"description": "The items to display in the projects section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the projects of the author."
},
"skills": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"iconColor": {
"type": "string",
"description": "Custom color for the icon, defined as rgba(r, g, b, a). Leave blank to use the template default icon color."
},
"name": { "type": "string", "minLength": 1, "description": "The name of the skill." },
"proficiency": {
"type": "string",
"description": "The proficiency level of the skill. Can be any text, such as 'Beginner', 'Intermediate', 'Advanced', etc."
},
"level": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "The proficiency level of the skill, defined as a number between 0 and 5. If set to 0, the icons displaying the level will be hidden."
},
"keywords": {
"type": "array",
"items": { "type": "string" },
"description": "The keywords associated with the skill, if any. These are displayed as tags below the name."
}
},
"required": ["id", "hidden", "icon", "iconColor", "name", "proficiency", "level", "keywords"]
},
"description": "The items to display in the skills section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the skills of the author."
},
"languages": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"language": {
"type": "string",
"minLength": 1,
"description": "The name of the language the author knows."
},
"fluency": {
"type": "string",
"description": "The fluency level of the language. Can be any text, such as 'Native', 'Fluent', 'Conversational', etc. or can also be a CEFR level (A1, A2, B1, B2, C1, C2)."
},
"level": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "The proficiency level of the language, defined as a number between 0 and 5. If set to 0, the icons displaying the level will be hidden."
}
},
"required": ["id", "hidden", "language", "fluency", "level"]
},
"description": "The items to display in the languages section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the languages of the author."
},
"interests": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"iconColor": {
"type": "string",
"description": "Custom color for the icon, defined as rgba(r, g, b, a). Leave blank to use the template default icon color."
},
"name": { "type": "string", "minLength": 1, "description": "The name of the interest/hobby." },
"keywords": {
"type": "array",
"items": { "type": "string" },
"description": "The keywords associated with the interest/hobby, if any. These are displayed as tags below the name."
}
},
"required": ["id", "hidden", "icon", "iconColor", "name", "keywords"]
},
"description": "The items to display in the interests section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the interests of the author."
},
"awards": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"title": { "type": "string", "minLength": 1, "description": "The title of the award." },
"awarder": { "type": "string", "description": "The awarder of the award." },
"date": { "type": "string", "description": "The date when the award was received." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the award, if any."
},
"description": {
"type": "string",
"description": "The description of the award. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "title", "awarder", "date", "website", "description"]
},
"description": "The items to display in the awards section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the awards of the author."
},
"certifications": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"title": { "type": "string", "minLength": 1, "description": "The title of the certification." },
"issuer": { "type": "string", "description": "The issuer of the certification." },
"date": { "type": "string", "description": "The date when the certification was received." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the certification, if any."
},
"description": {
"type": "string",
"description": "The description of the certification. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "title", "issuer", "date", "website", "description"]
},
"description": "The items to display in the certifications section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the certifications of the author."
},
"publications": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"title": { "type": "string", "minLength": 1, "description": "The title of the publication." },
"publisher": { "type": "string", "description": "The publisher of the publication." },
"date": { "type": "string", "description": "The date when the publication was published." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the publication, if any."
},
"description": {
"type": "string",
"description": "The description of the publication. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "title", "publisher", "date", "website", "description"]
},
"description": "The items to display in the publications section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the publications of the author."
},
"volunteer": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"organization": {
"type": "string",
"minLength": 1,
"description": "The name of the organization or company."
},
"location": { "type": "string", "description": "The location of the organization or company." },
"period": {
"type": "string",
"description": "The period of time the author was volunteered at the organization or company."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the organization or company, if any."
},
"description": {
"type": "string",
"description": "The description of the volunteer experience. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "organization", "location", "period", "website", "description"]
},
"description": "The items to display in the volunteer section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the volunteer experience of the author."
},
"references": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"name": {
"type": "string",
"minLength": 1,
"description": "The name of the reference, or a note such as 'Available upon request'."
},
"position": { "type": "string", "description": "The position or job title of the reference." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website or LinkedIn profile of the reference, if any."
},
"phone": { "type": "string", "description": "The phone number of the reference." },
"description": {
"type": "string",
"description": "The description of the reference. Can be used to display a quote, a testimonial, etc. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "name", "position", "website", "phone", "description"]
},
"description": "The items to display in the references section."
}
},
"required": ["title", "columns", "hidden", "items"],
"description": "The section to display the references of the author."
}
},
"required": [
"profiles",
"experience",
"education",
"projects",
"skills",
"languages",
"interests",
"awards",
"certifications",
"publications",
"volunteer",
"references"
],
"description": "Various sections of the resume, such as experience, education, projects, etc."
},
"customSections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": { "type": "string", "description": "The title of the section." },
"columns": {
"type": "integer",
"minimum": 1,
"maximum": 6,
"description": "The number of columns the section should span across."
},
"hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." },
"id": {
"type": "string",
"description": "The unique identifier for the custom section. Usually generated as a UUID."
},
"type": {
"enum": [
"summary",
"profiles",
"experience",
"education",
"projects",
"skills",
"languages",
"interests",
"awards",
"certifications",
"publications",
"volunteer",
"references",
"cover-letter"
],
"type": "string",
"description": "The type of items this custom section contains. Determines which item schema and form fields to use."
},
"items": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"recipient": {
"type": "string",
"description": "The recipient's address block as HTML (name, title, company, address, email)."
},
"content": {
"type": "string",
"description": "The cover letter body as HTML (salutation, paragraphs, closing, signature)."
}
},
"required": ["id", "hidden", "recipient", "content"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"content": {
"type": "string",
"description": "The rich text content of the summary item. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "content"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"iconColor": {
"type": "string",
"description": "Custom color for the icon, defined as rgba(r, g, b, a). Leave blank to use the template default icon color."
},
"network": {
"type": "string",
"minLength": 1,
"description": "The name of the network or platform."
},
"username": {
"type": "string",
"description": "The username of the author on the network or platform."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the profile of the author on the network or platform, if any."
}
},
"required": ["id", "hidden", "icon", "iconColor", "network", "username", "website"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"company": {
"type": "string",
"minLength": 1,
"description": "The name of the company or organization."
},
"position": {
"type": "string",
"description": "The position held at the company or organization. Used when there is only a single role. If multiple roles are provided in the 'roles' field, this serves as a summary title or can be left blank."
},
"location": {
"type": "string",
"description": "The location of the company or organization."
},
"period": {
"type": "string",
"description": "The overall period of time at the company. When multiple roles are used, this should reflect the total tenure."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the company or organization, if any."
},
"description": {
"type": "string",
"description": "The description of the experience. This should be a HTML-formatted string."
},
"roles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the role. Usually generated as a UUID."
},
"position": {
"type": "string",
"description": "The position or job title for this role."
},
"period": { "type": "string", "description": "The period of time this role was held." },
"description": {
"type": "string",
"description": "The description of this specific role. This should be a HTML-formatted string."
}
},
"required": ["id", "position", "period", "description"]
},
"description": "List of individual roles held at this company to show career progression."
}
},
"required": [
"id",
"hidden",
"company",
"position",
"location",
"period",
"website",
"description",
"roles"
]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"school": {
"type": "string",
"minLength": 1,
"description": "The name of the school or institution."
},
"degree": { "type": "string", "description": "The degree or qualification obtained." },
"area": { "type": "string", "description": "The area of study or specialization." },
"grade": { "type": "string", "description": "The grade or score achieved." },
"location": { "type": "string", "description": "The location of the school or institution." },
"period": {
"type": "string",
"description": "The period of time the education was obtained over."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the school or institution, if any."
},
"description": {
"type": "string",
"description": "The description of the education. This should be a HTML-formatted string."
}
},
"required": [
"id",
"hidden",
"school",
"degree",
"area",
"grade",
"location",
"period",
"website",
"description"
]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the project." },
"period": {
"type": "string",
"description": "The period of time the project was worked on."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the project, if any."
},
"description": {
"type": "string",
"description": "The description of the project. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "name", "period", "website", "description"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"iconColor": {
"type": "string",
"description": "Custom color for the icon, defined as rgba(r, g, b, a). Leave blank to use the template default icon color."
},
"name": { "type": "string", "minLength": 1, "description": "The name of the skill." },
"proficiency": {
"type": "string",
"description": "The proficiency level of the skill. Can be any text, such as 'Beginner', 'Intermediate', 'Advanced', etc."
},
"level": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "The proficiency level of the skill, defined as a number between 0 and 5. If set to 0, the icons displaying the level will be hidden."
},
"keywords": {
"type": "array",
"items": { "type": "string" },
"description": "The keywords associated with the skill, if any. These are displayed as tags below the name."
}
},
"required": ["id", "hidden", "icon", "iconColor", "name", "proficiency", "level", "keywords"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"language": {
"type": "string",
"minLength": 1,
"description": "The name of the language the author knows."
},
"fluency": {
"type": "string",
"description": "The fluency level of the language. Can be any text, such as 'Native', 'Fluent', 'Conversational', etc. or can also be a CEFR level (A1, A2, B1, B2, C1, C2)."
},
"level": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "The proficiency level of the language, defined as a number between 0 and 5. If set to 0, the icons displaying the level will be hidden."
}
},
"required": ["id", "hidden", "language", "fluency", "level"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"iconColor": {
"type": "string",
"description": "Custom color for the icon, defined as rgba(r, g, b, a). Leave blank to use the template default icon color."
},
"name": {
"type": "string",
"minLength": 1,
"description": "The name of the interest/hobby."
},
"keywords": {
"type": "array",
"items": { "type": "string" },
"description": "The keywords associated with the interest/hobby, if any. These are displayed as tags below the name."
}
},
"required": ["id", "hidden", "icon", "iconColor", "name", "keywords"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"title": { "type": "string", "minLength": 1, "description": "The title of the award." },
"awarder": { "type": "string", "description": "The awarder of the award." },
"date": { "type": "string", "description": "The date when the award was received." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the award, if any."
},
"description": {
"type": "string",
"description": "The description of the award. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "title", "awarder", "date", "website", "description"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"title": {
"type": "string",
"minLength": 1,
"description": "The title of the certification."
},
"issuer": { "type": "string", "description": "The issuer of the certification." },
"date": { "type": "string", "description": "The date when the certification was received." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website of the certification, if any."
},
"description": {
"type": "string",
"description": "The description of the certification. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "title", "issuer", "date", "website", "description"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"title": { "type": "string", "minLength": 1, "description": "The title of the publication." },
"publisher": { "type": "string", "description": "The publisher of the publication." },
"date": { "type": "string", "description": "The date when the publication was published." },
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the publication, if any."
},
"description": {
"type": "string",
"description": "The description of the publication. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "title", "publisher", "date", "website", "description"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"organization": {
"type": "string",
"minLength": 1,
"description": "The name of the organization or company."
},
"location": {
"type": "string",
"description": "The location of the organization or company."
},
"period": {
"type": "string",
"description": "The period of time the author was volunteered at the organization or company."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The link to the organization or company, if any."
},
"description": {
"type": "string",
"description": "The description of the volunteer experience. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "organization", "location", "period", "website", "description"]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique identifier for the item. Usually generated as a UUID."
},
"hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." },
"name": {
"type": "string",
"minLength": 1,
"description": "The name of the reference, or a note such as 'Available upon request'."
},
"position": {
"type": "string",
"description": "The position or job title of the reference."
},
"website": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://)."
},
"label": {
"type": "string",
"description": "The label to display for the URL. Leave blank to display the URL as-is."
},
"inlineLink": {
"type": "boolean",
"description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom."
}
},
"required": ["url", "label", "inlineLink"],
"description": "The website or LinkedIn profile of the reference, if any."
},
"phone": { "type": "string", "description": "The phone number of the reference." },
"description": {
"type": "string",
"description": "The description of the reference. Can be used to display a quote, a testimonial, etc. This should be a HTML-formatted string."
}
},
"required": ["id", "hidden", "name", "position", "website", "phone", "description"]
}
]
},
"description": "The items to display in the custom section. Items follow the schema of the section type."
}
},
"required": ["title", "columns", "hidden", "id", "type", "items"]
},
"description": "Custom sections of the resume, such as a custom section for notes, etc."
},
"metadata": {
"type": "object",
"properties": {
"template": {
"enum": [
"azurill",
"bronzor",
"chikorita",
"ditgar",
"ditto",
"gengar",
"glalie",
"kakuna",
"lapras",
"leafish",
"meowth",
"onyx",
"pikachu",
"rhyhorn",
"scizor"
],
"type": "string",
"description": "The template to use for the resume. Determines the overall design and appearance of the resume."
},
"layout": {
"type": "object",
"properties": {
"sidebarWidth": {
"type": "number",
"minimum": 10,
"maximum": 50,
"description": "The width of the sidebar column, defined as a percentage of the page width."
},
"pages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fullWidth": {
"type": "boolean",
"description": "Whether the layout of the page should be full width. If true, the main column will span the entire width of the page. This means that there should be no items in the sidebar column."
},
"main": {
"type": "array",
"items": { "type": "string" },
"description": "The items to display in the main column of the page. A string array of section IDs (experience, education, projects, skills, languages, interests, awards, certifications, publications, volunteer, references, profiles, summary or UUIDs for custom sections)."
},
"sidebar": {
"type": "array",
"items": { "type": "string" },
"description": "The items to display in the sidebar column of the page. A string array of section IDs (experience, education, projects, skills, languages, interests, awards, certifications, publications, volunteer, references, profiles, summary or UUIDs for custom sections)."
}
},
"required": ["fullWidth", "main", "sidebar"]
},
"description": "The pages to display in the layout."
}
},
"required": ["sidebarWidth", "pages"],
"description": "The layout of the resume. Determines the structure and arrangement of the sections on the resume."
},
"page": {
"type": "object",
"properties": {
"gapX": {
"type": "number",
"minimum": 0,
"description": "The horizontal gap between the sections of the page, defined in points (pt)."
},
"gapY": {
"type": "number",
"minimum": 0,
"description": "The vertical gap between the sections of the page, defined in points (pt)."
},
"marginX": {
"type": "number",
"minimum": 0,
"description": "The horizontal margin of the page, defined in points (pt)."
},
"marginY": {
"type": "number",
"minimum": 0,
"description": "The vertical margin of the page, defined in points (pt)."
},
"format": {
"enum": ["a4", "letter"],
"type": "string",
"description": "The format of the page. Can be 'a4' or 'letter'."
},
"locale": {
"type": "string",
"description": "The locale of the page. Used for displaying pre-translated section headings, if not overridden."
},
"hideIcons": { "type": "boolean", "description": "Whether to hide the icons of the sections." }
},
"required": ["gapX", "gapY", "marginX", "marginY", "format", "locale", "hideIcons"],
"description": "The page settings of the resume. Determines the margins, format, and locale of the resume."
},
"design": {
"type": "object",
"properties": {
"level": {
"type": "object",
"properties": {
"icon": {
"type": "string",
"description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available."
},
"type": {
"enum": ["hidden", "circle", "square", "rectangle", "rectangle-full", "progress-bar", "icon"],
"type": "string",
"description": "The type of the level design. 'hidden' will hide the level design, 'circle' will display a circle, 'square' will display a square, 'rectangle' will display a rectangle, 'rectangle-full' will display a full rectangle, 'progress-bar' will display a progress bar, and 'icon' will display an icon. If 'icon' is selected, the icon to display should be specified in the 'icon' field."
}
},
"required": ["icon", "type"]
},
"colors": {
"type": "object",
"properties": {
"primary": {
"type": "string",
"description": "The primary color of the design, defined as rgba(r, g, b, a)."
},
"text": {
"type": "string",
"description": "The text color of the design, defined as rgba(r, g, b, a). Usually set to black: rgba(0, 0, 0, 1)."
},
"background": {
"type": "string",
"description": "The background color of the design, defined as rgba(r, g, b, a). Usually set to white: rgba(255, 255, 255, 1)."
}
},
"required": ["primary", "text", "background"]
}
},
"required": ["level", "colors"],
"description": "The design settings of the resume. Determines the colors, level designs, and typography of the resume."
},
"typography": {
"type": "object",
"properties": {
"body": {
"type": "object",
"properties": {
"fontFamily": {
"type": "string",
"description": "The family of the font to use. Must be a supported resume font."
},
"fontWeights": {
"type": "array",
"items": {
"enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"],
"type": "string"
},
"description": "The weight of the font, defined as a number between 100 and 900. Default to 400 when unsure if the weight is available in the font."
},
"fontSize": {
"type": "number",
"minimum": 6,
"maximum": 24,
"description": "The size of the font to use, defined in points (pt)."
},
"lineHeight": {
"type": "number",
"minimum": 0.5,
"maximum": 4,
"description": "The line height of the font to use, defined as a multiplier of the font size (e.g. 1.5 for 1.5x)."
}
},
"required": ["fontFamily", "fontWeights", "fontSize", "lineHeight"],
"description": "The typography for the body of the resume."
},
"heading": {
"type": "object",
"properties": {
"fontFamily": {
"type": "string",
"description": "The family of the font to use. Must be a supported resume font."
},
"fontWeights": {
"type": "array",
"items": {
"enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"],
"type": "string"
},
"description": "The weight of the font, defined as a number between 100 and 900. Default to 400 when unsure if the weight is available in the font."
},
"fontSize": {
"type": "number",
"minimum": 6,
"maximum": 24,
"description": "The size of the font to use, defined in points (pt)."
},
"lineHeight": {
"type": "number",
"minimum": 0.5,
"maximum": 4,
"description": "The line height of the font to use, defined as a multiplier of the font size (e.g. 1.5 for 1.5x)."
}
},
"required": ["fontFamily", "fontWeights", "fontSize", "lineHeight"],
"description": "The typography for the headings of the resume."
}
},
"required": ["body", "heading"],
"description": "The typography settings of the resume. Determines the fonts and sizes of the body and headings of the resume."
},
"notes": {
"type": "string",
"description": "Personal notes for the resume. Can be used to add any additional information or instructions for the resume. These notes are not displayed on the resume, they are only visible to the author of the resume when editing the resume. This should be a HTML-formatted string."
}
},
"required": ["template", "layout", "page", "design", "typography", "notes"],
"description": "Metadata for the resume, such as template, layout, typography, etc. This section describes the overall design and appearance of the resume."
}
},
"required": ["picture", "basics", "summary", "sections", "customSections", "metadata"],
"additionalProperties": {}
}
}
},
"security": [{ "apiKey": [] }],
"openapi": "3.1.1",
"paths": {
"/ai/test-connection": {
"post": {
"operationId": "testAiConnection",
"summary": "Test AI provider connection",
"description": "Validates the connection to an AI provider by sending a simple test prompt. Requires the provider type, model name, API key, and an optional base URL. Supported providers: OpenAI, Anthropic, Google Gemini, Ollama, OpenRouter, and Vercel AI Gateway. Requires authentication.",
"tags": ["AI"],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"provider": {
"enum": ["openai", "anthropic", "gemini", "vercel-ai-gateway", "openrouter", "ollama"],
"type": "string"
},
"model": { "type": "string", "minLength": 1 },
"apiKey": { "type": "string", "minLength": 1 },
"baseURL": { "type": "string", "default": "" }
},
"required": ["provider", "model", "apiKey"]
}
}
}
},
"responses": {
"200": {
"description": "The AI provider connection was successful.",
"content": { "application/json": { "schema": { "anyOf": [{}, { "not": {} }] } } }
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_REQUEST" },
"status": { "const": 400 },
"message": { "type": "string", "default": "Invalid AI provider configuration." },
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
},
"502": {
"description": "502",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_GATEWAY" },
"status": { "const": 502 },
"message": {
"type": "string",
"default": "The AI provider returned an error or is unreachable."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
}
},
"/ai/parse-pdf": {
"post": {
"operationId": "parseResumePdf",
"summary": "Parse a PDF file into resume data",
"description": "Extracts structured resume data from a PDF file using the specified AI provider. The file should be sent as a base64-encoded string along with AI provider credentials. Returns a complete ResumeData object. Requires authentication.",
"tags": ["AI"],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"provider": {
"enum": ["openai", "anthropic", "gemini", "vercel-ai-gateway", "openrouter", "ollama"],
"type": "string"
},
"model": { "type": "string", "minLength": 1 },
"apiKey": { "type": "string", "minLength": 1 },
"baseURL": { "type": "string", "default": "" },
"file": {
"type": "object",
"properties": { "name": { "type": "string" }, "data": { "type": "string", "maxLength": 13981018 } },
"required": ["name", "data"]
}
},
"required": ["provider", "model", "apiKey", "file"]
}
}
}
},
"responses": {
"200": {
"description": "The PDF was successfully parsed into structured resume data.",
"content": { "application/json": { "schema": { "anyOf": [{}, { "not": {} }] } } }
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_REQUEST" },
"status": { "const": 400 },
"message": {
"type": "string",
"default": "The AI returned an improperly formatted structure."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
},
"502": {
"description": "502",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_GATEWAY" },
"status": { "const": 502 },
"message": {
"type": "string",
"default": "The AI provider returned an error or is unreachable."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
}
},
"/ai/parse-docx": {
"post": {
"operationId": "parseResumeDocx",
"summary": "Parse a DOCX file into resume data",
"description": "Extracts structured resume data from a DOCX or DOC file using the specified AI provider. The file should be sent as a base64-encoded string along with AI provider credentials and the document's media type. Returns a complete ResumeData object. Requires authentication.",
"tags": ["AI"],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"provider": {
"enum": ["openai", "anthropic", "gemini", "vercel-ai-gateway", "openrouter", "ollama"],
"type": "string"
},
"model": { "type": "string", "minLength": 1 },
"apiKey": { "type": "string", "minLength": 1 },
"baseURL": { "type": "string", "default": "" },
"file": {
"type": "object",
"properties": { "name": { "type": "string" }, "data": { "type": "string", "maxLength": 13981018 } },
"required": ["name", "data"]
},
"mediaType": {
"enum": [
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
],
"type": "string"
}
},
"required": ["provider", "model", "apiKey", "file", "mediaType"]
}
}
}
},
"responses": {
"200": {
"description": "The DOCX was successfully parsed into structured resume data.",
"content": { "application/json": { "schema": { "anyOf": [{}, { "not": {} }] } } }
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_REQUEST" },
"status": { "const": 400 },
"message": {
"type": "string",
"default": "The AI returned an improperly formatted structure."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
},
"502": {
"description": "502",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_GATEWAY" },
"status": { "const": 502 },
"message": {
"type": "string",
"default": "The AI provider returned an error or is unreachable."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
}
},
"/ai/chat": {
"post": {
"operationId": "aiChat",
"summary": "Chat with AI to modify resume",
"description": "Streams a chat response from the configured AI provider. The LLM can call the patch_resume tool to generate JSON Patch operations that modify the resume. Requires authentication and AI provider credentials.",
"tags": ["AI"],
"responses": {
"200": {
"description": "OK",
"content": { "application/json": { "schema": { "anyOf": [{}, { "not": {} }] } } }
}
}
}
},
"/ai/analyze-resume": {
"post": {
"operationId": "analyzeResume",
"summary": "Analyze resume and persist latest analysis",
"description": "Uses AI to analyze the current resume and returns a structured analysis with scorecard, strengths, and improvement suggestions. The latest analysis is persisted and can be fetched later. Requires authentication and AI credentials.",
"tags": ["AI"],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"provider": {
"enum": ["openai", "anthropic", "gemini", "vercel-ai-gateway", "openrouter", "ollama"],
"type": "string"
},
"model": { "type": "string", "minLength": 1 },
"apiKey": { "type": "string", "minLength": 1 },
"baseURL": { "type": "string", "default": "" },
"resumeId": { "type": "string" },
"resumeData": { "$ref": "#/components/schemas/ResumeData" }
},
"required": ["provider", "model", "apiKey", "resumeId", "resumeData"]
}
}
}
},
"responses": {
"200": {
"description": "Structured resume analysis returned and persisted successfully.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"overallScore": { "type": "integer", "minimum": 0, "maximum": 100 },
"scorecard": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"dimension": { "type": "string", "minLength": 1 },
"score": { "type": "integer", "minimum": 0, "maximum": 100 },
"rationale": { "type": "string", "minLength": 1 }
},
"required": ["dimension", "score", "rationale"]
}
},
"suggestions": {
"type": "array",
"maxItems": 10,
"items": {
"type": "object",
"properties": {
"title": { "type": "string", "minLength": 1 },
"impact": { "enum": ["high", "medium", "low"], "type": "string" },
"why": { "type": "string", "minLength": 1 },
"exampleRewrite": { "anyOf": [{ "type": "string" }, { "type": "null" }] },
"copyPrompt": { "type": "string", "minLength": 1 }
},
"required": ["title", "impact", "why", "exampleRewrite", "copyPrompt"]
}
},
"strengths": { "type": "array", "maxItems": 10, "items": { "type": "string", "minLength": 1 } },
"updatedAt": { "type": "string", "format": "date-time", "x-native-type": "date" },
"modelMeta": {
"type": "object",
"properties": {
"provider": { "type": "string", "minLength": 1 },
"model": { "type": "string", "minLength": 1 }
},
"required": ["provider", "model"]
}
},
"required": ["overallScore", "scorecard", "suggestions", "strengths", "updatedAt", "modelMeta"]
}
}
}
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_REQUEST" },
"status": { "const": 400 },
"message": {
"type": "string",
"default": "The AI returned an improperly formatted structure."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
},
"502": {
"description": "502",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "BAD_GATEWAY" },
"status": { "const": 502 },
"message": {
"type": "string",
"default": "The AI provider returned an error or is unreachable."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
}
},
"/auth/providers": {
"get": {
"operationId": "listAuthProviders",
"summary": "List authentication providers",
"description": "Returns a list of all authentication providers enabled on this Reactive Resume instance, along with their display names. Possible providers include password-based credentials, Google, GitHub, LinkedIn, and custom OAuth. No authentication required.",
"tags": ["Authentication"],
"responses": {
"200": {
"description": "A map of enabled authentication provider identifiers to their display names.",
"content": { "application/json": { "schema": { "anyOf": [{}, { "not": {} }] } } }
}
}
}
},
"/auth/account": {
"delete": {
"operationId": "deleteAccount",
"summary": "Delete user account",
"description": "Permanently deletes the authenticated user's account, including all resumes, uploaded files (profile pictures, screenshots, PDFs), and associated data. This action is irreversible. Requires authentication.",
"tags": ["Authentication"],
"responses": {
"200": {
"description": "The user account and all associated data have been successfully deleted.",
"content": { "application/json": { "schema": { "anyOf": [{}, { "not": {} }] } } }
}
}
}
},
"/flags": {
"get": {
"operationId": "getFeatureFlags",
"summary": "Get feature flags",
"description": "Returns the current feature flags for this Reactive Resume instance. Feature flags control instance-wide settings such as whether new user signups or email-based authentication are disabled. No authentication required.",
"tags": ["Feature Flags"],
"responses": {
"200": {
"description": "The current feature flags for this instance.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"disableSignups": {
"type": "boolean",
"description": "Whether new user signups are disabled on this instance."
},
"disableEmailAuth": {
"type": "boolean",
"description": "Whether email-based authentication is disabled on this instance."
},
"showSponsors": {
"type": "boolean",
"description": "Whether sponsor placements are shown on this instance."
}
},
"required": ["disableSignups", "disableEmailAuth", "showSponsors"]
}
}
}
}
}
}
},
"/resumes/tags": {
"get": {
"operationId": "listResumeTags",
"summary": "List all resume tags",
"description": "Returns a sorted list of all unique tags across the authenticated user's resumes. Useful for populating tag filters in the dashboard. Requires authentication.",
"tags": ["Resumes"],
"responses": {
"200": {
"description": "A sorted array of unique tag strings.",
"content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } }
}
}
}
},
"/resumes/{id}/statistics": {
"get": {
"operationId": "getResumeStatistics",
"summary": "Get resume statistics",
"description": "Returns view and download statistics for the specified resume, including total counts and the timestamps of the last view and download. Requires authentication.",
"tags": ["Resume Statistics"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The unique identifier of the resume." }
}
],
"responses": {
"200": {
"description": "The resume's view and download statistics.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"isPublic": { "type": "boolean", "description": "Whether the resume is currently public." },
"views": { "type": "number", "description": "Total number of times the resume has been viewed." },
"downloads": {
"type": "number",
"description": "Total number of times the resume has been downloaded."
},
"lastViewedAt": {
"anyOf": [
{ "type": "string", "format": "date-time", "x-native-type": "date" },
{ "type": "null" }
],
"description": "Timestamp of the last view, or null if never viewed."
},
"lastDownloadedAt": {
"anyOf": [
{ "type": "string", "format": "date-time", "x-native-type": "date" },
{ "type": "null" }
],
"description": "Timestamp of the last download, or null if never downloaded."
}
},
"required": ["isPublic", "views", "downloads", "lastViewedAt", "lastDownloadedAt"]
}
}
}
}
}
}
},
"/resumes/{id}/analysis": {
"get": {
"operationId": "getResumeAnalysis",
"summary": "Get latest resume analysis",
"description": "Returns the latest persisted AI analysis for the specified resume, if one exists. Requires authentication.",
"tags": ["Resume Analysis"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The unique identifier of the resume." }
}
],
"responses": {
"200": {
"description": "The latest persisted resume analysis, or null if no analysis has been saved yet.",
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"type": "object",
"properties": {
"overallScore": { "type": "integer", "minimum": 0, "maximum": 100 },
"scorecard": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"dimension": { "type": "string", "minLength": 1 },
"score": { "type": "integer", "minimum": 0, "maximum": 100 },
"rationale": { "type": "string", "minLength": 1 }
},
"required": ["dimension", "score", "rationale"]
}
},
"suggestions": {
"type": "array",
"maxItems": 10,
"items": {
"type": "object",
"properties": {
"title": { "type": "string", "minLength": 1 },
"impact": { "enum": ["high", "medium", "low"], "type": "string" },
"why": { "type": "string", "minLength": 1 },
"exampleRewrite": { "anyOf": [{ "type": "string" }, { "type": "null" }] },
"copyPrompt": { "type": "string", "minLength": 1 }
},
"required": ["title", "impact", "why", "exampleRewrite", "copyPrompt"]
}
},
"strengths": { "type": "array", "maxItems": 10, "items": { "type": "string", "minLength": 1 } },
"updatedAt": { "type": "string", "format": "date-time", "x-native-type": "date" },
"modelMeta": {
"type": "object",
"properties": {
"provider": { "type": "string", "minLength": 1 },
"model": { "type": "string", "minLength": 1 }
},
"required": ["provider", "model"]
}
},
"required": ["overallScore", "scorecard", "suggestions", "strengths", "updatedAt", "modelMeta"]
},
{ "type": "null" }
]
}
}
}
}
}
}
},
"/resumes": {
"get": {
"operationId": "listResumes",
"summary": "List all resumes",
"description": "Returns a list of all resumes belonging to the authenticated user. Results can be filtered by tags and sorted by last updated date, creation date, or name. Resume data is not included in the response for performance; use the get endpoint to fetch full resume data. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "tags",
"in": "query",
"schema": { "type": "array", "items": { "type": "string" }, "default": [] },
"style": "deepObject",
"explode": true,
"allowEmptyValue": true,
"allowReserved": true
},
{
"name": "sort",
"in": "query",
"schema": { "enum": ["lastUpdatedAt", "createdAt", "name"], "type": "string", "default": "lastUpdatedAt" },
"allowEmptyValue": true,
"allowReserved": true
}
],
"responses": {
"200": {
"description": "A list of resumes with their metadata (without full resume data).",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "The ID of the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": {
"type": "array",
"items": { "type": "string" },
"description": "The tags of the resume."
},
"isPublic": { "type": "boolean", "description": "Whether the resume is public." },
"isLocked": { "type": "boolean", "description": "Whether the resume is locked." },
"createdAt": {
"type": "string",
"format": "date-time",
"x-native-type": "date",
"description": "The date and time the resume was created."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"x-native-type": "date",
"description": "The date and time the resume was last updated."
}
},
"required": ["id", "name", "slug", "tags", "isPublic", "isLocked", "createdAt", "updatedAt"]
}
}
}
}
}
}
},
"post": {
"operationId": "createResume",
"summary": "Create a new resume",
"description": "Creates a new resume with the given name, slug, and tags. Optionally initializes the resume with sample data by setting withSampleData to true. The slug must be unique across the user's resumes. Returns the ID of the newly created resume. Requires authentication.",
"tags": ["Resumes"],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": { "type": "array", "items": { "type": "string" }, "description": "The tags of the resume." },
"withSampleData": { "type": "boolean", "default": false }
},
"required": ["name", "slug", "tags"]
}
}
}
},
"responses": {
"200": {
"description": "The ID of the newly created resume.",
"content": {
"application/json": { "schema": { "type": "string", "description": "The ID of the created resume." } }
}
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "RESUME_SLUG_ALREADY_EXISTS" },
"status": { "const": 400 },
"message": { "type": "string", "default": "A resume with this slug already exists." },
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
}
},
"/resumes/{id}": {
"get": {
"operationId": "getResume",
"summary": "Get resume by ID",
"description": "Returns a single resume with its full data, identified by its unique ID. Only resumes belonging to the authenticated user can be retrieved. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"responses": {
"200": {
"description": "The resume with its full data.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "The ID of the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": {
"type": "array",
"items": { "type": "string" },
"description": "The tags of the resume."
},
"isPublic": { "type": "boolean", "description": "Whether the resume is public." },
"isLocked": { "type": "boolean", "description": "Whether the resume is locked." },
"data": { "$ref": "#/components/schemas/ResumeData" },
"hasPassword": { "type": "boolean" }
},
"required": ["id", "name", "slug", "tags", "isPublic", "isLocked", "data", "hasPassword"]
}
}
}
}
}
},
"put": {
"operationId": "updateResume",
"summary": "Update a resume",
"description": "Updates one or more fields of a resume identified by its ID. All fields are optional; only provided fields will be updated. Locked resumes cannot be updated. Requires authentication.",
"tags": ["Resumes"],
"parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": { "type": "array", "items": { "type": "string" }, "description": "The tags of the resume." },
"data": { "$ref": "#/components/schemas/ResumeData" },
"isPublic": { "type": "boolean", "description": "Whether the resume is public." }
}
}
}
}
},
"responses": {
"200": {
"description": "The updated resume with its full data.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "The ID of the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": {
"type": "array",
"items": { "type": "string" },
"description": "The tags of the resume."
},
"isPublic": { "type": "boolean", "description": "Whether the resume is public." },
"isLocked": { "type": "boolean", "description": "Whether the resume is locked." },
"data": { "$ref": "#/components/schemas/ResumeData" },
"hasPassword": { "type": "boolean" }
},
"required": ["id", "name", "slug", "tags", "isPublic", "isLocked", "data", "hasPassword"]
}
}
}
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "RESUME_SLUG_ALREADY_EXISTS" },
"status": { "const": 400 },
"message": { "type": "string", "default": "A resume with this slug already exists." },
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
},
"patch": {
"operationId": "patchResume",
"summary": "Patch resume data",
"description": "Applies JSON Patch (RFC 6902) operations to partially update a resume's data. This allows small, targeted changes (e.g. updating a single field) without sending the entire resume object. Locked resumes cannot be patched. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume to patch." }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"operations": {
"type": "array",
"minItems": 1,
"items": {
"anyOf": [
{
"type": "object",
"properties": { "op": { "const": "add" }, "path": { "type": "string" }, "value": {} },
"required": ["op", "path"]
},
{
"type": "object",
"properties": { "op": { "const": "remove" }, "path": { "type": "string" } },
"required": ["op", "path"]
},
{
"type": "object",
"properties": { "op": { "const": "replace" }, "path": { "type": "string" }, "value": {} },
"required": ["op", "path"]
},
{
"type": "object",
"properties": {
"op": { "const": "move" },
"path": { "type": "string" },
"from": { "type": "string" }
},
"required": ["op", "path", "from"]
},
{
"type": "object",
"properties": {
"op": { "const": "copy" },
"path": { "type": "string" },
"from": { "type": "string" }
},
"required": ["op", "path", "from"]
},
{
"type": "object",
"properties": { "op": { "const": "test" }, "path": { "type": "string" }, "value": {} },
"required": ["op", "path"]
}
]
},
"description": "An array of JSON Patch (RFC 6902) operations to apply to the resume data."
}
},
"required": ["operations"]
}
}
}
},
"responses": {
"200": {
"description": "The patched resume with its full data.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "The ID of the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": {
"type": "array",
"items": { "type": "string" },
"description": "The tags of the resume."
},
"isPublic": { "type": "boolean", "description": "Whether the resume is public." },
"isLocked": { "type": "boolean", "description": "Whether the resume is locked." },
"data": { "$ref": "#/components/schemas/ResumeData" },
"hasPassword": { "type": "boolean" }
},
"required": ["id", "name", "slug", "tags", "isPublic", "isLocked", "data", "hasPassword"]
}
}
}
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "INVALID_PATCH_OPERATIONS" },
"status": { "const": 400 },
"message": {
"type": "string",
"default": "The patch operations are invalid or produced an invalid resume."
},
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
},
"delete": {
"operationId": "deleteResume",
"summary": "Delete a resume",
"description": "Permanently deletes a resume and its associated files (screenshots, PDFs) from storage. Locked resumes cannot be deleted; unlock the resume first. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"responses": {
"200": {
"description": "The resume and its associated files were deleted successfully.",
"content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } }
}
}
}
},
"/resumes/{username}/{slug}": {
"get": {
"operationId": "getResumeBySlug",
"summary": "Get public resume by username and slug",
"description": "Returns a publicly shared resume identified by the owner's username and the resume's slug. If the resume is password-protected and the viewer has not yet verified the password, a 401 error with code NEED_PASSWORD is returned. No authentication required for public resumes; if authenticated as the owner, private resumes are also accessible.",
"tags": ["Resume Sharing"],
"parameters": [
{ "name": "username", "in": "path", "required": true, "schema": { "type": "string" } },
{ "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } }
],
"responses": {
"200": {
"description": "The public resume with its full data.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "The ID of the resume." },
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": {
"type": "array",
"items": { "type": "string" },
"description": "The tags of the resume."
},
"isPublic": { "type": "boolean", "description": "Whether the resume is public." },
"isLocked": { "type": "boolean", "description": "Whether the resume is locked." },
"data": { "$ref": "#/components/schemas/ResumeData" }
},
"required": ["id", "name", "slug", "tags", "isPublic", "isLocked", "data"]
}
}
}
}
}
}
},
"/resumes/import": {
"post": {
"operationId": "importResume",
"summary": "Import a resume",
"description": "Creates a new resume from an existing ResumeData object (e.g. from a previously exported JSON file). A random name and slug are generated automatically. Returns the ID of the imported resume. Requires authentication.",
"tags": ["Resumes"],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": { "data": { "$ref": "#/components/schemas/ResumeData" } },
"required": ["data"]
}
}
}
},
"responses": {
"200": {
"description": "The ID of the imported resume.",
"content": {
"application/json": { "schema": { "type": "string", "description": "The ID of the imported resume." } }
}
},
"400": {
"description": "400",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"defined": { "const": true },
"code": { "const": "RESUME_SLUG_ALREADY_EXISTS" },
"status": { "const": 400 },
"message": { "type": "string", "default": "A resume with this slug already exists." },
"data": {}
},
"required": ["defined", "code", "status", "message"]
},
{
"type": "object",
"properties": {
"defined": { "const": false },
"code": { "type": "string" },
"status": { "type": "number" },
"message": { "type": "string" },
"data": {}
},
"required": ["defined", "code", "status", "message"]
}
]
}
}
}
}
}
}
},
"/resumes/{id}/lock": {
"post": {
"operationId": "setResumeLocked",
"summary": "Set resume lock status",
"description": "Toggles the locked status of a resume. When locked, a resume cannot be updated, patched, or deleted. Useful for protecting finalized resumes from accidental edits. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": { "isLocked": { "type": "boolean", "description": "Whether the resume is locked." } },
"required": ["isLocked"]
}
}
}
},
"responses": {
"200": {
"description": "The resume lock status was updated successfully.",
"content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } }
}
}
}
},
"/resumes/{id}/password": {
"put": {
"operationId": "setResumePassword",
"summary": "Set resume password",
"description": "Sets or updates a password on a resume. When a password is set, viewers of the public resume must enter the password before the resume data is revealed. The password must be between 6 and 64 characters. Requires authentication.",
"tags": ["Resume Sharing"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": { "password": { "type": "string", "minLength": 6, "maxLength": 64 } },
"required": ["password"]
}
}
}
},
"responses": {
"200": {
"description": "The resume password was set successfully.",
"content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } }
}
}
},
"delete": {
"operationId": "removeResumePassword",
"summary": "Remove resume password",
"description": "Removes password protection from a resume. After removal, the resume (if public) can be viewed without entering a password. Requires authentication.",
"tags": ["Resume Sharing"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"responses": {
"200": {
"description": "The resume password was removed successfully.",
"content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } }
}
}
}
},
"/resumes/{username}/{slug}/password/verify": {
"post": {
"operationId": "verifyResumePassword",
"summary": "Verify resume password",
"description": "Verifies a password for a password-protected public resume. On success, the viewer is granted access to view the resume data for the duration of their session. No authentication required.",
"tags": ["Resume Sharing"],
"parameters": [
{
"name": "username",
"in": "path",
"required": true,
"schema": { "type": "string", "minLength": 1, "description": "The username of the resume owner." }
},
{
"name": "slug",
"in": "path",
"required": true,
"schema": { "type": "string", "minLength": 1, "description": "The slug of the resume." }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"password": { "type": "string", "minLength": 1, "description": "The password to verify." }
},
"required": ["password"]
}
}
}
},
"responses": {
"200": {
"description": "The password was verified successfully and access has been granted.",
"content": { "application/json": { "schema": { "type": "boolean" } } }
}
}
}
},
"/resumes/{id}/duplicate": {
"post": {
"operationId": "duplicateResume",
"summary": "Duplicate a resume",
"description": "Creates a copy of an existing resume with the same data. Optionally override the name, slug, and tags for the duplicate. If not provided, the original resume's name, slug, and tags are used. Returns the ID of the duplicated resume. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1, "description": "The name of the resume." },
"slug": { "type": "string", "minLength": 1, "description": "The slug of the resume." },
"tags": { "type": "array", "items": { "type": "string" }, "description": "The tags of the resume." }
},
"required": ["name", "slug", "tags"]
}
}
}
},
"responses": {
"200": {
"description": "The ID of the duplicated resume.",
"content": {
"application/json": { "schema": { "type": "string", "description": "The ID of the duplicated resume." } }
}
}
}
}
},
"/resumes/{id}/pdf": {
"get": {
"operationId": "downloadResumePdf",
"summary": "Download resume as PDF",
"description": "Generates a PDF for the specified resume and returns it as a forced download. Only resumes belonging to the authenticated user can be downloaded. Requires authentication.",
"tags": ["Resumes"],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": { "type": "string", "description": "The ID of the resume." }
}
],
"responses": {
"200": {
"description": "The generated resume PDF.",
"headers": { "content-disposition": { "schema": { "type": "string" }, "required": true } },
"content": { "application/pdf": { "schema": { "type": "string", "contentMediaType": "application/pdf" } } }
}
}
}
},
"/statistics/users": {
"get": {
"operationId": "getUserCount",
"summary": "Get total number of users",
"description": "Returns the total number of registered users on this Reactive Resume instance. The count is cached for up to 6 hours for performance. No authentication required.",
"tags": ["Platform Statistics"],
"responses": {
"200": {
"description": "The total number of registered users.",
"content": {
"application/json": {
"schema": { "type": "number", "description": "The total number of registered users." }
}
}
}
}
}
},
"/statistics/resumes": {
"get": {
"operationId": "getResumeCount",
"summary": "Get total number of resumes",
"description": "Returns the total number of resumes created on this Reactive Resume instance. The count is cached for up to 6 hours for performance. No authentication required.",
"tags": ["Platform Statistics"],
"responses": {
"200": {
"description": "The total number of resumes created.",
"content": {
"application/json": {
"schema": { "type": "number", "description": "The total number of resumes created." }
}
}
}
}
}
},
"/statistics/github/stars": {
"get": {
"operationId": "getGitHubStarCount",
"summary": "Get GitHub star count",
"description": "Returns the number of GitHub stars for the Reactive Resume repository. The count is cached for up to 6 hours and falls back to a last-known value if the GitHub API is unavailable. No authentication required.",
"tags": ["Platform Statistics"],
"responses": {
"200": {
"description": "The number of GitHub stars for the Reactive Resume repository.",
"content": {
"application/json": { "schema": { "type": "number", "description": "The number of GitHub stars." } }
}
}
}
}
}
}
}