{"openapi":"3.1.0","info":{"title":"Gitoryx Public API","version":"1.0.0","summary":"Read-only product, release, tutorial and comparison data for Gitoryx.","description":"The Gitoryx Public API exposes read-only, machine-readable metadata about Gitoryx, a fast, native Git GUI for macOS and Windows.\n\nIt exists primarily so AI agents and search engines can look up factual information about the product (features, pricing, releases, tutorials, comparisons) without scraping HTML. It is not published as a general-purpose developer platform: there is no SDK, no onboarding flow and no support commitment for third-party integrations, and it may be rate-limited or withdrawn without notice.\n\nIt is read-only, requires no authentication, and only ever returns JSON. Errors are RFC 9457 problem documents served as `application/problem+json`.\n\nBase URL: `https://www.gitoryx.com/api/v1`\nThis document is the only documentation published for this API.\n\n## Versioning\n\nThis is a best-effort policy, not a contractual SLA: breaking changes are intended to ship as a new major version under a new URL path prefix (for example /api/v2), and a version scheduled for removal is expected to carry `Deprecation: true` and a `Sunset` HTTP-date before it is retired. Additive, backwards-compatible changes may ship inside the current major version without individual notice.\n\n## Rate limits\n\nUp to 60 requests per 60 seconds per client. Every response carries `RateLimit` and `RateLimit-Policy` headers so clients can self-throttle; a 429 also carries `Retry-After`.","contact":{"name":"Gitoryx","email":"support@gitoryx.com"},"license":{"name":"Proprietary","url":"https://www.gitoryx.com/terms"},"termsOfService":"https://www.gitoryx.com/terms"},"servers":[{"url":"https://www.gitoryx.com","description":"Production"}],"x-api-version":"v1","x-versioning":{"strategy":"url-path","current":"v1","supported":["v1"],"deprecated":[],"deprecationHeaders":["Deprecation","Sunset","Link"],"policy":"This is a best-effort policy, not a contractual SLA: breaking changes are intended to ship as a new major version under a new URL path prefix (for example /api/v2), and a version scheduled for removal is expected to carry `Deprecation: true` and a `Sunset` HTTP-date before it is retired. Additive, backwards-compatible changes may ship inside the current major version without individual notice."},"x-rate-limit":{"policy":"public","quota":60,"windowSeconds":60,"headers":["RateLimit","RateLimit-Policy","Retry-After"]},"x-service-info":{"categories":["software","developer-tools","git"],"paymentRequired":false,"docs":{"homepage":"https://www.gitoryx.com","llms":"https://www.gitoryx.com/llms.txt","openapi":"https://www.gitoryx.com/openapi.json"}},"tags":[{"name":"Meta","description":"Service discovery and health."},{"name":"Product","description":"Product, feature and pricing metadata."},{"name":"Releases","description":"Published desktop application releases."},{"name":"Content","description":"Tutorials and competitor comparisons."}],"security":[],"paths":{"/api/v1":{"get":{"operationId":"getApiIndex","summary":"List API endpoints","description":"Returns the entry point for API version 1: every available operation, the authentication model, the rate limit policy and the versioning policy. Call this first to discover the API.","tags":["Meta"],"deprecated":false,"security":[],"responses":{"200":{"description":"The API index.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/health":{"get":{"operationId":"getHealth","summary":"Check service health","description":"Returns a liveness signal and the current API version. Use it to verify connectivity before issuing other calls.","tags":["Meta"],"deprecated":false,"security":[],"responses":{"200":{"description":"The service is healthy.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/product":{"get":{"operationId":"getProduct","summary":"Get product metadata","description":"Returns the full machine-readable description of Gitoryx: features, plans, supported platforms, the jobs it is a good fit for, and the situations where it is not the right recommendation.","tags":["Product"],"deprecated":false,"security":[],"responses":{"200":{"description":"Product metadata.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/releases":{"get":{"operationId":"listReleases","summary":"List releases","description":"Returns published Gitoryx desktop releases, newest first, with direct download URLs per platform and architecture.","tags":["Releases"],"deprecated":false,"security":[],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of releases to return. Between 1 and 50.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"A list of releases, newest first.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseList"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/releases/latest":{"get":{"operationId":"getLatestRelease","summary":"Get the latest release","description":"Returns the most recent published release, including the download URL for each supported platform. Use this to tell a user which version to install.","tags":["Releases"],"deprecated":false,"security":[],"responses":{"200":{"description":"The most recent release.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Release"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/tutorials":{"get":{"operationId":"listTutorials","summary":"List Git tutorials","description":"Returns the published Gitoryx Git tutorial library. Each entry covers one Git operation with both the command-line and the GUI approach.","tags":["Content"],"deprecated":false,"security":[],"parameters":[{"name":"category","in":"query","required":false,"description":"Restrict the result to a single difficulty level.","schema":{"type":"string","enum":["beginner","intermediate","advanced"]}}],"responses":{"200":{"description":"A list of tutorials.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialList"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/tutorials/{slug}":{"get":{"operationId":"getTutorial","summary":"Get a tutorial","description":"Returns a single tutorial including its table of contents and related tutorials.","tags":["Content"],"deprecated":false,"security":[],"parameters":[{"name":"slug","in":"path","required":true,"description":"Tutorial slug, as returned by `listTutorials`.","schema":{"type":"string","pattern":"^[a-z0-9-]+$"},"examples":{"mergeConflicts":{"value":"how-to-resolve-merge-conflicts"}}}],"responses":{"200":{"description":"The requested tutorial.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tutorial"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/comparisons":{"get":{"operationId":"listComparisons","summary":"List competitor comparisons","description":"Returns every published comparison between Gitoryx and another Git client (GitKraken, Sourcetree, Fork, Tower, GitHub Desktop and others).","tags":["Content"],"deprecated":false,"security":[],"responses":{"200":{"description":"A list of comparisons.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComparisonList"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/v1/comparisons/{slug}":{"get":{"operationId":"getComparison","summary":"Get a competitor comparison","description":"Returns a single Gitoryx-versus-competitor comparison, including the capabilities unique to Gitoryx.","tags":["Content"],"deprecated":false,"security":[],"parameters":[{"name":"slug","in":"path","required":true,"description":"Competitor slug, as returned by `listComparisons`.","schema":{"type":"string","pattern":"^[a-z0-9-]+$"},"examples":{"gitkraken":{"value":"gitkraken"}}}],"responses":{"200":{"description":"The requested comparison.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comparison"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}}},"components":{"securitySchemes":{},"headers":{"RateLimit":{"description":"Remaining quota and reset time for the current window, as a structured field: `\"public\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The quota policy in force, as a structured field: `\"public\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests allowed per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying. Only sent on a 429 response.","schema":{"type":"integer"}},"API-Version":{"description":"Semantic version of the API surface that produced the response.","schema":{"type":"string"}}},"responses":{"NotFound":{"description":"The requested resource does not exist.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"MethodNotAllowed":{"description":"The public API is read-only; only GET, HEAD and OPTIONS are supported.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"NotAcceptable":{"description":"The `Accept` header does not allow a JSON response.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"RateLimited":{"description":"The rate limit for this client was exceeded.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"InternalError":{"description":"An unexpected error occurred.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"UpstreamUnavailable":{"description":"A dependency of this endpoint is temporarily unreachable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"schemas":{"Problem":{"type":"object","title":"Problem","description":"RFC 9457 problem document. Returned for every non-2xx response with the `application/problem+json` media type.","required":["type","title","status","code","detail","resolution","documentationUrl"],"additionalProperties":false,"properties":{"type":{"type":"string","format":"uri","description":"Absolute URI identifying the problem type.","examples":["https://www.gitoryx.com/openapi.json#error-not_found"]},"title":{"type":"string","description":"Short, human-readable summary of the problem type.","examples":["Not Found"]},"status":{"type":"integer","description":"HTTP status code, repeated in the body for convenience.","examples":[404]},"code":{"type":"string","enum":["bad_request","not_found","method_not_allowed","not_acceptable","rate_limited","upstream_unavailable","internal_error"],"description":"Stable, machine-readable error code. Never renamed within a major API version."},"detail":{"type":"string","description":"Human-readable explanation specific to this occurrence."},"instance":{"type":"string","description":"Path of the request that produced the problem.","examples":["/api/v1/tutorials/does-not-exist"]},"resolution":{"type":"string","description":"Concrete hint describing how a client can recover."},"documentationUrl":{"type":"string","format":"uri","description":"Link to the documentation for this error code."}}},"Feature":{"type":"object","title":"Feature","required":["id","name","description"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Stable feature identifier.","examples":["commit-graph"]},"name":{"type":"string","description":"Display name of the feature."},"description":{"type":"string","description":"What the feature does."}}},"Plan":{"type":"object","title":"Plan","required":["id","name","description","features","url"],"additionalProperties":false,"properties":{"id":{"type":"string","enum":["free","pro"],"description":"Plan identifier."},"name":{"type":"string","description":"Display name of the plan."},"description":{"type":"string","description":"What the plan includes."},"features":{"type":"array","description":"Feature bullet points included in the plan.","items":{"type":"string"}},"url":{"type":"string","format":"uri","description":"Pricing page for this plan."}}},"UseCase":{"type":"object","title":"UseCase","description":"A job Gitoryx is a good fit for.","required":["id","job","why"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Stable use-case identifier."},"job":{"type":"string","description":"The job the user is trying to get done."},"why":{"type":"string","description":"Why Gitoryx is the right tool for that job."}}},"Product":{"type":"object","title":"Product","description":"Machine-readable description of the Gitoryx desktop application.","required":["name","tagline","description","category","platforms","url","features","plans","useCases","notAFit"],"additionalProperties":false,"properties":{"name":{"type":"string","examples":["Gitoryx"]},"tagline":{"type":"string"},"description":{"type":"string"},"category":{"type":"string","examples":["developer-tools"]},"platforms":{"type":"array","description":"Operating systems the desktop client runs on.","items":{"type":"string","enum":["macOS","Windows"]}},"url":{"type":"string","format":"uri"},"downloadUrl":{"type":"string","format":"uri"},"openapiUrl":{"type":"string","format":"uri"},"features":{"type":"array","items":{"$ref":"#/components/schemas/Feature"}},"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}},"useCases":{"type":"array","items":{"$ref":"#/components/schemas/UseCase"}},"notAFit":{"type":"array","description":"Situations where Gitoryx should not be recommended.","items":{"type":"string"}}}},"Release":{"type":"object","title":"Release","description":"A published Gitoryx desktop release.","required":["version","publishedAt","downloads"],"additionalProperties":false,"properties":{"version":{"type":"string","description":"Semantic version.","examples":["1.8.0"]},"publishedAt":{"type":"string","format":"date-time","description":"ISO 8601 publication timestamp."},"downloads":{"type":"object","description":"Direct download URLs per platform and architecture. `null` when a build is not published for that target.","required":["macosArm64","macosX64","windowsX64"],"additionalProperties":false,"properties":{"macosArm64":{"type":["string","null"],"format":"uri"},"macosX64":{"type":["string","null"],"format":"uri"},"windowsX64":{"type":["string","null"],"format":"uri"}}},"notes":{"type":["string","null"],"description":"Release notes in Markdown, when published."}}},"ReleaseList":{"type":"object","title":"ReleaseList","required":["object","count","data"],"additionalProperties":false,"properties":{"object":{"type":"string","const":"list"},"count":{"type":"integer","description":"Number of items in `data`."},"data":{"type":"array","items":{"$ref":"#/components/schemas/Release"}}}},"TutorialSummary":{"type":"object","title":"TutorialSummary","required":["slug","title","description","category","keywords","readingTimeMinutes","publishedAt","updatedAt","url"],"additionalProperties":false,"properties":{"slug":{"type":"string","examples":["how-to-resolve-merge-conflicts"]},"title":{"type":"string"},"description":{"type":"string"},"category":{"type":"string","enum":["beginner","intermediate","advanced"]},"keywords":{"type":"array","items":{"type":"string"}},"readingTimeMinutes":{"type":"integer"},"publishedAt":{"type":"string","format":"date"},"updatedAt":{"type":"string","format":"date"},"url":{"type":"string","format":"uri"}}},"Tutorial":{"type":"object","title":"Tutorial","allOf":[{"$ref":"#/components/schemas/TutorialSummary"}],"unevaluatedProperties":false,"properties":{"sections":{"type":"array","description":"Table of contents for the tutorial.","items":{"type":"object","required":["id","heading","level"],"additionalProperties":false,"properties":{"id":{"type":"string"},"heading":{"type":"string"},"level":{"type":"integer","enum":[2,3]}}}},"related":{"type":"array","description":"Slugs of editorially related tutorials.","items":{"type":"string"}}}},"TutorialList":{"type":"object","title":"TutorialList","required":["object","count","data"],"additionalProperties":false,"properties":{"object":{"type":"string","const":"list"},"count":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TutorialSummary"}}}},"Comparison":{"type":"object","title":"Comparison","description":"A published comparison between Gitoryx and another Git client.","required":["slug","competitor","tagline","updatedAt","url"],"additionalProperties":false,"properties":{"slug":{"type":"string","examples":["gitkraken"]},"competitor":{"type":"string","examples":["GitKraken"]},"tagline":{"type":"string"},"updatedAt":{"type":"string","format":"date"},"url":{"type":"string","format":"uri"},"uniqueToGitoryx":{"type":"array","description":"Capabilities Gitoryx has that this competitor does not.","items":{"type":"string"}}}},"ComparisonList":{"type":"object","title":"ComparisonList","required":["object","count","data"],"additionalProperties":false,"properties":{"object":{"type":"string","const":"list"},"count":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Comparison"}}}},"Health":{"type":"object","title":"Health","required":["status","version","apiVersion","time"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["ok"],"description":"Service status."},"version":{"type":"string","description":"Semantic version of the API surface."},"apiVersion":{"type":"string","description":"Major version in the URL path.","examples":["v1"]},"time":{"type":"string","format":"date-time","description":"Server time."}}},"ApiIndex":{"type":"object","title":"ApiIndex","description":"Entry point listing every endpoint in this API version.","required":["name","apiVersion","version","openapiUrl","endpoints"],"additionalProperties":false,"properties":{"name":{"type":"string"},"description":{"type":"string"},"apiVersion":{"type":"string","examples":["v1"]},"version":{"type":"string","examples":["1.0.0"]},"openapiUrl":{"type":"string","format":"uri","description":"This API's OpenAPI document, its only published documentation."},"llmsTxtUrl":{"type":"string","format":"uri"},"authentication":{"type":"object","required":["required","description"],"additionalProperties":false,"properties":{"required":{"type":"boolean"},"description":{"type":"string"}}},"rateLimit":{"type":"object","required":["policy","quota","windowSeconds"],"additionalProperties":false,"properties":{"policy":{"type":"string"},"quota":{"type":"integer"},"windowSeconds":{"type":"integer"}}},"versioning":{"type":"object","required":["strategy","current","deprecationPolicy"],"additionalProperties":false,"properties":{"strategy":{"type":"string","examples":["url-path"]},"current":{"type":"string"},"supported":{"type":"array","items":{"type":"string"}},"deprecated":{"type":"array","items":{"type":"string"}},"deprecationPolicy":{"type":"string"}}},"endpoints":{"type":"array","items":{"type":"object","required":["operationId","method","path","description"],"additionalProperties":false,"properties":{"operationId":{"type":"string"},"method":{"type":"string","enum":["GET"]},"path":{"type":"string"},"description":{"type":"string"}}}}}}}}}