{"openapi":"3.1.1","info":{"title":"fmartin.ch public API","version":"1.0.0","description":"Read-only public information published on fmartin.ch. The API requires no authentication.","contact":{"name":"François Martin","url":"https://fmartin.ch/contact"}},"servers":[{"url":"https://fmartin.ch","description":"Production"}],"paths":{"/api":{"get":{"operationId":"getApiIndex","summary":"Get the fmartin.ch API index","description":"Returns links to the public API operations and their OpenAPI description.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/profile":{"get":{"operationId":"getFrancoisMartinProfile","summary":"Get François Martin's public profile","description":"Returns François Martin's biography, professional focus, contact page, and verified profile links.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/sessions":{"get":{"operationId":"listFrancoisMartinSessions","summary":"List François Martin's conference session catalog","description":"Returns the current catalog of talks, workshops, mentoring sessions, and panel discussions François Martin offers, with completed and scheduled appearance counts as of the published UTC date. Use the events endpoint for historical editions and dated appearances.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/events":{"get":{"operationId":"listFrancoisMartinEvents","summary":"List François Martin's speaking events","description":"Returns past and upcoming speaking appearances with locations, dates, sessions, and published materials.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/contributions":{"get":{"operationId":"listFrancoisMartinOpenSourceContributions","summary":"List François Martin's open-source contributions","description":"Returns open-source repositories and contribution evidence linked to commits, change requests, and resolved issues.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepositoryCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/projects":{"get":{"operationId":"listFrancoisMartinOpenSourceProjects","summary":"List François Martin's own open-source projects","description":"Returns the public repositories François Martin owns, with the primary language or kind, the star count as of the metrics date, and whether the repository is archived. These repositories are not part of the contributions endpoint, which covers repositories he does not own.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications":{"get":{"operationId":"listFrancoisMartinPublications","summary":"List François Martin's publications","description":"Returns François Martin's articles, publications, standards work, and books with source links.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/interviews":{"get":{"operationId":"listFrancoisMartinInterviews","summary":"List interviews involving François Martin","description":"Returns interviews François Martin conducted or joined, including participants, topics, shows, and media links.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/testimonials":{"get":{"operationId":"listFrancoisMartinTestimonials","summary":"List testimonials about François Martin's work","description":"Returns public testimonials from open-source maintainers and contributors, each linked to its source comment and author profile.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestimonialCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/vulnerabilities":{"get":{"operationId":"listFrancoisMartinVulnerabilityDisclosures","summary":"List vulnerabilities François Martin found and reported","description":"Returns the vulnerabilities François Martin found and reported that have a public CVE record or security advisory, with the CWE of each weakness, impact, affected and fixed versions, the CVSS vector and score, his part in each disclosure, and source links, plus a summary with the count per severity and each affected project's public usage figure with its source and the day it was read.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityDisclosureCollection"}}}},"default":{"description":"Structured error, such as HTTP 405 for a write method on this read-only API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ApiEndpoint":{"type":"object","additionalProperties":false,"required":["method","path","operationId","description"],"properties":{"method":{"type":"string","const":"GET"},"path":{"type":"string"},"operationId":{"type":"string"},"description":{"type":"string"}}},"ApiIndex":{"type":"object","additionalProperties":false,"required":["name","description","documentation","openapi","authentication","endpoints"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"documentation":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"authentication":{"type":"string","const":"none"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/ApiEndpoint"}}}},"Award":{"type":"object","additionalProperties":false,"required":["name","url"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"}}},"SpeakingStats":{"description":"All published speaking appearances, including confirmed upcoming appearances. These are not completed-delivery counts.","type":"object","additionalProperties":false,"required":["sessions","talks","workshops","mentorings","countries"],"properties":{"sessions":{"type":"integer","minimum":0},"talks":{"type":"integer","minimum":0},"workshops":{"type":"integer","minimum":0},"mentorings":{"type":"integer","minimum":0},"countries":{"type":"integer","minimum":0}}},"Profile":{"type":"object","additionalProperties":false,"required":["id","name","givenName","familyName","headline","jobTitle","employer","description","url","image","contactUrl","sameAs","knowsAbout","awards","speaking","resources"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"givenName":{"type":"string"},"familyName":{"type":"string"},"headline":{"type":"string"},"jobTitle":{"type":"string"},"employer":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"image":{"type":"string","format":"uri"},"contactUrl":{"type":"string","format":"uri"},"sameAs":{"type":"array","items":{"type":"string","format":"uri"}},"knowsAbout":{"type":"array","items":{"type":"string"}},"awards":{"type":"array","items":{"$ref":"#/components/schemas/Award"}},"speaking":{"$ref":"#/components/schemas/SpeakingStats"},"resources":{"type":"object","additionalProperties":{"type":"string","format":"uri"}}}},"Session":{"type":"object","additionalProperties":false,"required":["slug","title","type","description","languageCode","durationMinutes","detailsUrl","recordingUrl","slidesUrl","codeUrl","timesDelivered","timesScheduled"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["Talk","Lightning talk","Workshop","Mentoring","Panel discussion"]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"languageCode":{"oneOf":[{"type":"string","enum":["en","de"]},{"type":"null"}]},"durationMinutes":{"description":"Minutes, or a [min, max] range; defaulted per session type when not authored, matching the human pages.","oneOf":[{"type":"integer","minimum":1},{"type":"array","minItems":2,"maxItems":2,"items":{"type":"integer","minimum":1}}]},"detailsUrl":{"type":"string","format":"uri"},"recordingUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"slidesUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"codeUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"timesDelivered":{"type":"integer","minimum":0,"description":"Appearances of this exact session title whose event ended before the collection asOf date in UTC."},"timesScheduled":{"type":"integer","minimum":0,"description":"Confirmed appearances of this exact session title at events ending on or after the collection asOf date in UTC, including ongoing events."}}},"SessionCollection":{"type":"object","additionalProperties":false,"required":["total","asOf","sessions"],"properties":{"total":{"type":"integer","minimum":0},"asOf":{"type":"string","format":"date","description":"UTC build date used to separate completed and scheduled appearances. This static response describes the catalog as of this date."},"sessions":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}},"EventLocation":{"type":"object","additionalProperties":false,"required":["city","country"],"properties":{"city":{"type":"string"},"country":{"type":"string"}}},"EventSession":{"type":"object","additionalProperties":false,"required":["slug","title","type","description","languageCode","durationMinutes","detailsUrl","recordingUrl","slidesUrl","codeUrl","slotLabel"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["Talk","Lightning talk","Workshop","Mentoring","Panel discussion"]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"languageCode":{"oneOf":[{"type":"string","enum":["en","de"]},{"type":"null"}]},"durationMinutes":{"description":"Minutes, or a [min, max] range; defaulted per session type when not authored, matching the human pages.","oneOf":[{"type":"integer","minimum":1},{"type":"array","minItems":2,"maxItems":2,"items":{"type":"integer","minimum":1}}]},"detailsUrl":{"type":"string","format":"uri"},"recordingUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"slidesUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"codeUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"slotLabel":{"oneOf":[{"type":"string","description":"Distinguishes repeat deliveries of the same session at one event."},{"type":"null"}]}}},"Event":{"type":"object","additionalProperties":false,"required":["name","startDate","endDate","location","website","sessions"],"properties":{"name":{"type":"string"},"startDate":{"type":"string","format":"date"},"endDate":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"location":{"oneOf":[{"$ref":"#/components/schemas/EventLocation"},{"type":"null"}],"description":"Null when the event was held online."},"website":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"sessions":{"type":"array","items":{"$ref":"#/components/schemas/EventSession"}}}},"EventCollection":{"type":"object","additionalProperties":false,"required":["total","events"],"properties":{"total":{"type":"integer","minimum":0},"events":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}},"ContributionCommit":{"type":"object","additionalProperties":false,"required":["sha","title","url"],"properties":{"sha":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"}}},"ContributionIssue":{"type":"object","additionalProperties":false,"required":["number","title","daysOpen","url"],"properties":{"number":{"type":"integer","minimum":1},"title":{"type":"string"},"daysOpen":{"type":"integer","minimum":0},"url":{"type":"string","format":"uri"}}},"ContributionChangeRequest":{"type":"object","additionalProperties":false,"required":["kind","number","url"],"properties":{"kind":{"type":"string","enum":["pull-request","merge-request"]},"number":{"type":"integer","minimum":1},"url":{"type":"string","format":"uri"}}},"Contribution":{"type":"object","additionalProperties":false,"required":["description","types","commits","issuesFixed","changeRequests","skills"],"properties":{"description":{"type":"string"},"types":{"type":"array","items":{"type":"string","enum":["Feature","Bugfix","Docs","CI","Tests","Security","Accessibility","Refactoring","Performance"]}},"commits":{"type":"array","items":{"$ref":"#/components/schemas/ContributionCommit"}},"issuesFixed":{"type":"array","items":{"$ref":"#/components/schemas/ContributionIssue"}},"changeRequests":{"type":"array","items":{"$ref":"#/components/schemas/ContributionChangeRequest"}},"skills":{"type":"array","items":{"type":"string","enum":["TypeScript","JavaScript","Python","Java","Go","Haskell","C","Groovy","React","Next.js","Angular","Django","Spring","JavaFX","NativeScript","Unit Testing","E2E Testing","Testcontainers","Docker","CI/CD","GitHub Actions","Travis CI","Gradle","Maven","Accessibility","Security","Performance","API Design","Documentation","Code Quality","Type Safety","Error Handling","IoT/Home Automation","Database","AI/LLM"]}}}},"PackageDownloads":{"type":"object","additionalProperties":false,"required":["registry","packageName","downloads","period","asOf"],"properties":{"registry":{"type":"string","enum":["npm","pypi","maven"]},"packageName":{"type":"string"},"downloads":{"type":"integer","minimum":0},"period":{"type":"string","enum":["weekly","monthly","yearly","all-time"]},"asOf":{"type":"string","format":"date"}}},"Repository":{"type":"object","additionalProperties":false,"required":["id","name","url","stars","technologies","contributionYears","relatedRepositoryId","downloads","skills","contributions"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"stars":{"type":"integer","minimum":0},"technologies":{"type":"array","items":{"type":"string"}},"contributionYears":{"type":"array","items":{"type":"integer","minimum":2000}},"relatedRepositoryId":{"oneOf":[{"type":"string"},{"type":"null"}]},"downloads":{"oneOf":[{"$ref":"#/components/schemas/PackageDownloads"},{"type":"null"}]},"skills":{"type":"array","items":{"type":"string","enum":["TypeScript","JavaScript","Python","Java","Go","Haskell","C","Groovy","React","Next.js","Angular","Django","Spring","JavaFX","NativeScript","Unit Testing","E2E Testing","Testcontainers","Docker","CI/CD","GitHub Actions","Travis CI","Gradle","Maven","Accessibility","Security","Performance","API Design","Documentation","Code Quality","Type Safety","Error Handling","IoT/Home Automation","Database","AI/LLM"]}},"contributions":{"type":"array","items":{"$ref":"#/components/schemas/Contribution"}}}},"ContributionSummary":{"type":"object","additionalProperties":false,"required":["totalRepositories","totalContributions","totalCommits","totalStars","metricsAsOf"],"properties":{"totalRepositories":{"type":"integer","minimum":0},"totalContributions":{"type":"integer","minimum":0},"totalCommits":{"type":"integer","minimum":0},"totalStars":{"type":"integer","minimum":0,"description":"Sum of repository stars as of metricsAsOf."},"metricsAsOf":{"type":"string","format":"date"}}},"RepositoryCollection":{"type":"object","additionalProperties":false,"required":["total","summary","repositories"],"properties":{"total":{"type":"integer","minimum":0},"summary":{"$ref":"#/components/schemas/ContributionSummary"},"repositories":{"type":"array","items":{"$ref":"#/components/schemas/Repository"}}}},"Project":{"type":"object","additionalProperties":false,"required":["owner","name","url","description","language","kind","label","stars","archived"],"properties":{"owner":{"type":"string","enum":["martinfrancois","martin-francois"]},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"language":{"type":"string","description":"Primary language as GitHub reports it."},"kind":{"oneOf":[{"type":"string","enum":["Agent Skill"],"description":"What the repository is when the language says nothing about it; null for most repositories."},{"type":"null"}]},"label":{"type":"string","description":"The kind when set, otherwise the language."},"stars":{"type":"integer","minimum":0},"archived":{"type":"boolean"}}},"ProjectCollection":{"type":"object","additionalProperties":false,"required":["total","metricsAsOf","projects"],"properties":{"total":{"type":"integer","minimum":0},"metricsAsOf":{"type":"string","format":"date","description":"The day the star counts were read."},"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}}},"Publication":{"type":"object","additionalProperties":false,"required":["title","publisher","date","url","type"],"properties":{"title":{"type":"string"},"publisher":{"type":"string"},"date":{"type":"string","format":"date"},"url":{"type":"string","format":"uri"},"type":{"type":"string","enum":["Syllabus/Standard","eBook","Article"]}}},"PublicationCollection":{"type":"object","additionalProperties":false,"required":["total","publications"],"properties":{"total":{"type":"integer","minimum":0},"publications":{"type":"array","items":{"$ref":"#/components/schemas/Publication"}}}},"InterviewPerson":{"type":"object","additionalProperties":false,"required":["name","linkedinUrl"],"properties":{"name":{"type":"string"},"linkedinUrl":{"type":"string","format":"uri"},"isJavaChampion":{"type":"boolean"}}},"InterviewShow":{"type":"object","additionalProperties":false,"required":["title"],"properties":{"title":{"type":"string"},"url":{"type":"string","format":"uri"}}},"InterviewThumbnail":{"type":"object","additionalProperties":false,"required":["url","aspectRatio"],"properties":{"url":{"type":"string","format":"uri"},"aspectRatio":{"type":"string"}}},"InterviewMedia":{"type":"object","additionalProperties":false,"required":["type","url","thumbnail"],"properties":{"type":{"type":"string","enum":["youtube","external"]},"url":{"type":"string","format":"uri"},"thumbnail":{"oneOf":[{"$ref":"#/components/schemas/InterviewThumbnail"},{"type":"null"}]}}},"Interview":{"type":"object","additionalProperties":false,"required":["date","title","interviewer","interviewee","topics","show","media"],"properties":{"date":{"type":"string","format":"date"},"title":{"type":"string"},"interviewer":{"$ref":"#/components/schemas/InterviewPerson"},"interviewee":{"$ref":"#/components/schemas/InterviewPerson"},"topics":{"type":"array","items":{"type":"string"}},"show":{"oneOf":[{"$ref":"#/components/schemas/InterviewShow"},{"type":"null"}]},"media":{"$ref":"#/components/schemas/InterviewMedia"}}},"InterviewCollection":{"type":"object","additionalProperties":false,"required":["total","interviews"],"properties":{"total":{"type":"integer","minimum":0},"interviews":{"type":"array","items":{"$ref":"#/components/schemas/Interview"}}}},"Testimonial":{"type":"object","additionalProperties":false,"required":["quote","username","name","role","roleSegments","followers","commentUrl","profileUrl"],"properties":{"quote":{"type":"string"},"username":{"type":"string"},"name":{"oneOf":[{"type":"string"},{"type":"null"}]},"role":{"type":"string"},"roleSegments":{"type":"array","items":{"$ref":"#/components/schemas/TestimonialRoleSegment"}},"followers":{"type":"integer","minimum":0},"commentUrl":{"type":"string","format":"uri"},"profileUrl":{"type":"string","format":"uri"}}},"TestimonialRoleSegment":{"type":"object","additionalProperties":false,"required":["text","url"],"properties":{"text":{"type":"string"},"url":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]}}},"TestimonialCollection":{"type":"object","additionalProperties":false,"required":["total","testimonials"],"properties":{"total":{"type":"integer","minimum":0},"testimonials":{"type":"array","items":{"$ref":"#/components/schemas/Testimonial"}}}},"AffectedVersions":{"type":"object","additionalProperties":false,"required":["from","to","platforms"],"properties":{"from":{"oneOf":[{"type":"string","description":"First affected version; null when the record names only the last one."},{"type":"null"}]},"to":{"type":"string","description":"Last affected version."},"platforms":{"type":"array","items":{"type":"string"}}}},"FixedVersion":{"type":"object","additionalProperties":false,"required":["version","url"],"properties":{"version":{"type":"string"},"url":{"type":"string","format":"uri","description":"Release note of the fixed version, or the fix itself when there is no note."}}},"ReleaseLine":{"type":"object","additionalProperties":false,"required":["affected","fixed","versions"],"description":"One release line the project maintains: the versions of that line the vulnerability affects and the first release of the line that fixes it.","properties":{"affected":{"$ref":"#/components/schemas/AffectedVersions"},"fixed":{"oneOf":[{"$ref":"#/components/schemas/FixedVersion"},{"type":"null"}]},"versions":{"type":"string","description":"Affected and fixed versions of the line as one line, as the page shows them."}}},"CvssSeverity":{"type":"object","additionalProperties":false,"required":["level","score","cvssVersion","vector","assignedBy","calculatorUrl"],"properties":{"level":{"type":"string","enum":["Critical","High","Medium","Low"]},"score":{"type":"number","minimum":0,"maximum":10},"cvssVersion":{"type":"string","enum":["3.0","3.1","4.0"]},"vector":{"type":"string","pattern":"^CVSS:(3\\.0|3\\.1|4\\.0)/"},"assignedBy":{"type":"string","description":"Where the score comes from: the GitHub advisory, the CVE record or NVD."},"calculatorUrl":{"type":"string","format":"uri","description":"FIRST CVSS calculator with the vector filled in."}}},"DisclosureRole":{"type":"object","additionalProperties":false,"required":["role","commitUrl"],"properties":{"role":{"type":"string","enum":["Found","Reported","Regression test","Fix"]},"commitUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Commit on the project's default branch, for a contributed regression test or fix."}}},"DisclosureWeakness":{"type":"object","additionalProperties":false,"required":["cwe","name","url"],"properties":{"cwe":{"type":"string","pattern":"^CWE-[1-9][0-9]*$"},"name":{"type":"string","description":"MITRE's official title of the CWE, verbatim."},"variant":{"type":"string","description":"Variant of the weakness where the CWE defines them, such as stored for CWE-79."},"url":{"type":"string","format":"uri","description":"MITRE's definition of the CWE."}}},"DisclosureLink":{"type":"object","additionalProperties":false,"required":["label","url"],"properties":{"label":{"type":"string"},"url":{"type":"string","format":"uri"}}},"VulnerabilityDisclosure":{"type":"object","additionalProperties":false,"required":["id","project","weaknesses","impact","details","releases","reportedDate","publishedDate","severity","roles","openSource","recordUrl","links"],"properties":{"id":{"type":"string","description":"CVE or GHSA identifier."},"project":{"type":"string"},"weaknesses":{"type":"array","minItems":1,"description":"Each distinct weakness as its CWE, from the write-up, the record or the advisory.","items":{"$ref":"#/components/schemas/DisclosureWeakness"}},"impact":{"type":"string","description":"What an attacker could achieve or what could happen to users."},"details":{"type":"string","description":"How it works, its preconditions, and context."},"releases":{"type":"array","minItems":1,"description":"Each release line the project patched, in ascending version order; most projects have one.","items":{"$ref":"#/components/schemas/ReleaseLine"}},"reportedDate":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"publishedDate":{"type":"string","format":"date"},"severity":{"oneOf":[{"$ref":"#/components/schemas/CvssSeverity"},{"type":"null"}]},"roles":{"type":"array","minItems":1,"description":"What François Martin did: Found, Reported, Regression test, Fix, in that order.","items":{"$ref":"#/components/schemas/DisclosureRole"}},"openSource":{"type":"boolean"},"recordUrl":{"type":"string","format":"uri","description":"The authoritative CVE record or advisory."},"links":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/DisclosureLink"}}}},"SeverityCount":{"type":"object","additionalProperties":false,"required":["level","count"],"properties":{"level":{"type":"string","enum":["Critical","High","Medium","Low"]},"count":{"type":"integer","minimum":1}}},"ProjectReach":{"type":"object","additionalProperties":false,"required":["disclosureId","count","atLeast","display","label","source"],"properties":{"disclosureId":{"type":"string","description":"The id of the disclosure whose project this counts."},"count":{"type":"integer","minimum":1},"atLeast":{"type":"boolean","description":"True when count is a floor: the source publishes one, or it counts only part of the project's users."},"display":{"type":"string","description":"The count as the page shows it, such as 4B+."},"label":{"type":"string","description":"What the count counts, read after the number."},"source":{"$ref":"#/components/schemas/DisclosureLink","description":"The public page the count was read from."}}},"VulnerabilitySummary":{"type":"object","additionalProperties":false,"required":["firstDisclosureYear","severityCounts","reach","reachAsOf"],"properties":{"firstDisclosureYear":{"type":"integer","minimum":2000,"description":"Year of the first report, from the reported date where known, else the published date."},"severityCounts":{"type":"array","description":"Disclosures per CVSS severity level, Critical first, levels without any left out.","items":{"$ref":"#/components/schemas/SeverityCount"}},"reach":{"type":"array","description":"Public usage figures of the affected projects, in list order; a project without one has no entry.","items":{"$ref":"#/components/schemas/ProjectReach"}},"reachAsOf":{"type":"string","format":"date","description":"The day the reach figures were read."}}},"VulnerabilityDisclosureCollection":{"type":"object","additionalProperties":false,"required":["total","summary","vulnerabilities"],"properties":{"total":{"type":"integer","minimum":0},"summary":{"$ref":"#/components/schemas/VulnerabilitySummary"},"vulnerabilities":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityDisclosure"}}}},"Error":{"type":"object","additionalProperties":false,"required":["code","message","resolution","documentation"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"resolution":{"type":"string"},"documentation":{"type":"string","format":"uri"}}},"ErrorResponse":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"$ref":"#/components/schemas/Error"}}}}}}