{
 "openapi": "3.1.0",
 "info": {
  "title": "Gyro Public API",
  "version": "2.30.0",
  "summary": "Manage Gyro cloud servers, SSH keys and billing programmatically.",
  "x-summary-tr": "Gyro bulut sunucularınızı, SSH anahtarlarınızı ve faturalarınızı programla yönetin.",
  "contact": {
   "name": "Gyro Hosting",
   "url": "https://www.gyrohosting.com"
  },
  "license": {
   "name": "Proprietary",
   "identifier": "LicenseRef-Gyro-API-Terms"
  }
 },
 "servers": [
  {
   "url": "https://www.gyrohosting.com/api/v1/client",
   "description": "Production"
  }
 ],
 "paths": {
  "/cloud/dns/acme-challenge": {
   "post": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeAdd",
    "summary": "Add an ACME challenge TXT value",
    "x-summary-tr": "ACME doğrulama TXT değeri ekle",
    "x-cli": {
     "command": "dns acme-challenge add"
    },
    "parameters": [],
    "description": "Adds `value` to the TXT record set at `name` (TTL 60); other values stay, so the apex and the wildcard of one certificate can be validated together (max 10 values per name). The service and the zone are found from the name (longest Gyro DNS zone of yours that covers it; hosting/cPanel zones are not supported). Idempotent.",
    "x-description-tr": "`value` değerini `name` adındaki TXT kümesine ekler (TTL 60); diğer değerler kalır, böylece bir sertifikanın kök ve joker adları birlikte doğrulanır (ad başına en çok 10 değer). Hizmet ve zone addan bulunur (adı kapsayan en uzun Gyro DNS zone'unuz; hosting/cPanel zone'ları desteklenmez). Tekrarlanabilir.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "_acme-challenge.<domain> (for *.example.com: _acme-challenge.example.com)",
          "x-description-tr": "_acme-challenge.<alan adı> (*.ornek.com için: _acme-challenge.ornek.com)",
          "example": "_acme-challenge.example.com"
         },
         "value": {
          "type": "string",
          "description": "Challenge value (base64url, 16-128 characters)",
          "x-description-tr": "Doğrulama değeri (base64url, 16-128 karakter)"
         }
        },
        "required": [
         "name",
         "value"
        ]
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Added",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  }
 },
 "components": {
  "responses": {
   "Validation": {
    "description": "Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "Conflict": {
    "description": "State conflict (`server_locked`, `not_actionable`, `ssh_key_exists`, `server_limit`, `idempotency_in_flight`)",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "NotFound": {
    "description": "Not found — also returned for objects owned by someone else",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "Unauthorized": {
    "description": "Missing, invalid or revoked key",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   }
  },
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "object",
      "required": [
       "code",
       "message"
      ],
      "properties": {
       "code": {
        "type": "string",
        "example": "server_not_found"
       },
       "message": {
        "type": "string"
       },
       "details": {
        "type": "object",
        "additionalProperties": true,
        "description": "Extra data. Limit refusals add the LimitHint fields (`limit_exceeded: true`, `limit_key`, `limit`, `current`, `how_to_increase`, `support_ticket`, `hint`): account limits are raised with a support ticket. Validation errors (length, format) never carry the limit hint.",
        "x-description-tr": "Ek veri. Sınır retlerinde LimitHint alanları gelir: hesap sınırları destek talebiyle artırılır. Doğrulama hataları (uzunluk, biçim) sınır ipucu taşımaz."
       }
      }
     }
    }
   },
   "AcmeChallenge": {
    "type": "object",
    "properties": {
     "service_id": {
      "type": "integer"
     },
     "zone": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "description": "accepted (add/remove)"
     },
     "values": {
      "type": "integer",
      "description": "Values now at the name"
     },
     "changed": {
      "type": "boolean"
     },
     "ready": {
      "type": "boolean",
      "description": "Status: both name servers publish `value`"
     },
     "nameservers": {
      "type": "object",
      "additionalProperties": {
       "type": [
        "array",
        "null"
       ],
       "items": {
        "type": "string"
       }
      }
     },
     "ttl": {
      "type": "integer"
     }
    }
   }
  }
 },
 "security": [
  {
   "bearerAuth": []
  }
 ]
}