{"components":{"schemas":{"APIError":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"APIResponse":{"properties":{"data":{"description":"Endpoint-specific payload."},"error":{"$ref":"#/components/schemas/APIError"}},"required":["data"],"type":"object"},"BatchCredentialUpdateRequest":{"properties":{"idempotency_key":{"description":"Platform-generated idempotency key. Reuse the same key only for the same logical lifecycle request.","minLength":1,"type":"string"},"instance_ids":{"items":{"type":"integer"},"maxItems":50,"minItems":1,"type":"array"},"max_concurrency":{"maximum":50,"minimum":1,"type":"integer"},"password":{"minLength":1,"type":"string"},"username_prefix":{"description":"Prefix for generated usernames on suppliers that support username updates, such as IPNux.","type":"string"}},"required":["instance_ids","password"],"type":"object"},"BatchOrderRequest":{"properties":{"idempotency_key":{"description":"Platform-generated idempotency key. Reuse the same key only for the same logical lifecycle request.","minLength":1,"type":"string"},"max_concurrency":{"maximum":50,"minimum":1,"type":"integer"},"quantity":{"maximum":50,"minimum":1,"type":"integer"},"resource_id":{"type":"integer"},"supplier":{"enum":["spark","ipnux"],"type":"string"},"time_period":{"description":"Duration in days.","minimum":1,"type":"integer"}},"required":["resource_id","supplier","quantity","time_period","idempotency_key"],"type":"object"},"BatchRenewRequest":{"properties":{"idempotency_key":{"description":"Platform-generated idempotency key. Reuse the same key only for the same logical lifecycle request.","minLength":1,"type":"string"},"instance_ids":{"items":{"type":"integer"},"maxItems":50,"minItems":1,"type":"array"},"max_concurrency":{"maximum":50,"minimum":1,"type":"integer"},"time_period":{"description":"Duration in days.","minimum":1,"type":"integer"}},"required":["instance_ids","time_period"],"type":"object"},"CredentialUpdateRequest":{"description":"Credential update request. Spark currently supports password-only updates and preserves the existing username. IPNux supports username and password updates.","properties":{"idempotency_key":{"description":"Platform-generated idempotency key. Reuse the same key only for the same logical lifecycle request.","minLength":1,"type":"string"},"password":{"minLength":1,"type":"string"},"username":{"description":"Effective for IPNux. Ignored for Spark until Spark confirms a username-edit API.","type":"string"}},"required":["password"],"type":"object"},"OpenOrderRequest":{"properties":{"idempotency_key":{"description":"Platform-generated idempotency key. Reuse the same key only for the same logical lifecycle request.","minLength":1,"type":"string"},"resource_id":{"type":"integer"},"supplier":{"enum":["spark","ipnux"],"type":"string"},"time_period":{"description":"Duration in days.","minimum":1,"type":"integer"}},"required":["resource_id","supplier","time_period","idempotency_key"],"type":"object"},"PlatformTopupRequest":{"properties":{"amount_usd":{"pattern":"^\\d+(\\.\\d{1,6})?$","type":"string"},"reference_id":{"type":"string"}},"required":["amount_usd","reference_id"],"type":"object"},"RenewRequest":{"properties":{"idempotency_key":{"description":"Platform-generated idempotency key. Reuse the same key only for the same logical lifecycle request.","minLength":1,"type":"string"},"time_period":{"description":"Duration in days.","minimum":1,"type":"integer"}},"required":["time_period"],"type":"object"}},"securitySchemes":{"PlatformKey":{"description":"server-side only; do not expose platform keys to customer browsers","in":"header","name":"X-Platform-Key","type":"apiKey"}}},"info":{"description":"Server-side API contract for downstream platforms integrating with the ProxyCore Spark/IPNux static proxy aggregation core.","title":"ProxyCore Platform API","version":"2026-05-31"},"openapi":"3.1.0","paths":{"/v1/batches/credentials":{"post":{"description":"Update credentials for multiple static IP instances.\n\nIdempotency: body.idempotency_key or Idempotency-Key header.\n\nBatch limit: max 50 items, max concurrency 50.\n\nSpark credential mode: password_only; IPNux credential mode: username_password.","operationId":"batch_update_credentials","parameters":[{"description":"Optional idempotency key. The request body idempotency_key is preferred for consistent platform logging.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCredentialUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Update credentials for multiple static IP instances.","tags":["Batches"],"x-batch":{"item_idempotency":"\u003cbatch-key\u003e:\u003cindex\u003e","max_concurrency":50,"max_items":50,"partial_failure":true},"x-idempotency":"body.idempotency_key or Idempotency-Key header"}},"/v1/batches/orders":{"post":{"description":"Open multiple static IP instances.\n\nIdempotency: body.idempotency_key.\n\nBatch limit: max 50 items, max concurrency 50.","operationId":"batch_open","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchOrderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Open multiple static IP instances.","tags":["Batches"],"x-batch":{"item_idempotency":"\u003cbatch-key\u003e:\u003cindex\u003e","max_concurrency":50,"max_items":50,"partial_failure":true},"x-idempotency":"body.idempotency_key"}},"/v1/batches/renewals":{"post":{"description":"Renew multiple static IP instances.\n\nIdempotency: body.idempotency_key or Idempotency-Key header.\n\nBatch limit: max 50 items, max concurrency 50.","operationId":"batch_renew","parameters":[{"description":"Optional idempotency key. The request body idempotency_key is preferred for consistent platform logging.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRenewRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Renew multiple static IP instances.","tags":["Batches"],"x-batch":{"item_idempotency":"\u003cbatch-key\u003e:\u003cindex\u003e","max_concurrency":50,"max_items":50,"partial_failure":true},"x-idempotency":"body.idempotency_key or Idempotency-Key header"}},"/v1/batches/{batch_id}":{"get":{"description":"Read batch result and per-item statuses.","operationId":"batch_detail","parameters":[{"description":"Batch operation ID.","in":"path","name":"batch_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read batch result and per-item statuses.","tags":["Batches"]}},"/v1/instances":{"get":{"description":"List platform static IP instances.","operationId":"instance_list","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"List platform static IP instances.","tags":["Lifecycle"]}},"/v1/instances/{instance_id}":{"get":{"description":"Read one static IP instance.","operationId":"instance_detail","parameters":[{"description":"Static proxy instance ID.","in":"path","name":"instance_id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read one static IP instance.","tags":["Lifecycle"]}},"/v1/instances/{instance_id}/credentials":{"post":{"description":"Update one static IP credential.\n\nIdempotency: body.idempotency_key or Idempotency-Key header.\n\nSpark credential mode: password_only; IPNux credential mode: username_password.","operationId":"single_update_credentials","parameters":[{"description":"Static proxy instance ID.","in":"path","name":"instance_id","required":true,"schema":{"type":"integer"}},{"description":"Optional idempotency key. The request body idempotency_key is preferred for consistent platform logging.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Update one static IP credential.","tags":["Lifecycle"],"x-idempotency":"body.idempotency_key or Idempotency-Key header"}},"/v1/instances/{instance_id}/renew":{"post":{"description":"Renew one static IP instance.\n\nIdempotency: body.idempotency_key or Idempotency-Key header.","operationId":"single_renew","parameters":[{"description":"Static proxy instance ID.","in":"path","name":"instance_id","required":true,"schema":{"type":"integer"}},{"description":"Optional idempotency key. The request body idempotency_key is preferred for consistent platform logging.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Renew one static IP instance.","tags":["Lifecycle"],"x-idempotency":"body.idempotency_key or Idempotency-Key header"}},"/v1/ops/openapi":{"get":{"description":"Read the machine-readable OpenAPI 3.1 platform contract.","operationId":"openapi_contract","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read the machine-readable OpenAPI 3.1 platform contract.","tags":["Ops"]}},"/v1/ops/supplier-operations":{"get":{"description":"Read supplier operation logs for acceptance and debugging.","operationId":"supplier_operation_logs","parameters":[{"description":"Optional supplier filter.","in":"query","name":"supplier","required":false,"schema":{"type":"string"}},{"description":"Optional supplier operation filter.","in":"query","name":"operation","required":false,"schema":{"type":"string"}},{"description":"Optional status filter.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Maximum rows to return.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read supplier operation logs for acceptance and debugging.","tags":["Suppliers"]}},"/v1/orders":{"get":{"description":"List platform orders.","operationId":"order_list","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"List platform orders.","tags":["Lifecycle"]},"post":{"description":"Open one static IP instance.\n\nIdempotency: body.idempotency_key.","operationId":"single_open","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenOrderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Open one static IP instance.","tags":["Lifecycle"],"x-idempotency":"body.idempotency_key"}},"/v1/orders/{order_no}":{"get":{"description":"Read one order by order number.","operationId":"order_detail","parameters":[{"description":"ProxyCore order number.","in":"path","name":"order_no","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read one order by order number.","tags":["Lifecycle"]}},"/v1/platform/balance":{"get":{"description":"Read platform prepaid balance.","operationId":"platform_balance","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read platform prepaid balance.","tags":["Platform"]}},"/v1/platform/ledger":{"get":{"description":"Read platform ledger entries.","operationId":"platform_ledger","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read platform ledger entries.","tags":["Platform"]}},"/v1/platform/topups":{"post":{"description":"Create a manual platform top-up for acceptance/demo environments.","operationId":"platform_topup","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformTopupRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Create a manual platform top-up for acceptance/demo environments.","tags":["Platform"]}},"/v1/resources":{"get":{"description":"Read available static proxy resources.","operationId":"resource_catalog","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read available static proxy resources.","tags":["Resources"]}},"/v1/resources/{resource_id}":{"get":{"description":"Read one resource by numeric resource ID.","operationId":"resource_detail","parameters":[{"description":"Numeric resource ID.","in":"path","name":"resource_id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read one resource by numeric resource ID.","tags":["Resources"]}},"/v1/resources/{resource_id}/pricing":{"get":{"description":"Quote static IP cost for quantity/time_period/supplier.","operationId":"static_pricing","parameters":[{"description":"Numeric resource ID.","in":"path","name":"resource_id","required":true,"schema":{"type":"integer"}},{"description":"Number of static IPs to quote.","in":"query","name":"quantity","required":true,"schema":{"type":"integer"}},{"description":"Duration in days.","in":"query","name":"time_period","required":true,"schema":{"type":"integer"}},{"description":"Supplier code, spark or ipnux.","in":"query","name":"supplier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Quote static IP cost for quantity/time_period/supplier.","tags":["Resources"]}},"/v1/suppliers/capabilities":{"get":{"description":"Read supplier credential capability modes.","operationId":"supplier_capability_discovery","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Successful platform response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Missing or invalid platform key"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Idempotency conflict or duplicate lifecycle request"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIResponse"}}},"description":"Temporary supplier or runtime failure"}},"security":[{"PlatformKey":[]}],"summary":"Read supplier credential capability modes.","tags":["Suppliers"],"x-supplier-credential-modes":{"ipnux":"username_password","spark":"password_only"}}}},"security":[{"PlatformKey":[]}],"servers":[{"description":"Local ProxyCore acceptance console runtime","url":"http://127.0.0.1:18122"},{"description":"Production Go Core base URL","url":"https://\u003cproxycore-go-core\u003e"}],"tags":[{"name":"Resources"},{"name":"Lifecycle"},{"name":"Batches"},{"name":"Suppliers"},{"name":"Platform"},{"name":"Ops"}],"x-supplier-credential-modes":{"ipnux":"username_password","spark":"password_only"}}
