{"openapi":"3.0.0","servers":[{"url":"https://rrepo.dev"}],"info":{"title":"R Package Repository API","version":"1.0.0"},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"PackageListResponse":{"type":"object","properties":{"repositorySlug":{"type":"string"},"packages":{"type":"array","items":{"$ref":"#/components/schemas/PublicPackageSummary"}}},"required":["repositorySlug","packages"]},"PublicPackageSummary":{"type":"object","properties":{"name":{"type":"string"},"latestVersion":{"type":"string"},"latestUploadedAt":{"type":"string","nullable":true},"versionCount":{"type":"number"}},"required":["name","latestVersion","latestUploadedAt","versionCount"]},"ErrorResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"VersionListResponse":{"type":"object","properties":{"package":{"type":"string"},"versions":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string"},"sourceUrl":{"type":"string"}},"required":["version","sourceUrl"]}}},"required":["package","versions"]},"LatestVersionResponse":{"type":"object","properties":{"version":{"type":"string"},"sourceUrl":{"type":"string"},"package":{"type":"string"}},"required":["version","sourceUrl","package"]},"BinaryUploadResponse":{"type":"object","properties":{"package":{"type":"string"},"version":{"type":"string"},"binaryUrl":{"type":"string"},"status":{"type":"string","enum":["published"]},"replaced":{"type":"boolean"},"platform":{"type":"string","enum":["windows","macosx"]},"target":{"type":"string","nullable":true},"rMinor":{"type":"string"}},"required":["package","version","binaryUrl","status","replaced","platform","target","rMinor"]},"UploadResponse":{"type":"object","properties":{"package":{"type":"string"},"version":{"type":"string"},"sourceUrl":{"type":"string"},"status":{"type":"string","enum":["published"]},"replaced":{"type":"boolean"}},"required":["package","version","sourceUrl","status","replaced"]},"DeletePackageResponse":{"type":"object","properties":{"packageName":{"type":"string"},"deletedVersionCount":{"type":"number"}},"required":["packageName","deletedVersionCount"]}},"parameters":{}},"paths":{"/{namespaceSlug}/{repoSlug}/packages":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"}],"responses":{"200":{"description":"List packages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageListResponse"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}/versions":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","example":"dplyr"},"required":true,"name":"packageName","in":"path"}],"responses":{"200":{"description":"List package versions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListResponse"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}/versions/latest":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","example":"dplyr"},"required":true,"name":"packageName","in":"path"}],"responses":{"200":{"description":"Latest package version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestVersionResponse"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}/versions/{version}/source":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","minLength":1,"pattern":"^[^/%\\x00-\\x1f\\x7f]+$","example":"cli"},"required":true,"name":"packageName","in":"path"},{"schema":{"type":"string","minLength":1,"pattern":"^[^/%\\x00-\\x1f\\x7f]+$","example":"3.6.3"},"required":true,"name":"version","in":"path"}],"responses":{"200":{"description":"Source tarball","content":{"application/gzip":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}/versions/{version}/description":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","minLength":1,"pattern":"^[^/%\\x00-\\x1f\\x7f]+$","example":"cli"},"required":true,"name":"packageName","in":"path"},{"schema":{"type":"string","minLength":1,"pattern":"^[^/%\\x00-\\x1f\\x7f]+$","example":"3.6.3"},"required":true,"name":"version","in":"path"}],"responses":{"200":{"description":"Package DESCRIPTION file","content":{"text/plain":{"schema":{"type":"string"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}/versions/{version}/binaries/{platform}/{rMinor}":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","example":"cli"},"required":true,"name":"packageName","in":"path"},{"schema":{"type":"string","example":"3.6.3"},"required":true,"name":"version","in":"path"},{"schema":{"type":"string","example":"windows"},"required":true,"name":"platform","in":"path"},{"schema":{"type":"string","example":"4.5"},"required":true,"name":"rMinor","in":"path"}],"responses":{"200":{"description":"Binary artifact","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}/versions/{version}/binaries/{platform}/{target}/{rMinor}":{"get":{"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","example":"cli"},"required":true,"name":"packageName","in":"path"},{"schema":{"type":"string","example":"3.6.3"},"required":true,"name":"version","in":"path"},{"schema":{"type":"string","example":"windows"},"required":true,"name":"platform","in":"path"},{"schema":{"type":"string","example":"4.5"},"required":true,"name":"rMinor","in":"path"},{"schema":{"type":"string","example":"big-sur-arm64"},"required":true,"name":"target","in":"path"}],"responses":{"200":{"description":"Targeted binary artifact","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Not modified"},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/{namespaceSlug}/{repoSlug}/binaries/upload":{"post":{"description":"Upload multipart fields file, packageName, version, platform (windows, macosx or macos), rMinor (major.minor), target (required for macOS, omitted for Windows), and optional replace=true. Requires a published source version.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"packageName":{"type":"string","pattern":"^[A-Za-z](?:[A-Za-z0-9.]*[A-Za-z0-9])?$"},"version":{"type":"string","pattern":"^[0-9]+(?:[.-][0-9]+)*$"},"platform":{"type":"string","enum":["windows","macosx","macos"]},"rMinor":{"type":"string","pattern":"^\\d+\\.\\d+$"},"target":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$"},"replace":{"type":"string","enum":["true","false"],"default":"false","description":"Explicitly replace an existing artifact"}},"required":["file","packageName","version","platform","rMinor"]}}}},"responses":{"202":{"description":"Uploaded binary artifact","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BinaryUploadResponse"}}}},"400":{"description":"Bad request"},"401":{"description":"Authentication required"},"403":{"description":"Forbidden"},"404":{"description":"Repository or published source not found"},"409":{"description":"Binary already exists; use replace=true to replace it"},"500":{"description":"Internal server error"},"502":{"description":"Authentication service unavailable"}}}},"/{namespaceSlug}/{repoSlug}/upload":{"post":{"description":"Upload a <package>_<version>.tar.gz source archive as multipart field file. Send replace=true to replace an existing source.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"replace":{"type":"string","enum":["true","false"],"default":"false","description":"Explicitly replace an existing artifact"}},"required":["file"]}}}},"responses":{"202":{"description":"Uploaded package","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"400":{"description":"Bad request"},"401":{"description":"Authentication required"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"409":{"description":"Source already exists; use replace=true to replace it"},"500":{"description":"Internal server error"},"502":{"description":"Authentication service unavailable"}}}},"/{namespaceSlug}/{repoSlug}/packages/{packageName}":{"delete":{"security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","example":"acme"},"required":true,"name":"namespaceSlug","in":"path"},{"schema":{"type":"string","example":"cran"},"required":true,"name":"repoSlug","in":"path"},{"schema":{"type":"string","example":"cli"},"required":true,"name":"packageName","in":"path"}],"responses":{"200":{"description":"Deleted package","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletePackageResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Authentication service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}