{"openapi": "3.1.0", "info": {"title": "PlanetDomains API", "version": "1.3.0", "description": "Domain-core API for PlanetDomains with bearer auth, whitelist IP, and webhook support."}, "servers": [{"url": "https://planet-project.click/api/v1"}], "security": [{"bearerAuth": []}], "paths": {"/account": {"get": {"summary": "Account details", "tags": ["Account"], "responses": {"200": {"description": "Account payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/webhook/deliveries": {"get": {"summary": "Recent webhook delivery attempts", "tags": ["Webhook"], "parameters": [{"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 10}}], "responses": {"200": {"description": "Delivery log payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/zones": {"get": {"summary": "List available zones with register and renew pricing", "tags": ["Reference"], "responses": {"200": {"description": "Zones payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/search": {"get": {"summary": "Search domains", "tags": ["Search"], "parameters": [{"name": "query", "in": "query", "required": true, "schema": {"type": "string", "minLength": 1}}], "responses": {"200": {"description": "Search payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/search/batch": {"post": {"summary": "Search domains in batch", "tags": ["Search"], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["items"], "properties": {"items": {"type": "array", "minItems": 1, "items": {"$ref": "#/components/schemas/DomainSearchBatchItem"}}}}}}}, "responses": {"200": {"description": "Batch search payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains": {"get": {"summary": "List user domains", "tags": ["Domains"], "responses": {"200": {"description": "Domains list payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/{domain}": {"get": {"summary": "Get domain details", "tags": ["Domains"], "parameters": [{"name": "domain", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Domain payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/register": {"post": {"summary": "Register a domain", "tags": ["Trading"], "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DomainRegisterRequest"}}}}, "responses": {"200": {"description": "Registration payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/register/batch": {"post": {"summary": "Register domains in batch", "tags": ["Trading"], "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["items"], "properties": {"items": {"type": "array", "minItems": 1, "items": {"$ref": "#/components/schemas/DomainRegisterRequest"}}}}}}}, "responses": {"200": {"description": "Batch registration payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/renew/batch": {"post": {"summary": "Renew domains in batch", "tags": ["Trading"], "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["items"], "properties": {"items": {"type": "array", "minItems": 1, "items": {"$ref": "#/components/schemas/DomainRenewRequest"}}}}}}}, "responses": {"200": {"description": "Batch renew payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/{domain}/renew": {"post": {"summary": "Renew a domain", "tags": ["Trading"], "parameters": [{"name": "domain", "in": "path", "required": true, "schema": {"type": "string"}}, {"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DomainRenewRequest"}}}}, "responses": {"200": {"description": "Renew payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/{domain}/dns": {"get": {"summary": "Get DNS", "tags": ["DNS"], "parameters": [{"name": "domain", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "DNS payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}, "put": {"summary": "Replace DNS", "tags": ["DNS"], "parameters": [{"name": "domain", "in": "path", "required": true, "schema": {"type": "string"}}, {"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["records"], "properties": {"records": {"type": "array", "minItems": 1, "items": {"$ref": "#/components/schemas/DnsRecord"}}}}}}}, "responses": {"200": {"description": "Updated DNS payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/{domain}/nameservers": {"patch": {"summary": "Replace nameservers", "tags": ["DNS"], "parameters": [{"name": "domain", "in": "path", "required": true, "schema": {"type": "string"}}, {"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["nameservers"], "properties": {"nameservers": {"type": "array", "minItems": 2, "items": {"type": "string"}}}}}}}, "responses": {"200": {"description": "Updated nameserver payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}, "/domains/{domain}/cloudflare/bind": {"post": {"summary": "Bind Cloudflare", "tags": ["Cloudflare"], "parameters": [{"name": "domain", "in": "path", "required": true, "schema": {"type": "string"}}, {"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["cloudflare_profile_key"], "properties": {"cloudflare_profile_key": {"type": "string", "minLength": 1}}}}}}, "responses": {"200": {"description": "Cloudflare bind payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSuccessEnvelope"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}, "409": {"description": "Business conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorEnvelope"}}}}}}}}, "components": {"parameters": {"IdempotencyKey": {"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 1}, "description": "Required for mutating operations to make retries safe and predictable."}}, "securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer"}}, "schemas": {"ApiSuccessEnvelope": {"type": "object", "required": ["status", "result"], "properties": {"status": {"type": "boolean", "const": true}, "result": {"type": "object", "additionalProperties": true}}}, "ApiErrorEnvelope": {"type": "object", "required": ["status", "error"], "properties": {"status": {"type": "boolean", "const": false}, "error": {"type": "object", "required": ["code", "message"], "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}, "DomainSearchBatchItem": {"type": "object", "required": ["query"], "properties": {"query": {"type": "string", "minLength": 1}, "client_ref": {"type": "string"}, "external_ref": {"type": "string"}}}, "DomainRegisterRequest": {"type": "object", "required": ["domain"], "properties": {"domain": {"type": "string", "minLength": 1}, "years": {"type": "integer", "minimum": 1, "default": 1}, "client_ref": {"type": "string"}, "external_ref": {"type": "string"}, "cloudflare_profile_key": {"type": "string"}}}, "DomainRenewRequest": {"type": "object", "required": ["years"], "properties": {"years": {"type": "integer", "minimum": 1}, "client_ref": {"type": "string"}, "external_ref": {"type": "string"}}}, "DnsRecord": {"type": "object", "required": ["type", "hostname", "value"], "properties": {"type": {"type": "string"}, "hostname": {"type": "string"}, "value": {"type": "string"}, "ttl": {"type": "integer", "minimum": 60}, "priority": {"type": "integer", "minimum": 0}}}}}}