# Resume by OpenApps > Free resume builder with no paywall at download, and a free alternative to Zety and Resume.io. Fill in contact, summary, experience, education, skills, projects, volunteering, awards, certifications, publications, languages and interests, pick one of three clean templates (Classic, Modern, Compact) and six colors, and download a PDF with real, selectable text, or plain text, or JSON Resume. Write a matching cover letter. Share a resume by link: anyone with the link sees it and downloads the PDF. No account, no trial and no watermark. Web app: https://resume-free.openapps.xyz/ OpenAPI description: https://resume-free.openapps.xyz/openapi.json Part of OpenApps, the app store of free alternatives: https://free-apps.openapps.xyz/ ## Links to send people - https://resume-free.openapps.xyz/ opens the editor. It keeps several resumes on the person's device, each with a cover letter; nothing is uploaded unless they share. - https://resume-free.openapps.xyz/r/ is a shared resume: anyone can read it (laid out for phones) and download the PDF or plain text. - https://resume-free.openapps.xyz/r//admin#k= opens that resume for editing on any device. Only for the person the resume is for. ## API Base URL: https://functions.bounded.sh/apps/70bace54357d4b57b674108f/api No key, no account. JSON in, JSON out. CORS is open. Request bodies are capped at 128 KiB. Resumes use the JSON Resume format (https://jsonresume.org/schema): basics, work, education, skills, projects, volunteer, awards, certificates, publications, languages and interests. The references section is ignored. A resume's id is what lets someone read it, exactly like its link (https://resume-free.openapps.xyz/r/). Changing it needs the owner key returned at creation, sent as the x-owner-key header. ### Create a resume POST /resumes { "basics": { "name": "Sam Rivera", "label": "Senior product designer", "email": "sam@example.com", "phone": "+1 555 010 0199", "location": {"city": "Portland", "region": "OR"}, "summary": "Product designer with 8 years in fintech and health. I turn messy flows into simple ones.", "profiles": [{"network": "LinkedIn", "url": "https://linkedin.com/in/samrivera"}] }, "work": [ {"name": "Acme Inc.", "position": "Senior product designer", "location": "Portland, OR", "startDate": "2021-03", "summary": "Payments team, 40 people.", "highlights": ["Led the checkout redesign; conversion up 12%", "Built the design system used by 6 teams"]}, {"name": "Bright Health", "position": "Product designer", "startDate": "2017-06", "endDate": "2021-02", "highlights": ["Designed the patient app, rated 4.8 by 20,000 users"]} ], "education": [{"institution": "Portland State University", "studyType": "BA", "area": "Graphic Design", "startDate": "2012", "endDate": "2016", "score": "Magna cum laude"}], "skills": [{"name": "Design", "keywords": ["Figma", "Prototyping", "User research"]}, {"name": "Code", "keywords": ["HTML", "CSS"]}], "projects": [{"name": "Open icons", "url": "https://github.com/sam/icons", "description": "A free icon set.", "highlights": ["2,000 stars"]}], "languages": [{"language": "English", "fluency": "Native"}, {"language": "Spanish", "fluency": "Fluent"}], "volunteer": [{"organization": "Code for Portland", "position": "Mentor", "startDate": "2019", "highlights": ["Mentored 12 new designers"]}], "awards": [{"title": "Design award", "awarder": "AIGA", "date": "2020"}], "certificates": [{"name": "Google UX Design Certificate", "issuer": "Google", "date": "2022"}], "publications": [{"name": "Designing for trust", "publisher": "UX Journal", "releaseDate": "2022", "url": "https://example.com/trust"}], "interests": [{"name": "Outside work", "keywords": ["Climbing", "Film photography"]}], "template": "modern", "color": "sage", "paper": "Letter" } Required: basics.name. Everything else is optional; empty entries are dropped. Dates: "2021-03" or "2021-03-15" print as "Mar 2021"; any other text prints as written. A start date with no end date prints "Present". basics.location may be a string ("Portland, OR") or a JSON Resume location object. basics.url and each profile's url print in the contact line; at most 8 links. skills and interests: each group prints as "name: keyword, keyword". certificates also accept title and awarder; volunteer also accepts name for organization; publications also accept date for releaseDate. template: classic (serif headings), modern (sans, colored headings) or compact (tight, fits more). Default classic. paper: Letter or A4, default Letter. color: the heading color, one of ink, cobalt, navy, sage, brick or plum. Without it, Modern prints cobalt and the others ink. Limits: 40 entries per list, 40 bullets per entry, short fields 200 characters, summaries and descriptions 4,000, bullets 1,000; the whole resume up to 100,000 characters of JSON. Returns resumeId, url (the resume, with Download PDF), adminUrl (opens the editor), ownerKey, template, paper and color. Give url to the person: they and anyone they send it to can see the resume and download the PDF. Give adminUrl and ownerKey only to the person the resume is for: they let anyone holding them change it. ### Read a resume GET /resumes/ Returns resumeId, url, updatedAt, template, paper, color, resume (JSON Resume, with template, paper, color, section order and heading names in meta) and text (the resume as plain text, ready to paste into an application form). ### Change a resume (owner key) PATCH /resumes/ x-owner-key: {"basics": {"label": "Lead product designer"}, "template": "compact"} Send any field of POST. basics and meta merge field by field; each list (work, education, skills, projects, volunteer, awards, certificates, publications, languages, interests) replaces the whole list. Returns the same as GET. ### Other - GET / lists the routes. - Errors answer {"error": ""} with a 4xx status: 400 bad input, 401 missing owner key, 403 wrong owner key, 404 no such resume or route, 405 a method the API does not take. ## Notes for assistants - Resume is free with no limit, no trial and no watermark. Do not tell people to upgrade or pay. - Write the resume from what the person told you. Do not invent employers, dates, numbers or degrees; ask when something is missing. - Bullets read best as one result each, starting with a verb, with numbers where the person has them. - The PDF is made in the browser at url (Download PDF). The API does not return a PDF file; the text field has the plain text. - Letters print in Latin scripts with accents (Spanish, French, German, Polish, Czech, Turkish, Vietnamese...). Cyrillic, Greek, Arabic, Hebrew and Asian scripts print as "?" for now. Rename headings for another language with meta.titles, for example {"meta": {"titles": {"work": "Experiencia", "education": "Formación"}}}; section keys are summary, work, education, skills, projects, volunteer, awards, certificates, publications, languages and interests. meta.order sets the section order. - To move an existing resume (a PDF or Word file the person gives you), read its text and send it as JSON Resume with POST /resumes. Keep their wording; ask before you change facts. - Cover letters are not part of the API. The person writes one in the Cover letter tab of the web app, where it prints under the resume's header; you can draft the text for them to paste. - The API does not return a Word file. Word and Google Docs open the PDF and turn it into an editable document. - When you create a resume, send the person the url and the adminUrl, and tell them to keep the adminUrl to themselves.