From 7da5e2c0c2f096e89d283b1503b512d89c52dd1b Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Thu, 19 Mar 2026 10:07:19 +0100 Subject: [PATCH] update schema.json and openapi/spec.json --- docs/guides/exporting-your-resume.mdx | 2 +- docs/guides/json-resume-schema.mdx | 1093 +- docs/spec.json | 13973 +++++++++++++++++++++++- src/schema/schema.json | 81 +- 4 files changed, 14441 insertions(+), 708 deletions(-) diff --git a/docs/guides/exporting-your-resume.mdx b/docs/guides/exporting-your-resume.mdx index 11d2382a7..6d6e8f537 100644 --- a/docs/guides/exporting-your-resume.mdx +++ b/docs/guides/exporting-your-resume.mdx @@ -127,7 +127,7 @@ The exported JSON follows the Reactive Resume schema. Here's a high-level overvi ```json { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema", "type": "object", "properties": { "picture": { diff --git a/docs/guides/json-resume-schema.mdx b/docs/guides/json-resume-schema.mdx index 04eebde00..e021a2df1 100644 --- a/docs/guides/json-resume-schema.mdx +++ b/docs/guides/json-resume-schema.mdx @@ -24,7 +24,7 @@ The Reactive Resume JSON Schema is publicly available at: [https://rxresu.me/schema.json](https://rxresu.me/schema.json) -This endpoint returns a complete JSON Schema (draft 2020-12 compatible) that describes the structure of a Reactive Resume document. It includes: +This endpoint returns a complete JSON Schema (draft 07 compatible) that describes the structure of a Reactive Resume document. It includes: - **All resume sections**: basics, summary, experience, education, projects, skills, languages, interests, awards, certifications, publications, volunteer work, and references - **Custom sections**: user-defined sections with arbitrary content @@ -137,16 +137,13 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la ```json /schema.json lines expandable { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema", "type": "object", "properties": { "picture": { "type": "object", "properties": { - "hidden": { - "type": "boolean", - "description": "Whether to hide the picture from the resume." - }, + "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. Must be a valid URL with a protocol (http:// or https://)." @@ -212,36 +209,11 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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": { - "anyOf": [ - { - "type": "string", - "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - }, - { - "type": "string", - "const": "" - } - ], - "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." - }, + "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": { @@ -271,22 +243,10 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." - }, + "text": { "type": "string", "description": "The text to display for the custom field." }, "link": { "default": "", - "anyOf": [ - { - "type": "string", - "format": "uri" - }, - { - "type": "string", - "const": "" - } - ], + "type": "string", "description": "If the custom field should be a link, the URL to link to." } }, @@ -303,18 +263,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "summary": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the summary of the resume." - }, - "columns": { - "type": "number", - "description": "The number of columns the summary should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the summary from the resume." - }, + "title": { "type": "string", "description": "The title of the summary of the resume." }, + "columns": { "type": "number", "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." @@ -330,18 +281,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "profiles": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -351,9 +293,20 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "icon": { "type": "string", @@ -398,18 +351,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "experience": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -419,9 +363,20 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "company": { "type": "string", @@ -430,15 +385,12 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la }, "position": { "type": "string", - "description": "The position held at the company or organization." - }, - "location": { - "type": "string", - "description": "The location of the company or organization." + "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 period of time the author was employed at the company or organization." + "description": "The overall period of time at the company. When multiple roles are used, this should reflect the total tenure." }, "website": { "type": "object", @@ -459,9 +411,41 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "description": { "type": "string", "description": "The description of the experience. This should be a HTML-formatted string." + }, + "roles": { + "default": [], + "description": "Optional list of individual roles held at this company to show career progression.", + "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"], + "additionalProperties": false + } } }, - "required": ["id", "hidden", "company", "position", "location", "period", "website", "description"], + "required": [ + "id", + "hidden", + "company", + "position", + "location", + "period", + "website", + "description", + "roles" + ], "additionalProperties": false }, "description": "The items to display in the experience section." @@ -474,18 +458,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "education": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -495,35 +470,31 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." - }, + "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": { @@ -569,18 +540,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "projects": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -590,19 +552,23 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -637,18 +603,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "skills": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -658,19 +615,26 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." }, - "name": { - "type": "string", - "minLength": 1, - "description": "The name of the skill." - }, + "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." @@ -686,9 +650,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "default": [], "description": "The keywords associated with the skill, if any. These are displayed as tags below the name.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, "required": ["id", "hidden", "icon", "name", "proficiency", "level", "keywords"], @@ -704,18 +666,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "languages": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -725,9 +678,20 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "language": { "type": "string", @@ -759,18 +723,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "interests": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -780,26 +735,31 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." }, - "name": { - "type": "string", - "minLength": 1, - "description": "The name of the interest/hobby." - }, + "name": { "type": "string", "minLength": 1, "description": "The name of the interest/hobby." }, "keywords": { "default": [], "description": "The keywords associated with the interest/hobby, if any. These are displayed as tags below the name.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, "required": ["id", "hidden", "icon", "name", "keywords"], @@ -815,18 +775,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "awards": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -836,23 +787,24 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -887,18 +839,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "certifications": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -908,23 +851,24 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -959,18 +903,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "publications": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -980,23 +915,24 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -1031,18 +967,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "volunteer": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -1052,19 +979,27 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "organization": { "type": "string", "minLength": 1, "description": "The name of the organization or company." }, - "location": { - "type": "string", - "description": "The location 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." @@ -1103,18 +1038,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "references": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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": { @@ -1124,19 +1050,27 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." - }, + "position": { "type": "string", "description": "The position or job title of the reference." }, "website": { "type": "object", "properties": { @@ -1153,10 +1087,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "additionalProperties": false, "description": "The website or LinkedIn profile of the reference, if any." }, - "phone": { - "type": "string", - "description": "The phone number of the reference." - }, + "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." @@ -1195,18 +1126,9 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "items": { "type": "object", "properties": { - "title": { - "type": "string", - "description": "The title of the section." - }, - "columns": { - "type": "number", - "description": "The number of columns the section should span across." - }, - "hidden": { - "type": "boolean", - "description": "Whether to hide the section from the resume." - }, + "title": { "type": "string", "description": "The title of the section." }, + "columns": { "type": "number", "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." @@ -1214,6 +1136,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "type": { "type": "string", "enum": [ + "summary", "profiles", "experience", "education", @@ -1225,7 +1148,8 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "certifications", "publications", "volunteer", - "references" + "references", + "cover-letter" ], "description": "The type of items this custom section contains. Determines which item schema and form fields to use." }, @@ -1240,9 +1164,84 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false + }, + "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"], + "additionalProperties": false + }, + { + "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." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false + }, + "content": { + "type": "string", + "description": "The rich text content of the summary item. This should be a HTML-formatted string." + } + }, + "required": ["id", "hidden", "content"], + "additionalProperties": false + }, + { + "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." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "icon": { "type": "string", @@ -1284,9 +1283,20 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "company": { "type": "string", @@ -1295,15 +1305,12 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la }, "position": { "type": "string", - "description": "The position held at the company or organization." - }, - "location": { - "type": "string", - "description": "The location of the company or organization." + "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 period of time the author was employed at the company or organization." + "description": "The overall period of time at the company. When multiple roles are used, this should reflect the total tenure." }, "website": { "type": "object", @@ -1324,9 +1331,41 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "description": { "type": "string", "description": "The description of the experience. This should be a HTML-formatted string." + }, + "roles": { + "default": [], + "description": "Optional list of individual roles held at this company to show career progression.", + "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"], + "additionalProperties": false + } } }, - "required": ["id", "hidden", "company", "position", "location", "period", "website", "description"], + "required": [ + "id", + "hidden", + "company", + "position", + "location", + "period", + "website", + "description", + "roles" + ], "additionalProperties": false }, { @@ -1336,31 +1375,30 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." - }, + "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." @@ -1407,19 +1445,23 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -1451,19 +1493,26 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." }, - "name": { - "type": "string", - "minLength": 1, - "description": "The name of the skill." - }, + "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." @@ -1479,9 +1528,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "default": [], "description": "The keywords associated with the skill, if any. These are displayed as tags below the name.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, "required": ["id", "hidden", "icon", "name", "proficiency", "level", "keywords"], @@ -1494,9 +1541,20 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "language": { "type": "string", @@ -1525,26 +1583,31 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." }, - "name": { - "type": "string", - "minLength": 1, - "description": "The name of the interest/hobby." - }, + "name": { "type": "string", "minLength": 1, "description": "The name of the interest/hobby." }, "keywords": { "default": [], "description": "The keywords associated with the interest/hobby, if any. These are displayed as tags below the name.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, "required": ["id", "hidden", "icon", "name", "keywords"], @@ -1557,23 +1620,24 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -1605,23 +1669,24 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -1653,23 +1718,24 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, + "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": { @@ -1701,19 +1767,27 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "organization": { "type": "string", "minLength": 1, "description": "The name of the organization or company." }, - "location": { - "type": "string", - "description": "The location 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." @@ -1749,19 +1823,27 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "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." + "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, + "options": { + "description": "Display options for this item.", + "default": { "showLinkInTitle": false }, + "type": "object", + "properties": { + "showLinkInTitle": { + "default": false, + "description": "If true, the website URL is rendered as a hyperlink on the title instead of a separate link at the bottom.", + "type": "boolean" + } + }, + "required": ["showLinkInTitle"], + "additionalProperties": false }, "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." - }, + "position": { "type": "string", "description": "The position or job title of the reference." }, "website": { "type": "object", "properties": { @@ -1778,10 +1860,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "additionalProperties": false, "description": "The website or LinkedIn profile of the reference, if any." }, - "phone": { - "type": "string", - "description": "The phone number of the reference." - }, + "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." @@ -1811,8 +1890,8 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "azurill", "bronzor", "chikorita", - "ditto", "ditgar", + "ditto", "gengar", "glalie", "kakuna", @@ -1844,16 +1923,12 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la }, "main": { "type": "array", - "items": { - "type": "string" - }, + "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" - }, + "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)." } }, @@ -1870,10 +1945,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "css": { "type": "object", "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable custom CSS for the resume." - }, + "enabled": { "type": "boolean", "description": "Whether to enable custom CSS for the resume." }, "value": { "type": "string", "description": "The custom CSS to apply to the resume. This should be a valid CSS string." @@ -1907,9 +1979,10 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "description": "The vertical margin of the page, defined in points (pt)." }, "format": { + "default": "a4", "type": "string", "enum": ["a4", "letter", "free-form"], - "description": "The format of the page. Can be 'a4', 'letter', or 'free-form'." + "description": "The format of the page. Can be 'a4', 'letter' or 'free-form'." }, "locale": { "default": "en-US", @@ -1983,10 +2056,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "default": ["400"], "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.", "type": "array", - "items": { - "type": "string", - "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - } + "items": { "type": "string", "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] } }, "fontSize": { "default": 11, @@ -2018,10 +2088,7 @@ Below is the complete JSON Schema for Reactive Resume. You can also fetch the la "default": ["400"], "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.", "type": "array", - "items": { - "type": "string", - "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - } + "items": { "type": "string", "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] } }, "fontSize": { "default": 11, diff --git a/docs/spec.json b/docs/spec.json index 751210ab8..67f603211 100644 --- a/docs/spec.json +++ b/docs/spec.json @@ -1,7 +1,7 @@ { "info": { "title": "Reactive Resume", - "version": "5.0.9", + "version": "5.0.13", "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" } @@ -257,12 +257,12 @@ }, "position": { "type": "string", - "description": "The position held at the company or organization." + "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 period of time the author was employed at the company or organization." + "description": "The overall period of time at the company. When multiple roles are used, this should reflect the total tenure." }, "website": { "type": "object", @@ -282,6 +282,29 @@ "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": "Optional list of individual roles held at this company to show career progression." } }, "required": [ @@ -292,7 +315,8 @@ "location", "period", "website", - "description" + "description", + "roles" ] }, "description": "The items to display in the experience section." @@ -967,6 +991,7 @@ "references", "cover-letter" ], + "type": "string", "description": "The type of items this custom section contains. Determines which item schema and form fields to use." }, "items": { @@ -1105,7 +1130,7 @@ }, "position": { "type": "string", - "description": "The position held at the company or organization." + "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", @@ -1113,7 +1138,7 @@ }, "period": { "type": "string", - "description": "The period of time the author was employed at the company or organization." + "description": "The overall period of time at the company. When multiple roles are used, this should reflect the total tenure." }, "website": { "type": "object", @@ -1133,6 +1158,29 @@ "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": "Optional list of individual roles held at this company to show career progression." } }, "required": [ @@ -1143,7 +1191,8 @@ "location", "period", "website", - "description" + "description", + "roles" ] }, { @@ -1641,6 +1690,7 @@ "pikachu", "rhyhorn" ], + "type": "string", "description": "The template to use for the resume. Determines the overall design and appearance of the resume." }, "layout": { @@ -1717,6 +1767,7 @@ }, "format": { "enum": ["a4", "letter", "free-form"], + "type": "string", "description": "The format of the page. Can be 'a4', 'letter' or 'free-form'." }, "locale": { @@ -1740,6 +1791,7 @@ }, "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." } }, @@ -1779,7 +1831,10 @@ }, "fontWeights": { "type": "array", - "items": { "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] }, + "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": { @@ -1807,7 +1862,10 @@ }, "fontWeights": { "type": "array", - "items": { "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] }, + "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": { @@ -1859,7 +1917,10 @@ "schema": { "type": "object", "properties": { - "provider": { "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"] }, + "provider": { + "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"], + "type": "string" + }, "model": { "type": "string" }, "apiKey": { "type": "string" }, "baseURL": { "type": "string" } @@ -1926,13 +1987,16 @@ "schema": { "type": "object", "properties": { - "provider": { "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"] }, + "provider": { + "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"], + "type": "string" + }, "model": { "type": "string" }, "apiKey": { "type": "string" }, "baseURL": { "type": "string" }, "file": { "type": "object", - "properties": { "name": { "type": "string" }, "data": { "type": "string" } }, + "properties": { "name": { "type": "string" }, "data": { "type": "string", "maxLength": 13981018 } }, "required": ["name", "data"] } }, @@ -1946,6 +2010,42 @@ "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": { @@ -1998,20 +2098,24 @@ "schema": { "type": "object", "properties": { - "provider": { "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"] }, + "provider": { + "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"], + "type": "string" + }, "model": { "type": "string" }, "apiKey": { "type": "string" }, "baseURL": { "type": "string" }, "file": { "type": "object", - "properties": { "name": { "type": "string" }, "data": { "type": "string" } }, + "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", "baseURL", "file", "mediaType"] @@ -2024,6 +2128,42 @@ "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": { @@ -2077,6 +2217,369 @@ } } }, + "/ai/tailor-resume": { + "post": { + "operationId": "tailorResume", + "summary": "Auto-tailor resume for a job posting", + "description": "Uses AI to automatically tailor a resume for a specific job posting. Rewrites the summary, adjusts experience descriptions, and curates skills for ATS optimization. Returns structured modifications as a simplified output object. Requires authentication and AI credentials.", + "tags": ["AI"], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "provider": { + "enum": ["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"], + "type": "string" + }, + "model": { "type": "string" }, + "apiKey": { "type": "string" }, + "baseURL": { "type": "string" }, + "resumeData": { "$ref": "#/components/schemas/ResumeData" }, + "job": { + "type": "object", + "properties": { + "job_id": { "type": "string" }, + "job_title": { "type": "string" }, + "employer_name": { "type": "string" }, + "employer_logo": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "employer_website": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "employer_company_type": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "employer_linkedin": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_publisher": { "type": "string" }, + "job_employment_type": { "type": "string" }, + "job_apply_link": { "type": "string" }, + "job_apply_is_direct": { "type": "boolean" }, + "job_apply_quality_score": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_description": { "type": "string" }, + "job_is_remote": { "type": "boolean" }, + "job_city": { "type": "string" }, + "job_state": { "type": "string" }, + "job_country": { "type": "string" }, + "job_latitude": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_longitude": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_posted_at_timestamp": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_posted_at_datetime_utc": { "type": "string" }, + "job_offer_expiration_datetime_utc": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_offer_expiration_timestamp": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_min_salary": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_max_salary": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "job_salary_currency": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_salary_period": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_benefits": { + "anyOf": [{ "type": "array", "items": { "type": "string" } }, { "type": "null" }] + }, + "job_google_link": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_required_experience": { + "type": "object", + "properties": { + "no_experience_required": { "type": "boolean" }, + "required_experience_in_months": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, + "experience_mentioned": { "type": "boolean" }, + "experience_preferred": { "type": "boolean" } + }, + "required": [ + "no_experience_required", + "required_experience_in_months", + "experience_mentioned", + "experience_preferred" + ] + }, + "job_required_skills": { + "anyOf": [{ "type": "array", "items": { "type": "string" } }, { "type": "null" }] + }, + "job_required_education": { + "type": "object", + "properties": { + "postgraduate_degree": { "type": "boolean" }, + "professional_certification": { "type": "boolean" }, + "high_school": { "type": "boolean" }, + "associates_degree": { "type": "boolean" }, + "bachelors_degree": { "type": "boolean" }, + "degree_mentioned": { "type": "boolean" }, + "degree_preferred": { "type": "boolean" }, + "professional_certification_mentioned": { "type": "boolean" } + }, + "required": [ + "postgraduate_degree", + "professional_certification", + "high_school", + "associates_degree", + "bachelors_degree", + "degree_mentioned", + "degree_preferred", + "professional_certification_mentioned" + ] + }, + "job_experience_in_place_of_education": { "anyOf": [{ "type": "boolean" }, { "type": "null" }] }, + "job_highlights": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "array", "items": { "type": "string" } } + }, + { "type": "null" } + ] + }, + "job_posting_language": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_onet_soc": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_onet_job_zone": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_occupational_categories": { + "anyOf": [{ "type": "array", "items": { "type": "string" } }, { "type": "null" }] + }, + "job_naics_code": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "job_naics_name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "apply_options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "publisher": { "type": "string" }, + "apply_link": { "type": "string" }, + "is_direct": { "type": "boolean" } + }, + "required": ["publisher", "apply_link", "is_direct"] + } + } + }, + "required": [ + "job_id", + "job_title", + "employer_name", + "employer_logo", + "employer_website", + "employer_company_type", + "employer_linkedin", + "job_publisher", + "job_employment_type", + "job_apply_link", + "job_apply_is_direct", + "job_apply_quality_score", + "job_description", + "job_is_remote", + "job_city", + "job_state", + "job_country", + "job_latitude", + "job_longitude", + "job_posted_at_timestamp", + "job_posted_at_datetime_utc", + "job_offer_expiration_datetime_utc", + "job_offer_expiration_timestamp", + "job_min_salary", + "job_max_salary", + "job_salary_currency", + "job_salary_period", + "job_benefits", + "job_google_link", + "job_required_experience", + "job_required_skills", + "job_required_education", + "job_experience_in_place_of_education", + "job_highlights", + "job_posting_language", + "job_onet_soc", + "job_onet_job_zone", + "job_occupational_categories", + "job_naics_code", + "job_naics_name", + "apply_options" + ] + } + }, + "required": ["provider", "model", "apiKey", "baseURL", "resumeData", "job"] + } + } + } + }, + "responses": { + "200": { + "description": "Structured tailoring output returned successfully.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "summary": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "Tailored HTML summary content highlighting the candidate's most relevant experience for the target job. Use

tags for paragraphs. 2-3 sentences, 50-75 words. No emdashes or endashes." + } + }, + "required": ["content"] + }, + "experiences": { + "type": "array", + "items": { + "type": "object", + "properties": { + "index": { + "type": "number", + "description": "Zero-based index of the experience item in the resume's sections.experience.items array." + }, + "description": { + "type": "string", + "description": "Tailored HTML description emphasizing achievements and responsibilities relevant to the target job. Use

,