MENU navbar-image

Introduction

This api lets you control nearly everything related to prepaid-hoster services. Be aware that this API is still in dev status and its endpoints is subject to change.

This documentation aims to provide all the information you need to work with our API.

Base URL

https://api.pph.sh

Authenticating requests

Authenticate requests to this API's endpoints by sending a X-Token header with the value "{YOUR_ACCESS_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting your dashboard and clicking Generate API token.

Affiliate

Get a list of official banners

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/affiliate/banners" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/affiliate/banners"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "id": "Dedicated_300x250_Medium-Rectangle-Inline-Rectangle-dark",
            "data": [
                "Affiliate-Banner-Dedicated",
                "300x250",
                "Medium-Rectangle-Inline-Rectangle-dark"
            ],
            "hash": "334c698f89abe0bea83d48338fcdb3fb",
            "name": "Medium Rectangle Inline Rectangle",
            "width": 300,
            "height": 250,
            "category": "dedicated",
            "friendly_name": "[Dedicated] Medium Rectangle Inline Rectangle (300x250, dark)",
            "style": "dark",
            "preview": "https://api.pph.sh/public/affiliate/banners/preview/Dedicated_300x250_Medium-Rectangle-Inline-Rectangle-dark.png"
        }
    ]
}
 

Request   

GET public/affiliate/banners

Get banner html code

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/affiliate/banners/code/ea/totam" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/affiliate/banners/code/ea/totam"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "ErrorException",
        "url": "https://fsn-01.api.pph.sh/public/affiliate/banners/code/ea/totam",
        "message": "Undefined array key \"category\"",
        "trace": "ErrorException: Undefined array key \"category\" in /var/www/api/app/Api/Affiliate/Controllers/AffiliateBannerController.php:39\nStack trace:\n#0 /var/www/api/app/Api/Affiliate/Controllers/AffiliateBannerController.php(39): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError()\n#1 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Api\\Affiliate\\Controllers\\AffiliateBannerController->bannerCode()\n#2 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()\n#3 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#26 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#28 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#29 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#34 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#35 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#36 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#48 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#52 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#54 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#55 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#56 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#59 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#60 {main}"
    }
}
 

Request   

GET public/affiliate/banners/code/{partner}/{banner}

URL Parameters

partner  string  

banner  string  

Get affiliate details

requires authentication

Returns affiliate details. Creates an affiliate account when not yet created.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "affiliate_id": 41003,
        "enabled": 0,
        "activated": 1,
        "plan": "community",
        "minimum_payout_value": 5,
        "confirmation_window": 15,
        "banner_views": 6423,
        "clicks": 39,
        "conversion30": 0,
        "conversions": {
            "confirmed": 10,
            "unconfirmed": 3
        },
        "payout": {
            "type": "credit",
            "unconfirmed": 0.57,
            "available": 8.22,
            "payout_available": false,
            "minimum": 5
        },
        "pending_payout": false,
        "urls": [
            "https://pph.sh/partner/41003"
        ]
    }
}
 

Request   

GET client/affiliate

Get affiliate details

requires authentication

Returns affiliate details. Creates an affiliate account when not yet created.

Example request:
curl --request POST \
    "https://api.pph.sh/client/affiliate/activate" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/activate"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/affiliate/activate

Check if affiliate account exists.

requires authentication

*

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate/exists" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/exists"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "exists": true,
        "debug": {
            "e": true,
            "s": 1
        }
    }
}
 

Request   

GET client/affiliate/exists

Get conversions

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate/conversions" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/conversions"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "ordernum": 3771055779,
            "type": "hosting",
            "tier": "tier_1",
            "confirmed": 0,
            "dismissed": 0,
            "paid_out": 0,
            "order_date": "2022-01-31",
            "description": "Bestellung: Linux vServer",
            "payout": null,
            "provision": {
                "full_value": 2.86,
                "affiliate_value": 0.57,
                "percentage": 20,
                "available_at": "2022-02-15"
            }
        }
    ]
}
 

Request   

GET client/affiliate/conversions

Get payouts

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate/payouts" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/payouts"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 7,
            "uuid": "adace2ae-627b-4f26-8c87-e920c0ca08c0",
            "value": 11.57,
            "status": "done",
            "review": "done",
            "ticket_id": 975612,
            "type": "credit",
            "invoice_id": 171345,
            "created_at": "2021-10-13T14:05:47.000000Z",
            "conversions_count": 6,
            "partner": {
                "id": 41003,
                "firstname": "Dennis",
                "lastname": "Ziolkowski!"
            }
        }
    ],
    "links": {
        "first": "https://fsn-01.api.pph.sh/client/affiliate/payouts?page=1",
        "last": "https://fsn-01.api.pph.sh/client/affiliate/payouts?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://fsn-01.api.pph.sh/client/affiliate/payouts?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://fsn-01.api.pph.sh/client/affiliate/payouts",
        "per_page": 15,
        "to": 1,
        "total": 1
    }
}
 

Request   

GET client/affiliate/payouts

Get clicks

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate/clicks" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/clicks"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "hash": "d23889c2873273e7047d0b232dffa84b",
            "first_click": "2022-01-18T13:37:34.000000Z",
            "last_click": "2022-01-18T13:37:34.000000Z",
            "views": 1
        }
    ]
}
 

Request   

GET client/affiliate/clicks

Response

Response Fields

data[].hash    

The session id

data[].first_click    

The first click

data[].last_click    

The last click

data[].views    

The number of views

Get default provisions

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate/provisions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/provisions"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "webhosting": {
            "group": "webhosting",
            "label": "Webhosting",
            "provision": 30
        },
        "kvm-server": {
            "group": "kvm-server",
            "label": "KVM Server (konfigurierbar)",
            "provision": 25
        },
        "domains": {
            "group": "domains",
            "label": "Domains",
            "provision": 5
        },
        "dedicated": {
            "group": "dedicated",
            "label": "Dedicated Server",
            "provision": 5
        },
        "cloud-server": {
            "group": "cloud-server",
            "label": "Cloud Server (OpenVZ)",
            "provision": 20
        }
    }
}
 

Request   

GET client/affiliate/provisions

Get available payout summary

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/affiliate/payout/availability" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/payout/availability"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "type": "credit",
        "unconfirmed": 0.57,
        "available": 8.22,
        "payout_available": false,
        "minimum": 5
    }
}
 

Request   

GET client/affiliate/payout/availability

Request a payout

Example request:
curl --request POST \
    "https://api.pph.sh/client/affiliate/payout/request" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/affiliate/payout/request"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/affiliate/payout/request

Bonus events

Information about next bonus event

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/bonus" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/bonus"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "bonus": {
        "name": "BLACK FRIDAY 2023",
        "start": "2023-11-23 22:22:22",
        "end": "2023-11-26 23:59:59",
        "active": false,
        "start_in": "vor 4 Monaten 3 Wochen 6 Stunden",
        "end_in": "vor 4 Monaten 2 Wochen 4 Tagen",
        "description": "Erhalte von 23.11.2023 22:22 bis 26.11.2023 23:59 auf jede Aufladung Extra-Guthaben!"
    }
}
 

Request   

GET public/bonus

Response

Response Fields

bonus.name  string  

The bonus event name

bonus.start  string  

The bonus event start date

bonus.end  string  

The bonus event end date

bonus.active  boolean  

Is the bonus event active

bonus.handler  string  

The bonus event handler class

bonus.description  string  

The bonus event description

bonus.banner  string  

The bonus event banner

Calculate bonus amount

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/bonus/credit" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"amount\": 15
}"
const url = new URL(
    "https://api.pph.sh/public/bonus/credit"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "amount": 15
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "bonus": false
}
 

Request   

GET public/bonus/credit

Body Parameters

amount  number  

The amount to calculate the bonus for.

Response

Response Fields

extra  number  

The bonus amount

Client Account

Class CreditActionController

Account

requires authentication

Returns information about the client.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "id": 41003,
        "firstname": "Dennis",
        "lastname": "Ziolkowski!",
        "full_name": "Dennis Ziolkowski!",
        "email": "dezio1991@gmail.com",
        "company": "",
        "address1": "Am Sonnenhang 20",
        "address2": "",
        "postcode": "23730",
        "city": "Neustadt in Holstein",
        "country": "DE",
        "phonenumber": "0160 4047244",
        "datecreated": "2020-06-26T22:00:00.000000Z",
        "lastlogin": "2024-04-14T02:15:05.000000Z",
        "credit": 7.68,
        "credit_on_open_invoices": 0,
        "currency": {
            "id": 1,
            "code": "EUR",
            "prefix": "",
            "suffix": "€",
            "format": 3,
            "rate": "1.00000",
            "default": 1
        },
        "projected_hosting_value": 175.92,
        "avatar": "https://www.gravatar.com/avatar/41d76aabf67b9b197ca5523541a909e7"
    }
}
 

Request   

GET client

Query Parameters

contacts  boolean optional  

Append client contacts.

hostings  boolean optional  

Append client hostings.

tickets  boolean optional  

Append client tickets.

domains  boolean optional  

Append client domains.

transactions  boolean optional  

Append client transactions.

invoices  boolean optional  

Append client invoices.

orders  boolean optional  

Append orders invoices.

Web interface login

requires authentication

Returns a link for direct login to vionity. The link expires after 30 seconds.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/webinterface" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/webinterface"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "url": "https://vionity.de/userlogin/b8c9bc363c7f9e33154dfa7ab154a21d/c7116c5e521d31321c2c26d09650b7f6?m=dezio1991%40gmail.com&h=b0f98dd8ed741decca002d58b4061c82&t=1713063600&v=eyJpdiI6InZrOUhwWEVHeXY1M2dqeWV0ektGZXc9PSIsInZhbHVlIjoiTzRkWnN0NEdmV0lCR3RZWTdVdFNTUT09IiwibWFjIjoiODQwOTQ5ZTg5MWQ4YTUwOGE1MTRjYjEzZDNlOGU5MjMzMzBkMGNkNjFkYzU5ZTcxYTQzNjA5MDBiYzFmYzA5ZSIsInRhZyI6IiJ9"
    }
}
 

Request   

GET client/webinterface

Update account

requires authentication

Update client account information. Be aware: All changes are logged internally. Fields labelled with "May be required" are required when the client has an active domain.

Changing the email address is not possible via api. Consult support when required.

Example request:
curl --request POST \
    "https://api.pph.sh/client" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"firstname\": \"John\",
    \"lastname\": \"Doe\",
    \"country\": \"de\",
    \"phonenumber\": \"0123 456789\",
    \"newsletter\": true
}"
const url = new URL(
    "https://api.pph.sh/client"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "firstname": "John",
    "lastname": "Doe",
    "country": "de",
    "phonenumber": "0123 456789",
    "newsletter": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client

Body Parameters

firstname  string  

Your first name.

lastname  string optional  

May be required.

company  string optional  

Company name.

address  string optional  

May be required.

postcode  string optional  

May be required.

city  string optional  

May be required.

country  string  

Country code as specified in ISO 3166-1 (Alpha-2 Code) ▶ https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes.

phonenumber  string optional  

May be required. Format: 0123 456789.

newsletter  boolean optional  

Whether to receive newsletter.

Contact details

requires authentication

Returns only the contact details for a client.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/contact" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/contact"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "firstname": "Dennis",
        "lastname": "Ziolkowski!",
        "companyname": "",
        "email": "dezio1991@gmail.com",
        "address1": "Am Sonnenhang 20",
        "address2": "",
        "postcode": "23730",
        "city": "Neustadt in Holstein",
        "country": "DE",
        "phonenumber": "0160 4047244",
        "validation": true
    }
}
 

Request   

GET client/contact

Short summary

requires authentication

Returns a short summary about the client.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/summary" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/summary"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "credit": 7.68,
        "hostings": 15,
        "domains": 7,
        "support": 0,
        "invoices": 2
    }
}
 

Request   

GET client/summary

Response

Response Fields

credit  number  

Available credit.

hostings  integer  

Number of active hostings.

domains  integer  

Number of active domains.

support  integer  

Number of active support requests.

invoices  integer  

Number of unpaid invoices.

Available credit actions

Returns a list of available actions for available credit

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/credit/actions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/credit/actions"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "credit": 7.68,
        "actions": [],
        "others": [
            {
                "invoice": 262775,
                "amount": 63.99,
                "missing_credit": 56.31,
                "items": [
                    "Dedicated Server - 28770-62311.mein-dedicated.de (14.04.2024 - 13.05.2024)"
                ]
            },
            {
                "invoice": 263160,
                "amount": 20.38,
                "missing_credit": 12.7,
                "items": [
                    "KVM Konfigurierbar 2.0 - 99366-41003.pph-server.de (18.04.2024 - 17.05.2024)"
                ]
            }
        ],
        "missing_credit": 69.01
    }
}
 

Request   

GET client/credit/actions

GET client/token/verify

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/token/verify" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/token/verify"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
 

{
    "data": {
        "token": "0755ae85044245f5c9348bc2ae1155ba08709fb87b1abd48ddb61d78ad4e556d",
        "valid": true
    }
}
 

Request   

GET client/token/verify

Response

Response Fields

data.token  string  

The token from the request.

data.valid  boolean  

Whether the token is valid.

Client Domains

Active domains

requires authentication

Returns a list of active domains.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 7828,
            "domain": "laravel-cloud.de",
            "domain_idn": "laravel-cloud.de",
            "firstamount": 3.99,
            "recurringamount": 3.99,
            "status": "Active",
            "register_date": "2024-03-14T23:00:00.000000Z",
            "next_due_date": "2025-03-14T23:00:00.000000Z",
            "next_due_in": 334,
            "next_due_human": "in 11 Monaten"
        },
        {
            "id": 7770,
            "domain": "neos-builder.de",
            "domain_idn": "neos-builder.de",
            "firstamount": 3.99,
            "recurringamount": 3.99,
            "status": "Active",
            "register_date": "2024-02-21T23:00:00.000000Z",
            "next_due_date": "2025-02-21T23:00:00.000000Z",
            "next_due_in": 313,
            "next_due_human": "in 10 Monaten"
        },
        {
            "id": 7283,
            "domain": "twitter-preview.de",
            "domain_idn": "twitter-preview.de",
            "firstamount": 8.99,
            "recurringamount": 8.99,
            "status": "Active",
            "register_date": "2023-10-24T22:00:00.000000Z",
            "next_due_date": "2024-10-24T22:00:00.000000Z",
            "next_due_in": 193,
            "next_due_human": "in 6 Monaten"
        },
        {
            "id": 6659,
            "domain": "radio-app.eu",
            "domain_idn": "radio-app.eu",
            "firstamount": 8.99,
            "recurringamount": 8.99,
            "status": "Active",
            "register_date": "2023-03-26T22:00:00.000000Z",
            "next_due_date": "2025-03-26T23:00:00.000000Z",
            "next_due_in": 346,
            "next_due_human": "in 11 Monaten"
        },
        {
            "id": 6129,
            "domain": "clientify.de",
            "domain_idn": "clientify.de",
            "firstamount": 8.99,
            "recurringamount": 8.99,
            "status": "Active",
            "register_date": "2022-08-24T22:00:00.000000Z",
            "next_due_date": "2025-02-14T23:00:00.000000Z",
            "next_due_in": 306,
            "next_due_human": "in 10 Monaten"
        },
        {
            "id": 5373,
            "domain": "pph.sh",
            "domain_idn": "pph.sh",
            "firstamount": 0,
            "recurringamount": 0,
            "status": "Expired",
            "register_date": "2021-12-26T23:00:00.000000Z",
            "next_due_date": "2023-12-26T23:00:00.000000Z",
            "next_due_in": 109,
            "next_due_human": "vor 3 Monaten"
        },
        {
            "id": 5082,
            "domain": "pph.systems",
            "domain_idn": "pph.systems",
            "firstamount": 4.99,
            "recurringamount": 11.99,
            "status": "Expired",
            "register_date": "2021-08-31T22:00:00.000000Z",
            "next_due_date": "2022-08-31T22:00:00.000000Z",
            "next_due_in": 591,
            "next_due_human": "vor 1 Jahr"
        },
        {
            "id": 4953,
            "domain": "trashmail-api.de",
            "domain_idn": "trashmail-api.de",
            "firstamount": 0,
            "recurringamount": 0,
            "status": "Expired",
            "register_date": "2021-07-14T22:00:00.000000Z",
            "next_due_date": "2024-07-14T22:00:00.000000Z",
            "next_due_in": 91,
            "next_due_human": "in 3 Monaten"
        },
        {
            "id": 4099,
            "domain": "brotime-twitch.de",
            "domain_idn": "brotime-twitch.de",
            "firstamount": 0,
            "recurringamount": 0,
            "status": "Active",
            "register_date": "2020-08-21T22:00:00.000000Z",
            "next_due_date": "2024-08-21T22:00:00.000000Z",
            "next_due_in": 129,
            "next_due_human": "in 4 Monaten"
        },
        {
            "id": 4040,
            "domain": "übertragungsdauer.de",
            "domain_idn": "xn--bertragungsdauer-izb.de",
            "firstamount": 0,
            "recurringamount": 0,
            "status": "Active",
            "register_date": "2020-07-15T22:00:00.000000Z",
            "next_due_date": "2024-07-15T22:00:00.000000Z",
            "next_due_in": 92,
            "next_due_human": "in 3 Monaten"
        }
    ]
}
 

Request   

GET client/domains

Response

Response Fields

data[].id  integer  

Domain ID

data[].domain  string  

Domain name

data[].domain_idn  string  

Domain name in IDN format

data[].firstamount  number  

First payment amount

data[].recurringamount  number  

Recurring payment amount

data[].status  string  

Domain status (Active, Pending, Pending Transfer, Expired, Cancelled, Transferred Away, Fraud)

data[].register_date  string  

Domain registration date

data[].next_due_date  string  

Domain expiry date

data[].next_due_human  string  

Domain expiry date in human readable format

Single domain

requires authentication

Returns information about a single domain.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "id": 6129,
        "domain": "clientify.de",
        "domain_idn": "clientify.de",
        "firstamount": 8.99,
        "recurringamount": 8.99,
        "status": "Active",
        "register_date": "2022-08-24T22:00:00.000000Z",
        "next_due_date": "2025-02-14T23:00:00.000000Z",
        "next_due_in": 306,
        "next_due_human": "in 10 Monaten"
    }
}
 

Request   

GET client/domains/{domainId}

URL Parameters

The domainId id  int  

Response

Response Fields

data.id  integer  

Domain ID

data.domain  string  

Domain name

data.domain_idn  string  

Domain name in IDN format

data.firstamount  number  

First payment amount

data.recurringamount  number  

Recurring payment amount

data.status  string  

Domain status (Active, Pending, Expired, etc.)

data.register_date  string  

Domain registration date

data.next_due_date  string  

Domain expiry date

data.next_due_human  string  

Domain expiry date in human readable format

Domain invoices

requires authentication

Returns a list of invoices connected to a domain

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/invoices" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/invoices"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 203625,
            "duedate": "2022-08-24T22:00:00.000000Z",
            "datepaid": "2022-08-25T14:38:57.000000Z",
            "date": "2022-08-24T22:00:00.000000Z",
            "subtotal": 7.55,
            "credit": 8.99,
            "tax": 1.44,
            "taxrate": 19,
            "total": 8.99,
            "status": "Paid",
            "status_label": "Bezahlt",
            "is_open": false,
            "items": [
                {
                    "id": 235213,
                    "invoiceid": 203625,
                    "type": "DomainRegister",
                    "short_description": "Domainregistrierung - clientify.de - 1 Jahr(e) (25.08.2022 - 24.08.2023)",
                    "description": "Domainregistrierung - clientify.de - 1 Jahr(e) (25.08.2022 - 24.08.2023)",
                    "relid": 6129,
                    "amount": 8.99,
                    "taxed": 1,
                    "donation": false
                }
            ],
            "donation_invoice": false,
            "resources": {
                "invoice": "https://api.pph.sh/client/invoices/203625",
                "download": "https://api.pph.sh/client/invoices/203625/download"
            }
        },
        {
            "id": 220492,
            "duedate": "2023-02-14T23:00:00.000000Z",
            "datepaid": "2023-02-05T13:14:00.000000Z",
            "date": "2023-02-04T23:00:00.000000Z",
            "subtotal": 7.55,
            "credit": 8.99,
            "tax": 1.44,
            "taxrate": 19,
            "total": 8.99,
            "status": "Paid",
            "status_label": "Bezahlt",
            "is_open": false,
            "items": [
                {
                    "id": 258393,
                    "invoiceid": 220492,
                    "type": "Domain",
                    "short_description": "Domain Verlängerung - clientify.de - 1 Jahr(e) (15.02.2023 - 14.02.2024)",
                    "description": "Domain Verlängerung - clientify.de - 1 Jahr(e) (15.02.2023 - 14.02.2024)",
                    "relid": 6129,
                    "amount": 8.99,
                    "taxed": 1,
                    "donation": false
                }
            ],
            "donation_invoice": false,
            "resources": {
                "invoice": "https://api.pph.sh/client/invoices/220492",
                "download": "https://api.pph.sh/client/invoices/220492/download"
            }
        },
        {
            "id": 253514,
            "duedate": "2024-02-14T23:00:00.000000Z",
            "datepaid": "2024-01-06T03:00:34.000000Z",
            "date": "2024-01-05T23:00:00.000000Z",
            "subtotal": 7.55,
            "credit": 8.99,
            "tax": 1.44,
            "taxrate": 19,
            "total": 8.99,
            "status": "Paid",
            "status_label": "Bezahlt",
            "is_open": false,
            "items": [
                {
                    "id": 306238,
                    "invoiceid": 253514,
                    "type": "Domain",
                    "short_description": "Domain Verlängerung - clientify.de - 1 Jahr(e) (15.02.2024 - 14.02.2025)",
                    "description": "Domain Verlängerung - clientify.de - 1 Jahr(e) (15.02.2024 - 14.02.2025)",
                    "relid": 6129,
                    "amount": 8.99,
                    "taxed": 1,
                    "donation": false
                }
            ],
            "donation_invoice": false,
            "resources": {
                "invoice": "https://api.pph.sh/client/invoices/253514",
                "download": "https://api.pph.sh/client/invoices/253514/download"
            }
        }
    ],
    "links": {
        "first": "https://fsn-01.api.pph.sh/client/domains/6129/invoices?page=1",
        "last": "https://fsn-01.api.pph.sh/client/domains/6129/invoices?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://fsn-01.api.pph.sh/client/domains/6129/invoices?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://fsn-01.api.pph.sh/client/domains/6129/invoices",
        "per_page": 15,
        "to": 3,
        "total": 3
    }
}
 

Request   

GET client/domains/{domainId}/invoices

URL Parameters

The domainId id  int  

Get redirects

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/redirect/subdomains" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/redirect/subdomains"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "domain": "6129",
        "subDomains": []
    }
}
 

Request   

GET client/domains/{domainId}/dns/redirect/subdomains

URL Parameters

The domainId id  int  

Get all redirects

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/redirect" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/redirect"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "redirects": []
    }
}
 

Request   

GET client/domains/{domainId}/dns/redirect

URL Parameters

The domainId id  int  

Rebuild redirects on the server

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/redirect/build" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/redirect/build"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
content-type: text/html; charset=UTF-8
cache-control: no-cache, private
access-control-allow-origin: *
 


 

Request   

GET client/domains/{domainId}/dns/redirect/build

URL Parameters

The domainId id  int  

Receive nameservers

requires authentication

Returns a domains nameservers as set by the registrar.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/nameserver" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/nameserver"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "domain": "clientify.de",
        "nameservers": [
            "ns1.kramer-dns.de",
            "ns2.kramer-dns.de",
            "ns3.kramer-dns.de"
        ]
    }
}
 

Request   

GET client/domains/{domainId}/dns/nameserver

URL Parameters

The domainId id  int  

Response

Response Fields

nameservers  string[]  

The nameservers of the domain

Set nameservers

requires authentication

Set the nameservers of a domain.

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/nameserver" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"nameservers\": null
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/nameserver"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "nameservers": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/nameserver

URL Parameters

The domainId id  int  

Body Parameters

nameservers  string[]  

List of nameservers. A minimum of 2 is required. A maximum of 5 is possible.

Autocomplete Nameservers

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/nameserver/autocomplete?nameserver=ns1.kramer-dns.de" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/nameserver/autocomplete"
);

const params = {
    "nameserver": "ns1.kramer-dns.de",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "nameservers": [
            "ns1.kramer-dns.de",
            "ns2.kramer-dns.de",
            "ns3.kramer-dns.de"
        ]
    }
}
 

Request   

GET client/domains/{domainId}/dns/nameserver/autocomplete

URL Parameters

The domainId id  int  

Query Parameters

nameserver  string optional  

The first nameserver.

Response

Response Fields

data.nameservers  string[]  

The nameservers as responded by the first NS

DNS Records

requires authentication

Returns a list of DNS records in kramer-dns for a domain.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/records?all=1" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/records"
);

const params = {
    "all": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "domain": "clientify.de",
        "records": [
            {
                "id": 369217,
                "name": "mon",
                "full_name": "mon.clientify.de",
                "type": "A",
                "content": "91.39.108.120",
                "last_changed": 1712248744,
                "ttl": 3800,
                "ret": "0",
                "editable": true
            },
            {
                "id": 367211,
                "name": "",
                "full_name": "clientify.de",
                "type": "A",
                "content": "212.87.215.83",
                "last_changed": 1704585977,
                "ttl": 43200,
                "ret": "0",
                "editable": true
            },
            {
                "id": 373093,
                "name": "autodiscover",
                "full_name": "autodiscover.clientify.de",
                "type": "A",
                "content": "127.0.13.37",
                "last_changed": 1708901130,
                "ttl": 43200,
                "ret": "0",
                "editable": true
            },
            {
                "id": 367212,
                "name": "*",
                "full_name": "*.clientify.de",
                "type": "A",
                "content": "212.87.215.83",
                "last_changed": 1704585977,
                "ttl": 43200,
                "ret": "0",
                "editable": true
            },
            {
                "id": 369216,
                "name": "mon",
                "full_name": "mon.clientify.de",
                "type": "AAAA",
                "content": "2003:db:57ff:4b05:66fd:96ff:fe4b:933d",
                "last_changed": 1712248744,
                "ttl": 3800,
                "ret": "0",
                "editable": true
            },
            {
                "id": 367208,
                "name": "webmail",
                "full_name": "webmail.clientify.de",
                "type": "CNAME",
                "content": "webmail.kramer-hosting.de",
                "last_changed": 1704585966,
                "ttl": 86400,
                "ret": "0",
                "editable": true
            },
            {
                "id": 367205,
                "name": "",
                "full_name": "clientify.de",
                "type": "MX",
                "content": "mail.clientify.de",
                "last_changed": 1704585966,
                "ttl": 86400,
                "ret": "0",
                "editable": true,
                "priority": 10
            },
            {
                "id": 367202,
                "name": "",
                "full_name": "clientify.de",
                "type": "NS",
                "content": "ns1.kramer-dns.de",
                "last_changed": 1704585966,
                "ttl": 86400,
                "ret": "0",
                "editable": false
            },
            {
                "id": 367203,
                "name": "",
                "full_name": "clientify.de",
                "type": "NS",
                "content": "ns2.kramer-dns.de",
                "last_changed": 1704585966,
                "ttl": 86400,
                "ret": "0",
                "editable": false
            },
            {
                "id": 367209,
                "name": "",
                "full_name": "clientify.de",
                "type": "NS",
                "content": "ns3.kramer-dns.de",
                "last_changed": 1704585966,
                "ttl": 86400,
                "ret": "0",
                "editable": false
            },
            {
                "id": 367201,
                "name": "",
                "full_name": "clientify.de",
                "type": "SOA",
                "content": "ns1.kramer-dns.de. hostmaster.kramer-dns.de. 2024040403 43200 7200 1209600 86400",
                "last_changed": 1712248744,
                "ttl": 86400,
                "ret": "0",
                "editable": false
            },
            {
                "id": 373094,
                "name": "_autodiscover._tcp",
                "full_name": "_autodiscover._tcp.clientify.de",
                "type": "SRV",
                "content": "0 0 443 autodiscover.clientify.de",
                "last_changed": 1708901282,
                "ttl": 43200,
                "ret": "0",
                "editable": true,
                "srv": {
                    "weight": "0",
                    "target": "autodiscover.clientify.de",
                    "name": "clientify.de",
                    "type": "_autodiscover",
                    "port": "443",
                    "record": {
                        "name": "autodiscover.clientify.de",
                        "type": "A",
                        "content": "127.0.13.37"
                    }
                }
            },
            {
                "id": 367210,
                "name": "_dmarc",
                "full_name": "_dmarc.clientify.de",
                "type": "TXT",
                "content": "\"v=DMARC1; p=none\"",
                "last_changed": 1704585966,
                "ttl": 86400,
                "ret": "0",
                "editable": true,
                "txt": []
            }
        ]
    }
}
 

Request   

GET client/domains/{domainId}/dns/records

URL Parameters

The domainId id  int  

Query Parameters

all  boolean optional  

Whether to return all records, including hidden (non updatable) records (NS, SOA)

Response

Response Fields

domain  string  

Domain name

records  object[]  

DNS records

records[].id    

DNS record ID

records[].name    

DNS record name

records[].full_name    

DNS record full name

records[].type    

DNS record type

records[].content    

DNS record content

records[].ttl    

DNS record ttl

records[].editable    

Whether this dns record is editable

records[].priority    

DNS record priority

Connectable hostings

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/connect" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/connect"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 44410,
            "label": "Webspace",
            "product": "Website Hosting 3",
            "ips": [
                "51.89.85.76"
            ]
        },
        {
            "id": 43651,
            "label": "Debian 12 Tests",
            "product": "KVM Konfigurierbar 2.0",
            "ips": [
                "212.87.215.83",
                "2a12:edc0:4:42bc::1"
            ]
        },
        {
            "id": 48262,
            "label": "28770-62311.mein-dedicated.de",
            "product": "Dedicated Server",
            "ips": [
                "88.99.162.174"
            ]
        },
        {
            "id": 44180,
            "label": "54226-41003",
            "product": "Prepaid Hoster PRO (Gen 1)",
            "ips": [
                ""
            ]
        },
        {
            "id": 48533,
            "label": "92020-41003.storage.pph.sh",
            "product": "Netzwerkspeicher (beta)",
            "ips": [
                ""
            ]
        },
        {
            "id": 43689,
            "label": "Meine ISO",
            "product": "KVM Konfigurierbar 2.0",
            "ips": [
                "212.87.215.173",
                "2a12:edc0:4:39bc::1"
            ]
        },
        {
            "id": 46254,
            "label": "19526-41003.storage.pph.sh",
            "product": "Netzwerkspeicher (beta)",
            "ips": [
                ""
            ]
        },
        {
            "id": 43698,
            "label": "39867-41003",
            "product": "Netzwerkspeicher (beta)",
            "ips": [
                ""
            ]
        },
        {
            "id": 45749,
            "label": "71313-12468.pph-server.de",
            "product": "KVM Konfigurierbar 2.0",
            "ips": [
                "45.131.109.171",
                "2a12:edc0:4:e7b5::1"
            ]
        },
        {
            "id": 48323,
            "label": "31293-59355.pph-server.de",
            "product": "Mini 1",
            "ips": [
                "2a12:edc0:4:a8::1"
            ]
        },
        {
            "id": 47820,
            "label": "71744-20816.mein-dedicated.de",
            "product": "Dedicated Server",
            "ips": [
                "138.201.33.76"
            ]
        },
        {
            "id": 48592,
            "label": "76485-20469.pph-server.de",
            "product": "KVM Konfigurierbar 3.0",
            "ips": [
                "45.145.224.239",
                "2a12:edc0:4:bc48::1"
            ]
        },
        {
            "id": 43474,
            "label": "NATHIX MC ROOT! DO NOT DELETE!",
            "product": "Game Root 2",
            "ips": [
                "45.84.199.3",
                "2a12:edc0:4:2511::1"
            ]
        },
        {
            "id": 48094,
            "label": "31343-41003.pph-server.de",
            "product": "KVM Konfigurierbar 2.0",
            "ips": [
                "212.87.215.26",
                "2a12:edc0:4:8f3a::1"
            ]
        },
        {
            "id": 46844,
            "label": "IPv6 Only",
            "product": "Unbekanntes Produkt",
            "ips": [
                ""
            ]
        }
    ]
}
 

Request   

GET client/domains/{domainId}/dns/connect

URL Parameters

The domainId id  int  

Connect to hosting

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/connect/43651?reset=" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/connect/43651"
);

const params = {
    "reset": "0",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/connect/{hostingId}

URL Parameters

The domainId id  int  

The hosting id  int  

Query Parameters

reset  boolean optional  

Whether the DNS should be reset before.

Create a new srv record

requires authentication

You can automatically connect minecraft and teamspeak servers with your domain without losing its possibility to connect to another server (like a webpage) in the browser.

This will create a new A-Record in the domain and use it in the target field for the srv record.

Example: Connect domain.com with 127.0.0.1:25565
-> Creates new A-Record with "name" mc-127-0-0-1.domain.com and content 127.0.0.1
-> Creates new SRV-Record with "name" $subdomain and content 0 25565 mc-127-0-0-1.domain.com

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/record/srv" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"type\": \"minecraft\",
    \"ip\": \"127.0.0.1\",
    \"port\": \"25565\"
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/record/srv"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "type": "minecraft",
    "ip": "127.0.0.1",
    "port": "25565"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/record/srv

URL Parameters

The domainId id  int  

Body Parameters

type  string optional  

The srv type. One of: minecraft, teamspeak.

subdomain  string optional  

The subdomain to use. Defaults to empty.

ip  string optional  

The target IP. You can specify a domain name, whose A-Record IP will be used.

port  string optional  

The target port. Must be greater than 0 and lower than 65565.

skip_a_record  boolean optional  

Skip automatically creating an A-Record for this target. Can only be used when ip is a resolvable hostname. Defaults to false.

Create record

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/record/create" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"record\": {
        \"name\": \"omnis\",
        \"content\": \"fkilzrhezhkqzpsbhnetlucscwekuvtujiqpzsnxelufmqixqzmyutkcqxrjqswttheyscwvwqijtteoypfiwdqmrqynpjelsszvgqjjgobvmhvbghybxuqustzurcwgotnsdwofznrdgtjfohxmvblhxzwyemmojzqdhemfhzsbpygpllimvnbtgcosmjgkaudgtudskeuzknvnpixfcdyamjfqsapaqfavkhbyeuyhgfvvlahlehoweolbgleygpqjvxctcorexydqluholsubkrixkhreemzdkameoxjzubhazpnungcppchadsftcrsuaxwnltrofwhuafxrfiwstbajrwgiclx\",
        \"type\": \"modi\",
        \"replace\": false,
        \"priority\": 42816.97,
        \"ttl\": 48.19899608
    },
    \"record[name]\": \"minecraft\",
    \"record[replace]\": \"true\",
    \"record[content]\": \"127.0.0.1\",
    \"record[type]\": \"A\",
    \"record[priority]\": \"0\",
    \"record[ttl]\": \"1880\"
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/record/create"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "record": {
        "name": "omnis",
        "content": "fkilzrhezhkqzpsbhnetlucscwekuvtujiqpzsnxelufmqixqzmyutkcqxrjqswttheyscwvwqijtteoypfiwdqmrqynpjelsszvgqjjgobvmhvbghybxuqustzurcwgotnsdwofznrdgtjfohxmvblhxzwyemmojzqdhemfhzsbpygpllimvnbtgcosmjgkaudgtudskeuzknvnpixfcdyamjfqsapaqfavkhbyeuyhgfvvlahlehoweolbgleygpqjvxctcorexydqluholsubkrixkhreemzdkameoxjzubhazpnungcppchadsftcrsuaxwnltrofwhuafxrfiwstbajrwgiclx",
        "type": "modi",
        "replace": false,
        "priority": 42816.97,
        "ttl": 48.19899608
    },
    "record[name]": "minecraft",
    "record[replace]": "true",
    "record[content]": "127.0.0.1",
    "record[type]": "A",
    "record[priority]": "0",
    "record[ttl]": "1880"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/record/create

URL Parameters

The domainId id  int  

Body Parameters

record  object optional  

record.name  string optional  

record.content  string optional  

value darf maximal 512 Zeichen haben.

record.type  string optional  

record.replace  boolean optional  

record.priority  number optional  

record.ttl  number optional  

record[name]  string optional  

The record name.

record[replace]  string optional  

When a record with this type and name already exists, it will removed.

record[content]  string optional  

The record content.

record[type]  string optional  

The record type.

record[priority]  string optional  

The record priority.

record[ttl]  string optional  

The record ttl.

Update DNS Record

requires authentication

Updates a single kramer dns record for a domain.

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/record/update" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"record\": {
        \"name\": \"reprehenderit\",
        \"content\": \"quojxaobgbxgihcqjlxkihwpfoukrisqmkaxkkmkfjuzehltngmkqcigjrzsdkmjhdgyfqqofszwwdxfyejvhuvdedjdnctidllwujzcpwegecjy\",
        \"type\": \"impedit\",
        \"priority\": 3812.5,
        \"ttl\": 3128117,
        \"where\": {
            \"type\": \"suscipit\",
            \"name\": \"dolore\",
            \"content\": \"eum\"
        }
    },
    \"force\": true
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/record/update"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "record": {
        "name": "reprehenderit",
        "content": "quojxaobgbxgihcqjlxkihwpfoukrisqmkaxkkmkfjuzehltngmkqcigjrzsdkmjhdgyfqqofszwwdxfyejvhuvdedjdnctidllwujzcpwegecjy",
        "type": "impedit",
        "priority": 3812.5,
        "ttl": 3128117,
        "where": {
            "type": "suscipit",
            "name": "dolore",
            "content": "eum"
        }
    },
    "force": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/record/update

URL Parameters

The domainId id  int  

Body Parameters

record  object optional  

record.name  string optional  

record.content  string optional  

value darf maximal 512 Zeichen haben.

record.type  string optional  

record.priority  number optional  

record.ttl  number optional  

record.where  object optional  

record.where.type  string optional  

record.where.name  string optional  

record.where.content  string optional  

force  boolean optional  

Replace IP

requires authentication

Replaces an IP address with another IP address in all dns records.

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/record/replace-ip" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"old_ip\": \"149.202.17.134\",
    \"new_ip\": \"51.89.85.77\"
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/record/replace-ip"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "old_ip": "149.202.17.134",
    "new_ip": "51.89.85.77"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/record/replace-ip

URL Parameters

The domainId id  int  

Body Parameters

old_ip  string  

The old ip.

new_ip  string  

The new ip.

Remove record

requires authentication

Permanently removes a dns record from kramer dns for a domain

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/record/delete" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/record/delete"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/record/delete

URL Parameters

The domainId id  int  

Body Parameters

record  object  

record.id  integer  

Record ID to remove.

Reset DNS records

requires authentication

Completely resets dns records in kramer dns for a domain

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/record/reset" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"default_ip\": \"127.0.0.1\",
    \"default_ip6\": \"quidem\"
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/record/reset"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "default_ip": "127.0.0.1",
    "default_ip6": "quidem"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/record/reset

URL Parameters

The domainId id  int  

Body Parameters

default_ip  string optional  

The default ip to set. Defaults to current active webhosting ip.

default_ip6  string optional  

The default ip to set. Empty by default. No-default

GET client/domains/{domainId}/registry/history

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/registry/history" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/registry/history"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": []
}
 

Request   

GET client/domains/{domainId}/registry/history

URL Parameters

The domainId id  int  

GET client/domains/{domainId}/registry/dnssec

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/registry/dnssec" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/registry/dnssec"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "dnssec": false,
    "dnssecData": [],
    "dnssec_available": false
}
 

Request   

GET client/domains/{domainId}/registry/dnssec

URL Parameters

The domainId id  int  

POST client/domains/{domainId}/registry/dnssec

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/registry/dnssec" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/registry/dnssec"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/domains/{domainId}/registry/dnssec

URL Parameters

The domainId id  int  

Export records to text format

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/domains/6129/dns/records/export" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/records/export"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


A * 127.0.0.1
A @ 127.0.0.1
A local 217.249.40.72
A mail 127.0.0.1
A www 127.0.0.1
AAAA local 2003:db:57ff:7e9:66fd:96ff:fe4b:933d
CNAME webmail webmail.kramer-hosting.de
MX @ mail.clientify.de
NS @ ns3.kramer-dns.de
NS @ ns2.kramer-dns.de
NS @ ns1.kramer-dns.de
SOA @ ns1.kramer-dns.de. hostmaster.kramer-dns.de. 2023013103 43200 7200 1209600 86400
SOA @ ns1.kramer-dns.de. hostmaster.kramer-dns.de. 2022120200 43200 7200 1209600 86400
TXT _dmarc "v=DMARC1; p=none"

 

Request   

GET client/domains/{domainId}/dns/records/export

URL Parameters

The domainId id  int  

POST client/domains/{domainId}/dns/records/easy-connect

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/records/easy-connect" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/records/easy-connect"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/records/easy-connect

URL Parameters

The domainId id  int  

Reset DNS records

requires authentication

Completely resets dns records in kramer dns for a domain

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/records/reset" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"default_ip\": \"127.0.0.1\",
    \"default_ip6\": \"totam\"
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/records/reset"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "default_ip": "127.0.0.1",
    "default_ip6": "totam"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/records/reset

URL Parameters

The domainId id  int  

Body Parameters

default_ip  string optional  

The default ip to set. Defaults to current active webhosting ip.

default_ip6  string optional  

The default ip to set. Empty by default. No-default

Import records by text

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/domains/6129/dns/records/import" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"records\": \"et\"
}"
const url = new URL(
    "https://api.pph.sh/client/domains/6129/dns/records/import"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "records": "et"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/domains/{domainId}/dns/records/import

URL Parameters

The domainId id  int  

Body Parameters

records  string  

Client Hosting

Plesk licenses

Returns all Plesk licenses, available and used

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/plesk/licenses" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/plesk/licenses"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "used": [],
        "unused": []
    }
}
 

Request   

GET client/plesk/licenses

Assign license to hosting

Assigns an unused Plesk license to a hosting.

Example request:
curl --request POST \
    "https://api.pph.sh/client/plesk/licenses/assign" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/plesk/licenses/assign"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/plesk/licenses/assign

List Hostings

requires authentication

Returns a list of a clients hostings.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings?active=1&per_page=15" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings"
);

const params = {
    "active": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 44410,
            "product_name": "Website Hosting 3",
            "product_group": "Website Hosting",
            "label": "Webspace",
            "module": "plesk",
            "package_id": 299,
            "order_id": 78121,
            "ipaddress": "51.89.85.76",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "60476-85169.76.prepaid-webspace.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-07-11T22:00:00.000000Z",
            "next_due_date": "2024-05-11T22:00:00.000000Z",
            "next_due_in": 27,
            "next_due_human": "in 3 Wo.",
            "amount": 0,
            "firstpaymentamount": 0,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=44410&tab=main",
            "addons": []
        },
        {
            "id": 43651,
            "product_name": "KVM Konfigurierbar 2.0",
            "product_group": "AMD SSD KVM vServer",
            "label": "Debian 12 Tests",
            "module": "virtualizor",
            "package_id": 269,
            "order_id": 76975,
            "ipaddress": "212.87.215.83",
            "description": [
                "Linux",
                "8 Cores",
                "16 GB RAM",
                "50 GB SSD"
            ],
            "active": true,
            "suspended": false,
            "domain": "99366-41003.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": true,
            "created_at": "2023-05-17T22:00:00.000000Z",
            "next_due_date": "2024-04-17T22:00:00.000000Z",
            "next_due_in": 3,
            "next_due_human": "in 3 Tg.",
            "amount": 20.38,
            "firstpaymentamount": 5.34,
            "cancellation": false,
            "promotion": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "management_url": "https://api.pph.sh/client/routes?hosting=43651&tab=main",
            "options": [
                {
                    "config": {
                        "id": 296,
                        "label": "Betriebssystem",
                        "default": 1018
                    },
                    "option": {
                        "id": 1018,
                        "label": "Linux"
                    }
                },
                {
                    "config": {
                        "id": 293,
                        "label": "Prozessor",
                        "default": 880
                    },
                    "option": {
                        "id": 887,
                        "label": "8 Kerne reserviert"
                    }
                },
                {
                    "config": {
                        "id": 294,
                        "label": "RAM",
                        "default": 985
                    },
                    "option": {
                        "id": 899,
                        "label": "16GB RAM garantiert"
                    }
                },
                {
                    "config": {
                        "id": 295,
                        "label": "NVMe SSD Speicher",
                        "default": 912
                    },
                    "option": {
                        "id": 912,
                        "label": "50GB SSD"
                    }
                },
                {
                    "config": {
                        "id": 297,
                        "label": "Netzwerkgeschwindigkeit",
                        "default": 927
                    },
                    "option": {
                        "id": 927,
                        "label": "bis zu 1 GBit/s"
                    }
                },
                {
                    "config": {
                        "id": 310,
                        "label": "IPv4-Adressen",
                        "default": 990
                    },
                    "option": {
                        "id": 990,
                        "label": "1 IPv4 Adresse"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 48262,
            "product_name": "Dedicated Server",
            "product_group": "Dedicated Server",
            "label": "",
            "module": "dedicated_hetzner",
            "package_id": 258,
            "order_id": 84120,
            "ipaddress": "88.99.162.174",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "28770-62311.mein-dedicated.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": true,
            "created_at": "2024-03-13T23:00:00.000000Z",
            "next_due_date": "2024-04-13T22:00:00.000000Z",
            "next_due_in": 0,
            "next_due_human": "vor 1 Std.",
            "amount": 63.99,
            "firstpaymentamount": 73.99,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=48262&tab=main",
            "addons": []
        },
        {
            "id": 44180,
            "product_name": "Prepaid Hoster PRO (Gen 1)",
            "product_group": "Prepaid-Hoster PRO",
            "label": "",
            "module": "pphpro",
            "package_id": 304,
            "order_id": 77817,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "54226-41003",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-06-25T22:00:00.000000Z",
            "next_due_date": "2024-10-25T22:00:00.000000Z",
            "next_due_in": 194,
            "next_due_human": "in 6 Mon.",
            "amount": 6.49,
            "firstpaymentamount": 6.49,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=44180&tab=main",
            "addons": []
        },
        {
            "id": 48533,
            "product_name": "Netzwerkspeicher (beta)",
            "product_group": "Netzwerkspeicher",
            "label": "",
            "module": "remotespace",
            "package_id": 311,
            "order_id": 84521,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "92020-41003.storage.pph.sh",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2024-04-04T22:00:00.000000Z",
            "next_due_date": "2024-05-04T22:00:00.000000Z",
            "next_due_in": 20,
            "next_due_human": "in 2 Wo.",
            "amount": 3.99,
            "firstpaymentamount": 3.99,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=48533&tab=main",
            "options": [
                {
                    "config": {
                        "id": 322,
                        "label": "Speicher",
                        "default": 1020
                    },
                    "option": {
                        "id": 1024,
                        "label": "5000 GB"
                    }
                },
                {
                    "config": {
                        "id": 323,
                        "label": "Zugriff",
                        "default": 1025
                    },
                    "option": {
                        "id": 1025,
                        "label": "Nur PPH Server"
                    }
                },
                {
                    "config": {
                        "id": 324,
                        "label": "Protokolle",
                        "default": 1026
                    },
                    "option": {
                        "id": 1026,
                        "label": "NFS, SMB (Linux, Windows)"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 43689,
            "product_name": "KVM Konfigurierbar 2.0",
            "product_group": "AMD SSD KVM vServer",
            "label": "Meine ISO",
            "module": "virtualizor",
            "package_id": 269,
            "order_id": 77047,
            "ipaddress": "212.87.215.173",
            "description": [
                "Linux",
                "6 Cores",
                "6 GB RAM",
                "50 GB SSD"
            ],
            "active": true,
            "suspended": false,
            "domain": "62457-41003.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-05-21T22:00:00.000000Z",
            "next_due_date": "2024-04-21T22:00:00.000000Z",
            "next_due_in": 7,
            "next_due_human": "in 1 Wo.",
            "amount": 13.3,
            "firstpaymentamount": 13.3,
            "cancellation": false,
            "promotion": {
                "code": "KVM20SPAREN",
                "label": "KVM20SPAREN = wiederkehrend 20%",
                "description": "20% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 20,
                "type": "Percentage"
            },
            "management_url": "https://api.pph.sh/client/routes?hosting=43689&tab=main",
            "options": [
                {
                    "config": {
                        "id": 296,
                        "label": "Betriebssystem",
                        "default": 1018
                    },
                    "option": {
                        "id": 1018,
                        "label": "Linux"
                    }
                },
                {
                    "config": {
                        "id": 293,
                        "label": "Prozessor",
                        "default": 880
                    },
                    "option": {
                        "id": 885,
                        "label": "6 Kerne reserviert"
                    }
                },
                {
                    "config": {
                        "id": 294,
                        "label": "RAM",
                        "default": 985
                    },
                    "option": {
                        "id": 894,
                        "label": "6GB RAM garantiert"
                    }
                },
                {
                    "config": {
                        "id": 295,
                        "label": "NVMe SSD Speicher",
                        "default": 912
                    },
                    "option": {
                        "id": 912,
                        "label": "50GB SSD"
                    }
                },
                {
                    "config": {
                        "id": 297,
                        "label": "Netzwerkgeschwindigkeit",
                        "default": 927
                    },
                    "option": {
                        "id": 927,
                        "label": "bis zu 1 GBit/s"
                    }
                },
                {
                    "config": {
                        "id": 310,
                        "label": "IPv4-Adressen",
                        "default": 990
                    },
                    "option": {
                        "id": 990,
                        "label": "1 IPv4 Adresse"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 46254,
            "product_name": "Netzwerkspeicher (beta)",
            "product_group": "Netzwerkspeicher",
            "label": "",
            "module": "remotespace",
            "package_id": 311,
            "order_id": 80857,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "19526-41003.storage.pph.sh",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-11-02T23:00:00.000000Z",
            "next_due_date": "2024-05-02T22:00:00.000000Z",
            "next_due_in": 18,
            "next_due_human": "in 2 Wo.",
            "amount": 0,
            "firstpaymentamount": 0,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=46254&tab=main",
            "options": [
                {
                    "config": {
                        "id": 322,
                        "label": "Speicher",
                        "default": 1020
                    },
                    "option": {
                        "id": 1024,
                        "label": "5000 GB"
                    }
                },
                {
                    "config": {
                        "id": 323,
                        "label": "Zugriff",
                        "default": 1025
                    },
                    "option": {
                        "id": 1025,
                        "label": "Nur PPH Server"
                    }
                },
                {
                    "config": {
                        "id": 324,
                        "label": "Protokolle",
                        "default": 1026
                    },
                    "option": {
                        "id": 1026,
                        "label": "NFS, SMB (Linux, Windows)"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 43698,
            "product_name": "Netzwerkspeicher (beta)",
            "product_group": "Netzwerkspeicher",
            "label": "",
            "module": "remotespace",
            "package_id": 311,
            "order_id": 77064,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "39867-41003",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-05-22T22:00:00.000000Z",
            "next_due_date": "2024-04-22T22:00:00.000000Z",
            "next_due_in": 8,
            "next_due_human": "in 1 Wo.",
            "amount": 2.99,
            "firstpaymentamount": 2.99,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=43698&tab=main",
            "options": [
                {
                    "config": {
                        "id": 322,
                        "label": "Speicher",
                        "default": 1020
                    },
                    "option": {
                        "id": 1024,
                        "label": "5000 GB"
                    }
                },
                {
                    "config": {
                        "id": 323,
                        "label": "Zugriff",
                        "default": 1025
                    },
                    "option": {
                        "id": 1025,
                        "label": "Nur PPH Server"
                    }
                },
                {
                    "config": {
                        "id": 324,
                        "label": "Protokolle",
                        "default": 1026
                    },
                    "option": {
                        "id": 1026,
                        "label": "NFS, SMB (Linux, Windows)"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 45749,
            "product_name": "KVM Konfigurierbar 2.0",
            "product_group": "AMD SSD KVM vServer",
            "label": "",
            "module": "virtualizor",
            "package_id": 269,
            "order_id": 80077,
            "ipaddress": "45.131.109.171",
            "description": [
                "Linux",
                "2 Cores",
                "2 GB RAM",
                "50 GB SSD"
            ],
            "active": true,
            "suspended": false,
            "domain": "71313-12468.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-10-02T22:00:00.000000Z",
            "next_due_date": "2024-05-02T22:00:00.000000Z",
            "next_due_in": 18,
            "next_due_human": "in 2 Wo.",
            "amount": 4.89,
            "firstpaymentamount": 4.89,
            "cancellation": false,
            "promotion": {
                "code": "OKT2023",
                "label": "OKT2023 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "management_url": "https://api.pph.sh/client/routes?hosting=45749&tab=main",
            "options": [
                {
                    "config": {
                        "id": 296,
                        "label": "Betriebssystem",
                        "default": 1018
                    },
                    "option": {
                        "id": 1018,
                        "label": "Linux"
                    }
                },
                {
                    "config": {
                        "id": 293,
                        "label": "Prozessor",
                        "default": 880
                    },
                    "option": {
                        "id": 880,
                        "label": "2 Kerne reserviert"
                    }
                },
                {
                    "config": {
                        "id": 294,
                        "label": "RAM",
                        "default": 985
                    },
                    "option": {
                        "id": 985,
                        "label": "2GB RAM garantiert"
                    }
                },
                {
                    "config": {
                        "id": 295,
                        "label": "NVMe SSD Speicher",
                        "default": 912
                    },
                    "option": {
                        "id": 912,
                        "label": "50GB SSD"
                    }
                },
                {
                    "config": {
                        "id": 297,
                        "label": "Netzwerkgeschwindigkeit",
                        "default": 927
                    },
                    "option": {
                        "id": 927,
                        "label": "bis zu 1 GBit/s"
                    }
                },
                {
                    "config": {
                        "id": 310,
                        "label": "IPv4-Adressen",
                        "default": 990
                    },
                    "option": {
                        "id": 990,
                        "label": "1 IPv4 Adresse"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 48323,
            "product_name": "Mini 1",
            "product_group": "KVM Root Server Pakete 2024",
            "label": "",
            "module": "virtualizor",
            "package_id": 475,
            "order_id": 84204,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "31293-59355.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2024-03-18T23:00:00.000000Z",
            "next_due_date": "2024-05-18T22:00:00.000000Z",
            "next_due_in": 34,
            "next_due_human": "in 1 Mon.",
            "amount": 3.51,
            "firstpaymentamount": 3.51,
            "cancellation": false,
            "promotion": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "management_url": "https://api.pph.sh/client/routes?hosting=48323&tab=main",
            "options": [
                {
                    "config": {
                        "id": 325,
                        "label": "RAM-Upgrade",
                        "default": 1027
                    },
                    "option": {
                        "id": 1027,
                        "label": "Kein Upgrade"
                    }
                },
                {
                    "config": {
                        "id": 326,
                        "label": "IP-Adresse",
                        "default": 1030
                    },
                    "option": {
                        "id": 1030,
                        "label": "1x IPv6"
                    }
                },
                {
                    "config": {
                        "id": 327,
                        "label": "Vorinstalliert",
                        "default": 1031
                    },
                    "option": {
                        "id": 1031,
                        "label": "Debian 12.4"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 47820,
            "product_name": "Dedicated Server",
            "product_group": "Dedicated Server",
            "label": "",
            "module": "dedicated_hetzner",
            "package_id": 258,
            "order_id": 83361,
            "ipaddress": "138.201.33.76",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "71744-20816.mein-dedicated.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2024-02-06T23:00:00.000000Z",
            "next_due_date": "2024-05-20T22:00:00.000000Z",
            "next_due_in": 36,
            "next_due_human": "in 1 Mon.",
            "amount": 56.99,
            "firstpaymentamount": 66.99,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=47820&tab=main",
            "addons": []
        },
        {
            "id": 48592,
            "product_name": "KVM Konfigurierbar 3.0",
            "product_group": "AMD SSD KVM vServer",
            "label": "",
            "module": "virtualizor",
            "package_id": 485,
            "order_id": 84622,
            "ipaddress": "45.145.224.239",
            "description": [
                "Linux",
                "2 Cores",
                "2 GB RAM",
                "50 GB SSD"
            ],
            "assigned_ips": [
                "2a12:edc0:0004:bc48:0000:0000:0000:0001"
            ],
            "active": true,
            "suspended": false,
            "domain": "76485-20469.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2024-04-10T22:00:00.000000Z",
            "next_due_date": "2024-05-10T22:00:00.000000Z",
            "next_due_in": 26,
            "next_due_human": "in 3 Wo.",
            "amount": 6.82,
            "firstpaymentamount": 6.82,
            "cancellation": false,
            "promotion": {
                "code": "WASISTMITHASILOS",
                "label": "WASISTMITHASILOS = wiederkehrend 25%",
                "description": "25% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 25,
                "type": "Percentage"
            },
            "management_url": "https://api.pph.sh/client/routes?hosting=48592&tab=main",
            "options": [
                {
                    "config": {
                        "id": 296,
                        "label": "Betriebssystem",
                        "default": 1018
                    },
                    "option": {
                        "id": 1018,
                        "label": "Linux"
                    }
                },
                {
                    "config": {
                        "id": 329,
                        "label": "CPU Kerne",
                        "default": 1037
                    },
                    "option": {
                        "id": 1037,
                        "label": "2 Kerne"
                    }
                },
                {
                    "config": {
                        "id": 330,
                        "label": "Arbeitsspeicher",
                        "default": 1043
                    },
                    "option": {
                        "id": 1043,
                        "label": "2 GB RAM garantiert"
                    }
                },
                {
                    "config": {
                        "id": 331,
                        "label": "Festplattenspeicher",
                        "default": 1053
                    },
                    "option": {
                        "id": 1053,
                        "label": "50 GB SSD Speicher"
                    }
                },
                {
                    "config": {
                        "id": 332,
                        "label": "IPv4-Adressen",
                        "default": 1060
                    },
                    "option": {
                        "id": 1060,
                        "label": "1 IPv4 Adresse"
                    }
                },
                {
                    "config": {
                        "id": 333,
                        "label": "IPv6-Subnetz",
                        "default": 1063
                    },
                    "option": {
                        "id": 1063,
                        "label": "1 /64 IPv6 Netz (inkl.)"
                    }
                },
                {
                    "config": {
                        "id": 334,
                        "label": "Plesk",
                        "default": 1064
                    },
                    "option": {
                        "id": 1064,
                        "label": "Ohne Plesk"
                    }
                },
                {
                    "config": {
                        "id": 335,
                        "label": "Netzwerkspeicher hinzufügen",
                        "default": 1066
                    },
                    "option": {
                        "id": 1066,
                        "label": "Ohne Netzwerkspeicher"
                    }
                },
                {
                    "config": {
                        "id": 336,
                        "label": "Prepaid Hoster PRO abonnieren",
                        "default": 1069
                    },
                    "option": {
                        "id": 1069,
                        "label": "Ohne Pro-Features"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 43474,
            "product_name": "Game Root 2",
            "product_group": "Game Root",
            "label": "NATHIX MC ROOT! DO NOT DELETE!",
            "module": "virtualizor",
            "package_id": 302,
            "order_id": 76692,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "58199-41003.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-05-04T22:00:00.000000Z",
            "next_due_date": "2024-05-04T22:00:00.000000Z",
            "next_due_in": 20,
            "next_due_human": "in 2 Wo.",
            "amount": 40.9,
            "firstpaymentamount": 0,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=43474&tab=main",
            "options": [
                {
                    "config": {
                        "id": 328,
                        "label": "Zusätzlicher Speicher",
                        "default": 1036
                    },
                    "option": {
                        "id": 1033,
                        "label": "100GB SSD"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 48094,
            "product_name": "KVM Konfigurierbar 2.0",
            "product_group": "AMD SSD KVM vServer",
            "label": "",
            "module": "virtualizor",
            "package_id": 269,
            "order_id": 83847,
            "ipaddress": "212.87.215.26",
            "description": [
                "Windows",
                "6 Cores",
                "6 GB RAM",
                "150 GB SSD"
            ],
            "assigned_ips": [
                "2a12:edc0:0004:8f3a:0000:0000:0000:0001"
            ],
            "active": true,
            "suspended": false,
            "domain": "31343-41003.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2024-02-28T23:00:00.000000Z",
            "next_due_date": "2024-04-28T22:00:00.000000Z",
            "next_due_in": 14,
            "next_due_human": "in 2 Wo.",
            "amount": 15.46,
            "firstpaymentamount": 15.46,
            "cancellation": false,
            "promotion": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "management_url": "https://api.pph.sh/client/routes?hosting=48094&tab=main",
            "options": [
                {
                    "config": {
                        "id": 296,
                        "label": "Betriebssystem",
                        "default": 1018
                    },
                    "option": {
                        "id": 1019,
                        "label": "Windows Server 2019/2022 (Eval)"
                    }
                },
                {
                    "config": {
                        "id": 293,
                        "label": "Prozessor",
                        "default": 880
                    },
                    "option": {
                        "id": 885,
                        "label": "6 Kerne reserviert"
                    }
                },
                {
                    "config": {
                        "id": 294,
                        "label": "RAM",
                        "default": 985
                    },
                    "option": {
                        "id": 894,
                        "label": "6GB RAM garantiert"
                    }
                },
                {
                    "config": {
                        "id": 295,
                        "label": "NVMe SSD Speicher",
                        "default": 912
                    },
                    "option": {
                        "id": 905,
                        "label": "150GB SSD"
                    }
                },
                {
                    "config": {
                        "id": 297,
                        "label": "Netzwerkgeschwindigkeit",
                        "default": 927
                    },
                    "option": {
                        "id": 927,
                        "label": "bis zu 1 GBit/s"
                    }
                },
                {
                    "config": {
                        "id": 310,
                        "label": "IPv4-Adressen",
                        "default": 990
                    },
                    "option": {
                        "id": 990,
                        "label": "1 IPv4 Adresse"
                    }
                }
            ],
            "addons": []
        },
        {
            "id": 46844,
            "product_name": "Unbekanntes Produkt",
            "product_group": "Unbekannte Produkt-Gruppe",
            "label": "IPv6 Only",
            "module": null,
            "package_id": 465,
            "order_id": 81853,
            "ipaddress": "",
            "description": [],
            "active": true,
            "suspended": false,
            "domain": "75087-41003.pph-server.de",
            "status": "Active",
            "billingcycle": "Monthly",
            "has_invoices": true,
            "has_unpaid_invoice": false,
            "created_at": "2023-12-10T23:00:00.000000Z",
            "next_due_date": "2024-05-10T22:00:00.000000Z",
            "next_due_in": 26,
            "next_due_human": "in 3 Wo.",
            "amount": 3.2,
            "firstpaymentamount": 3.2,
            "cancellation": false,
            "management_url": "https://api.pph.sh/client/routes?hosting=46844&tab=main",
            "addons": []
        }
    ],
    "links": {
        "first": "https://fsn-01.api.pph.sh/client/hostings?page=1",
        "last": "https://fsn-01.api.pph.sh/client/hostings?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://fsn-01.api.pph.sh/client/hostings?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://fsn-01.api.pph.sh/client/hostings",
        "per_page": 15,
        "to": 15,
        "total": 15
    }
}
 

Request   

GET client/hostings

Query Parameters

status  string optional  

Filter by status.

active  boolean optional  

Filter by active.

ip  string optional  

Filter by ip. Example:

password  string optional  

Include default password.

per_page  integer optional  

Number of results per page. Defaults to 15.

Hosting details

requires authentication

Return details of a hosting.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "id": 43651,
        "product_name": "KVM Konfigurierbar 2.0",
        "product_group": "AMD SSD KVM vServer",
        "label": "Debian 12 Tests",
        "module": "virtualizor",
        "package_id": 269,
        "order_id": 76975,
        "ipaddress": "212.87.215.83",
        "description": [
            "Linux",
            "8 Cores",
            "16 GB RAM",
            "50 GB SSD"
        ],
        "active": true,
        "suspended": false,
        "domain": "99366-41003.pph-server.de",
        "status": "Active",
        "billingcycle": "Monthly",
        "has_invoices": true,
        "has_unpaid_invoice": true,
        "created_at": "2023-05-17T22:00:00.000000Z",
        "next_due_date": "2024-04-17T22:00:00.000000Z",
        "next_due_in": 3,
        "next_due_human": "in 3 Tg.",
        "amount": 20.38,
        "firstpaymentamount": 5.34,
        "cancellation": false,
        "promotion": {
            "code": "KVM2024",
            "label": "KVM2024 = wiederkehrend 30%",
            "description": "30% Rabatt ges. Laufzeit",
            "recurring": true,
            "recurring_for": 0,
            "recurring_infinite": true,
            "value": 30,
            "type": "Percentage"
        },
        "management_url": "https://api.pph.sh/client/routes?hosting=43651&tab=main",
        "options": [
            {
                "config": {
                    "id": 296,
                    "label": "Betriebssystem",
                    "default": 1018
                },
                "option": {
                    "id": 1018,
                    "label": "Linux"
                }
            },
            {
                "config": {
                    "id": 293,
                    "label": "Prozessor",
                    "default": 880
                },
                "option": {
                    "id": 887,
                    "label": "8 Kerne reserviert"
                }
            },
            {
                "config": {
                    "id": 294,
                    "label": "RAM",
                    "default": 985
                },
                "option": {
                    "id": 899,
                    "label": "16GB RAM garantiert"
                }
            },
            {
                "config": {
                    "id": 295,
                    "label": "NVMe SSD Speicher",
                    "default": 912
                },
                "option": {
                    "id": 912,
                    "label": "50GB SSD"
                }
            },
            {
                "config": {
                    "id": 297,
                    "label": "Netzwerkgeschwindigkeit",
                    "default": 927
                },
                "option": {
                    "id": 927,
                    "label": "bis zu 1 GBit/s"
                }
            },
            {
                "config": {
                    "id": 310,
                    "label": "IPv4-Adressen",
                    "default": 990
                },
                "option": {
                    "id": 990,
                    "label": "1 IPv4 Adresse"
                }
            }
        ],
        "addons": []
    }
}
 

Request   

GET client/hostings/{hostingId}

URL Parameters

The hosting id  int  

Response

Response Fields

data  string[]  

Hosting details.

data.id  integer  

Hosting ID.

data.product_name  string  

Product name.

data.product_group  string  

Product group.

data.label  string  

Label of the product.

data.module  string  

The internal module for this hosting.

data.package_id  string  

The product ID.

data.order_id  string  

The order ID of this hosting.

data.ipaddress  string  

The primary IP address for this hosting.

data.assigned_ips  string[]  

Additional IP addresses assigned to this hosting.

data.active  boolean  

Whether the hosting is active.

data.suspended  boolean  

Whether the hosting is suspended.

data.domain  string  

The internal subdomain for this hosting.

data.status  string  

The status for this hosting. Can be one of Active, Suspended, Cancelled, Terminated, Pending, Fraud.

data.billingcycle  string  

The Billing cycle for this hosting. Can be one of Monthly, Quarterly, Semi-Annually, Annually.

data.created_at  string  

The order date for this hosting.

data.next_due_date  string  

The next due date for this hosting.

data.next_due_in  integer  

Number of days until next due date.

data.next_due_human  string  

Next due date in human format, translatable.

data.firstpaymentamount  number  

The first payment amount for this hosting.

data.amount  number  

The next payment amount for this hosting.

data.has_invoices  boolean  

Whether this hosting as an open invoice.

data.has_unpaid_invoices  boolean  

Whether this hosting as an unpaid invoice.

data.cancellation  boolean|array  

Whether this hosting is cancelled.

data.promotion  boolean|array  

Promotion data for this hosting. False when none.

data.options  string[]  

Configured options for this hosting.

data.options[].config.id  integer  

Configuration id.

data.options[].config.label  string  

Configuration label.

data.options[].config.default  integer  

Configuration default option id.

data.options[].option.id  integer  

Configuration option id.

data.options[].option.label  string  

Configuration option label.

Hosting invoices

requires authentication

Returns all invoices related to a hosting.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/invoices?latest=1" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/invoices"
);

const params = {
    "latest": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "id": 55,
        "duedate": "2014-01-09T23:00:00.000000Z",
        "datepaid": "2014-01-10T21:32:43.000000Z",
        "date": "2014-01-09T23:00:00.000000Z",
        "subtotal": 5.8,
        "credit": 5,
        "tax": 1.1,
        "taxrate": 19,
        "total": 6.9,
        "status": "Paid",
        "status_label": "Bezahlt",
        "is_open": false,
        "items": [
            {
                "id": 55,
                "invoiceid": 55,
                "type": "Hosting",
                "short_description": "V-Server Bronze (OpenVZ) - Prepaid (10.01.2014 - 09.02.2014)",
                "description": "V-Server Bronze (OpenVZ) - Prepaid (10.01.2014 - 09.02.2014)",
                "relid": 52,
                "amount": 6.9,
                "taxed": 1,
                "donation": false
            }
        ],
        "donation_invoice": false,
        "transaction": {
            "id": 5,
            "gateway": "banktransfer",
            "date": "2014-01-10T21:32:43.000000Z",
            "diff_for_humans": "vor 10 Jahren",
            "description": "Invoice Payment",
            "amountin": 1.9,
            "amountout": 0,
            "invoiceid": 55
        },
        "resources": {
            "invoice": "https://api.pph.sh/client/invoices/55",
            "download": "https://api.pph.sh/client/invoices/55/download"
        }
    }
}
 

Request   

GET client/hostings/{hostingId}/invoices

URL Parameters

The hosting id  int  

Query Parameters

latest  boolean optional  

Only return latest invoice.

Hosting config change

requires authentication

Returns information about a config option upgrade.

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/upgrade" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"configoptions\": [
        1948.095
    ]
}"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/upgrade"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "configoptions": [
        1948.095
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/hostings/{hostingId}/upgrade

URL Parameters

The hosting id  int  

Body Parameters

configoptions  number[] optional  

Apply hosting config change

requires authentication

Applies an upgrade of config options.

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/upgrade/do" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/upgrade/do"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hostingId}/upgrade/do

URL Parameters

The hosting id  int  

Get cancellation

requires authentication

Returns the current cancellation for a hosting, if any.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/cancellation" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/cancellation"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": []
}
 

Request   

GET client/hostings/{hostingId}/cancellation

URL Parameters

The hosting id  int  

Immediate cancellation info

requires authentication

If eligible, you will get a refund of unused time less charges. Use this endpoint to get information about it.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/cancellation/refund" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/cancellation/refund"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "refundable": true,
        "immediate_available": true,
        "immediate_available_msg": false,
        "last_paid": 20.38,
        "days_left": 4,
        "cycle": 31,
        "price_per_day": 0.6574,
        "price_per_hour": 0.0274,
        "credit_used": 17.75,
        "credit_back_now": 2.13,
        "cancellation_fee": 0.5,
        "max_credit_back": 20.38,
        "hosting_amount": 20.38,
        "credit_on_last_invoice": 20.38,
        "unpaid_invoice": 263160,
        "last_invoice_id": 260276
    }
}
 

Request   

GET client/hostings/{hostingId}/cancellation/refund

URL Parameters

The hosting id  int  

Response

Response Fields

refundable  boolean  

Whether this hosting is refundable.

last_paid  number  

date Date of last invoice payment.

days_left  integer  

Number of days left until this hosting is extended.

cycle  string  

The billingcycle set for this hosting.

price_per_day  number  

Cost per day.

price_per_hour  number  

Cost per hour.

credit_used  number  

Credit that has been already used for this hosting and cannot be refunded.

credit_back_now  number  

Credit that will be refunded when this hosting is cancelled immediate.

cancellation_fee  number  

Immediate cancellation fee.

unpaid_invoice  object[]  

Unpaid invoice information.

Create a cancellation

requires authentication

Cancel a hosting. You can choose at the end of its billing cycle or immediate. Set immediate to true to cancel the hosting immediately. This cannot be undone! If eligible, you will get a refund of unused time less charges.

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/cancellation/create?immediate=" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"reason\": [],
    \"rating\": {
        \"support\": \"nisi\",
        \"hostingquality\": \"numquam\"
    }
}"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/cancellation/create"
);

const params = {
    "immediate": "0",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "reason": [],
    "rating": {
        "support": "nisi",
        "hostingquality": "numquam"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/hostings/{hostingId}/cancellation/create

URL Parameters

The hosting id  int  

Query Parameters

immediate  boolean optional  

Whether to cancel the hosting immediate. Defaults to false.

reason.text  string optional  

A short reason of cancelling.

rating.support  integer optional  

Rating of support. 0 = none, 1 = worst, 10 = best.

rating.hostingquality  integer optional  

Rating of hosting quality. 0 = none, 1 = worst, 10 = best.

Body Parameters

reason  object optional  

reason.text  string optional  

rating  object optional  

rating.support  string  

rating.hostingquality  string  

Revoke cancellation

requires authentication

When a hosting is pending for cancellation at its expiry date, the cancellation can be revoked with this endpoint.

When the hosting is due for payment, an invoice will be created. Bear in mind that such invoice will be automatically be paid when enough credit is available.

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/cancellation/revoke" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/cancellation/revoke"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "revoked": true
}
 

Example response (404, No cancellation found):


{
    "error": true,
    "type": "NotFoundHttpException",
    "message": "No cancellation found"
}
 

Request   

POST client/hostings/{hostingId}/cancellation/revoke

URL Parameters

The hosting id  int  

Get hosting features

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/features" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/features"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "0": {
        "id": "service-info",
        "label": "Service-Info",
        "icon": "fal fa-info-circle"
    },
    "App\\Api\\Support\\Virtualizor\\Features\\CloudManagerFeature": {
        "id": "cloud-manager",
        "label": "Cloud-Manager",
        "icon": "fal fa-dashboard"
    }
}
 

Request   

GET client/hostings/{hostingId}/features

URL Parameters

The hosting id  int  

Get hosting actions

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/actions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/actions"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "action": "apache-manager",
            "description": "Reads apache manager actions",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/apache-manager"
        },
        {
            "action": "auto-update-logs",
            "description": "Reads the auto-update log of a virtual server (PPH Pro)",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/auto-update-logs"
        },
        {
            "action": "available-updates",
            "description": "Reads the available updates of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/available-updates"
        },
        {
            "action": "backup-now",
            "description": "Create a backup now",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/backup-now"
        },
        {
            "action": "backups",
            "description": "Get a list of vps backups",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/backups"
        },
        {
            "action": "chkdsk",
            "description": "Create a backup now",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/chkdsk"
        },
        {
            "action": "clear-cache",
            "description": "Clears the temporary API cache of this vps",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/clear-cache"
        },
        {
            "action": "configuration",
            "description": "Reads the configuration of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/configuration"
        },
        {
            "action": "cronjobs",
            "description": "",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/cronjobs"
        },
        {
            "action": "edit-server",
            "description": "Change parameters/settings for this virtual server",
            "parameters": {
                "hostname": "The hostname to set. Not changing if empty."
            },
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/edit-server"
        },
        {
            "action": "enable-nfs",
            "description": "Enables NFS on the server and restarts the VPS",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/enable-nfs"
        },
        {
            "action": "enable-ping",
            "description": "Enables the ICMP protocol (ping) on a windows server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/enable-ping"
        },
        {
            "action": "execute",
            "description": "Executes a script on the server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/execute"
        },
        {
            "action": "install-win-server",
            "description": "Install Windows Server on the VPS",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/install-win-server"
        },
        {
            "action": "live",
            "description": "Reads the live data of a virtual server",
            "parameters": {
                "methods": "One or multiple of: cpu-usage, os-type, disk-space, load-average, memory-usage, os-info, processes, processor-info, real-hostname, ssh-port, ssh-root-login, uptime"
            },
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/live"
        },
        {
            "action": "local-backups",
            "description": "Manages the local backups of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/local-backups"
        },
        {
            "action": "mx-blacklist",
            "description": "",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/mx-blacklist"
        },
        {
            "action": "os-list",
            "description": "Reads the list of available operating systems",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/os-list"
        },
        {
            "action": "ping",
            "description": "Reads the ping of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/ping"
        },
        {
            "action": "plesk",
            "description": "Reads the plesk license of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/plesk"
        },
        {
            "action": "plesk",
            "description": "",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/plesk"
        },
        {
            "action": "prlctl",
            "description": "Executes a prlctl script on the server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/prlctl"
        },
        {
            "action": "rdns",
            "description": "Changes the reverse dns of this server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/rdns"
        },
        {
            "action": "rdp",
            "description": "Reads information about rdp",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/rdp"
        },
        {
            "action": "reboot-server",
            "description": "Reboots this virtual server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/reboot-server"
        },
        {
            "action": "reinstall-server",
            "description": "Reinstalls this virtual server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/reinstall-server"
        },
        {
            "action": "rescue-mode",
            "description": "Manages rescue mode for this virtual server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/rescue-mode"
        },
        {
            "action": "reset-password",
            "description": "Resets the root/admin password for this virtual server",
            "parameters": {
                "password": "The password to set. Using default password if empty."
            },
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/reset-password"
        },
        {
            "action": "reset-server",
            "description": "Power-Resets this virtual server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/reset-server"
        },
        {
            "action": "restore-now",
            "description": "Create a backup now",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/restore-now"
        },
        {
            "action": "screenshot",
            "description": "Returns a screenshot from the virtual server in base64 format.",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/screenshot"
        },
        {
            "action": "snapshots",
            "description": "",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/snapshots"
        },
        {
            "action": "ssh-keys",
            "description": "Reads the public keys of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/ssh-keys"
        },
        {
            "action": "start-server",
            "description": "Starts this virtual server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/start-server"
        },
        {
            "action": "stats_history",
            "description": "Reads the stats history of a virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/stats_history"
        },
        {
            "action": "status",
            "description": "Returns the current status of the server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/status"
        },
        {
            "action": "stop-server",
            "description": "Stops this virtual server",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/stop-server"
        },
        {
            "action": "traffic",
            "description": "Returns the current traffic from this vps",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/traffic"
        },
        {
            "action": "vnc",
            "description": "Returns information about vnc access to virtual server",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/vnc"
        },
        {
            "action": "vps-alerts",
            "description": "",
            "parameters": [],
            "access": "read",
            "url": "https://api.pph.sh/client/hostings/43651/actions/read/vps-alerts"
        },
        {
            "action": "win-resize-disk",
            "description": "Resizes the C:\\ drive to the maximum available size",
            "parameters": [],
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/win-resize-disk"
        },
        {
            "action": "win-set-dns",
            "description": "Sets the DNS server in the Ethernet adapter in windows",
            "parameters": {
                "nameserver": "The nameserver to set (IP-Address), defaults to 1.1.1.1"
            },
            "access": "write",
            "url": "https://api.pph.sh/client/hostings/43651/actions/write/win-set-dns"
        }
    ]
}
 

Request   

GET client/hostings/{hostingId}/actions

URL Parameters

The hosting id  int  

Execute an action on the hosting

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/actions/handle/esse" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/actions/handle/esse"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (400):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "NotFoundHttpException",
        "url": "https://fsn-01.api.pph.sh/client/hostings/43651/actions/handle/esse",
        "code": 404,
        "message": "The given action was not found",
        "trace": "Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException: The given action was not found in /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1129\nStack trace:\n#0 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(44): Illuminate\\Foundation\\Application->abort()\n#1 /var/www/api/app/Http/Controllers/ClientHostingApiController.php(157): abort()\n#2 /var/www/api/app/Http/Controllers/ClientHostingApiController.php(142): App\\Http\\Controllers\\ClientHostingApiController->handleAction()\n#3 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\ClientHostingApiController->handle()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#9 /var/www/api/app/Http/Middleware/ApiAccessPermission.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\ApiAccessPermission->handle()\n#11 /var/www/api/app/Http/Middleware/ApiAccessPermission.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\ApiAccessPermission->handle()\n#13 /var/www/api/app/Http/Middleware/ApiAccessPermission.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\ApiAccessPermission->handle()\n#15 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#17 /var/www/api/app/Http/Middleware/ApiLog.php(38): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\ApiLog->handle()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(44): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Auth\\Middleware\\Authenticate->handle()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#26 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#28 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#29 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#34 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#35 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#36 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#37 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#38 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#39 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#40 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#41 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#42 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#43 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#44 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#45 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#48 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#49 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#50 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#51 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#52 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#53 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#54 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#55 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#56 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#57 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#58 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#59 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#60 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#61 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#62 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#63 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#64 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#65 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#66 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#67 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#68 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#69 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#70 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#71 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#72 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#73 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#74 {main}"
    }
}
 

Request   

GET client/hostings/{hostingId}/actions/handle/{key}

POST client/hostings/{hostingId}/actions/handle/{key}

PUT client/hostings/{hostingId}/actions/handle/{key}

PATCH client/hostings/{hostingId}/actions/handle/{key}

DELETE client/hostings/{hostingId}/actions/handle/{key}

OPTIONS client/hostings/{hostingId}/actions/handle/{key}

URL Parameters

The hosting id  int  

key  string  

action  string  

The action. Valid actions are returned by client/hostings/{hostingId}/actions.

The action  string  

Set hosting label

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/label" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"label\": \"\\\"My cool server\\\"\"
}"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/label"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "label": "\"My cool server\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/hostings/{hostingId}/label

URL Parameters

The hosting id  int  

Body Parameters

label  string  

The label.

Client Invoices

List invoices

requires authentication

Returns a list of invoices

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/invoices" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/invoices"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "id": 212032,
            "duedate": "2022-12-26T23:00:00.000000Z",
            "datepaid": "2022-11-17T03:00:32.000000Z",
            "date": "2022-11-16T23:00:00.000000Z",
            "subtotal": 0,
            "credit": 0,
            "tax": 0,
            "taxrate": 19,
            "total": 0,
            "status": "Paid",
            "status_label": "Bezahlt",
            "is_open": false,
            "items": [
                {
                    "id": 246676,
                    "invoiceid": 212032,
                    "type": "Domain",
                    "short_description": "Domain Verlängerung - pph.sh - 1 Jahr(e) (27.12.2022 - 26.12.2023)",
                    "description": "Domain Verlängerung - pph.sh - 1 Jahr(e) (27.12.2022 - 26.12.2023)",
                    "relid": 5373,
                    "amount": "0.00",
                    "taxed": 1
                }
            ],
            "resources": {
                "invoice": "https://api.pph.sh/client/invoices/212032",
                "download": "https://api.pph.sh/client/invoices/212032/download"
            }
        }
    ]
}
 

Request   

GET client/invoices

Query Parameters

status  string optional  

Only return invoices with a specified status. Examples: Paid, Unpaid.

type  string optional  

Only return invoices with items of a specific type. Values: Hosting, Donation.

transactions  boolean optional  

Only return invoices with transactions.

Response

Response Fields

data[].id  integer  

Invoice ID

data[].duedate  string  

Invoice due date

data[].date    

date Invoice date

data[].subtotal  number  

Invoice subtotal

data[].total  number  

Invoice total

data[].status  string  

Invoice status

data[].items[].type  string  

The invoice type

Get single invoice

requires authentication

Returns a single invoice

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/invoices/130348" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/invoices/130348"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "id": 130348,
        "duedate": "2020-06-26T22:00:00.000000Z",
        "datepaid": "-000001-11-29T23:06:32.000000Z",
        "date": "2020-06-27T22:00:00.000000Z",
        "subtotal": 6.68,
        "credit": 1,
        "tax": 1.27,
        "taxrate": 19,
        "total": 7.95,
        "status": "Cancelled",
        "status_label": "Storniert",
        "is_open": false,
        "items": [
            {
                "id": 140373,
                "invoiceid": 130348,
                "type": "Hosting",
                "short_description": "KVM Konfigurierbar (SSD) - 23633-41003.pph-server.de (27.06.2020 - 26.07.2020)",
                "description": "KVM Konfigurierbar (SSD) - 23633-41003.pph-server.de (27.06.2020 - 26.07.2020)\nBetriebssystem: Windows (Log-In ready)\nProzessor: 2 Kerne\nRAM: 4GB RAM\nNVMe SSD Speicher: 50GB SSD\nNetzwerkgeschwindigkeit: bis zu 200 MBit/s",
                "relid": 23633,
                "amount": 7.95,
                "taxed": 1,
                "donation": false
            }
        ],
        "donation_invoice": false,
        "resources": {
            "invoice": "https://api.pph.sh/client/invoices/130348",
            "download": "https://api.pph.sh/client/invoices/130348/download"
        }
    }
}
 

Request   

GET client/invoices/{invoiceId}

URL Parameters

The invoice id  int  

Download invoice pdf

requires authentication

Returns an invoice as application/pdf attachment

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/invoices/130348/download" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/invoices/130348/download"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

[Binary data] -  application/pdf
 

Request   

GET client/invoices/{invoiceId}/download

URL Parameters

The invoice id  int  

Pay invoice with credit

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/invoices/130348/pay" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/invoices/130348/pay"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/invoices/{invoiceId}/pay

URL Parameters

The invoice id  int  

id  integer  

The invoice id.

Remove credit from unpaid invoice.

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/invoices/130348/remove-credit" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/invoices/130348/remove-credit"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/invoices/{invoiceId}/remove-credit

URL Parameters

The invoice id  int  

id  integer  

The invoice id.

Download invoice archive

requires authentication

Creates and responds with a zip archive containing invoices. Can have all invoices, specific hosting invoices, domain invoices or just invoices with transactions. Content-Type: application/zip

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/invoices/download/archive" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"from\": \"2024-04-14T05:00:30\",
    \"to\": \"2024-04-14T05:00:30\",
    \"hostings\": [
        null
    ],
    \"domains\": [
        null
    ]
}"
const url = new URL(
    "https://api.pph.sh/client/invoices/download/archive"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "from": "2024-04-14T05:00:30",
    "to": "2024-04-14T05:00:30",
    "hostings": [
        null
    ],
    "domains": [
        null
    ]
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):

[Binary data] -  application/zip
 

Request   

GET client/invoices/download/archive

Body Parameters

from  string optional  

value muss ein gültiges Datum sein.

to  string optional  

value muss ein gültiges Datum sein.

hostings  string[] optional  

domains  string[] optional  

Client Orders

Class ClientOrderApiController

List orders

Returns a list of orders placed by the client

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/orders?recent=1&recent_days=3" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/orders"
);

const params = {
    "recent": "1",
    "recent_days": "3",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 84622,
            "ordernum": 6535373339,
            "date": "2024-04-11T14:34:16.000000Z",
            "promocode": "WASISTMITHASILOS",
            "amount": 6.82,
            "invoiceid": false,
            "cancelled": false,
            "active": true,
            "status_label": "Ausgeliefert",
            "items_provisioned": true,
            "hostings": [
                {
                    "id": 48592,
                    "product_name": "KVM Konfigurierbar 3.0",
                    "product_group": "AMD SSD KVM vServer",
                    "label": "",
                    "module": "virtualizor",
                    "package_id": 485,
                    "order_id": 84622,
                    "ipaddress": "45.145.224.239",
                    "description": [
                        "Linux",
                        "2 Cores",
                        "2 GB RAM",
                        "50 GB SSD"
                    ],
                    "assigned_ips": [
                        "2a12:edc0:0004:bc48:0000:0000:0000:0001"
                    ],
                    "active": true,
                    "suspended": false,
                    "domain": "76485-20469.pph-server.de",
                    "status": "Active",
                    "billingcycle": "Monthly",
                    "has_invoices": true,
                    "has_unpaid_invoice": false,
                    "created_at": "2024-04-10T22:00:00.000000Z",
                    "next_due_date": "2024-05-10T22:00:00.000000Z",
                    "next_due_in": 26,
                    "next_due_human": "in 3 Wo.",
                    "amount": 6.82,
                    "firstpaymentamount": 6.82,
                    "cancellation": false,
                    "promotion": {
                        "code": "WASISTMITHASILOS",
                        "label": "WASISTMITHASILOS = wiederkehrend 25%",
                        "description": "25% Rabatt ges. Laufzeit",
                        "recurring": true,
                        "recurring_for": 0,
                        "recurring_infinite": true,
                        "value": 25,
                        "type": "Percentage"
                    },
                    "management_url": "https://api.pph.sh/client/routes?hosting=48592&tab=main",
                    "options": [
                        {
                            "config": {
                                "id": 296,
                                "label": "Betriebssystem",
                                "default": 1018
                            },
                            "option": {
                                "id": 1018,
                                "label": "Linux"
                            }
                        },
                        {
                            "config": {
                                "id": 329,
                                "label": "CPU Kerne",
                                "default": 1037
                            },
                            "option": {
                                "id": 1037,
                                "label": "2 Kerne"
                            }
                        },
                        {
                            "config": {
                                "id": 330,
                                "label": "Arbeitsspeicher",
                                "default": 1043
                            },
                            "option": {
                                "id": 1043,
                                "label": "2 GB RAM garantiert"
                            }
                        },
                        {
                            "config": {
                                "id": 331,
                                "label": "Festplattenspeicher",
                                "default": 1053
                            },
                            "option": {
                                "id": 1053,
                                "label": "50 GB SSD Speicher"
                            }
                        },
                        {
                            "config": {
                                "id": 332,
                                "label": "IPv4-Adressen",
                                "default": 1060
                            },
                            "option": {
                                "id": 1060,
                                "label": "1 IPv4 Adresse"
                            }
                        },
                        {
                            "config": {
                                "id": 333,
                                "label": "IPv6-Subnetz",
                                "default": 1063
                            },
                            "option": {
                                "id": 1063,
                                "label": "1 /64 IPv6 Netz (inkl.)"
                            }
                        },
                        {
                            "config": {
                                "id": 334,
                                "label": "Plesk",
                                "default": 1064
                            },
                            "option": {
                                "id": 1064,
                                "label": "Ohne Plesk"
                            }
                        },
                        {
                            "config": {
                                "id": 335,
                                "label": "Netzwerkspeicher hinzufügen",
                                "default": 1066
                            },
                            "option": {
                                "id": 1066,
                                "label": "Ohne Netzwerkspeicher"
                            }
                        },
                        {
                            "config": {
                                "id": 336,
                                "label": "Prepaid Hoster PRO abonnieren",
                                "default": 1069
                            },
                            "option": {
                                "id": 1069,
                                "label": "Ohne Pro-Features"
                            }
                        }
                    ],
                    "addons": []
                }
            ],
            "domains": [],
            "upgrades": []
        }
    ],
    "links": {
        "first": "https://fsn-01.api.pph.sh/client/orders?page=1",
        "last": "https://fsn-01.api.pph.sh/client/orders?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://fsn-01.api.pph.sh/client/orders?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://fsn-01.api.pph.sh/client/orders",
        "per_page": 15,
        "to": 1,
        "total": 1
    }
}
 

Request   

GET client/orders

Query Parameters

recent  boolean optional  

Only show orders from last days, as specified in recent_days.

recent_days  integer optional  

Determine how many days mean recent. Defaults to 7.

Get order

Returns a single order

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/orders/30910" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/orders/30910"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "ModelNotFoundException",
        "url": "https://fsn-01.api.pph.sh/client/orders/30910",
        "errors": null,
        "exception": true,
        "model": "Order",
        "id": [
            30910
        ],
        "message": "No query results for model [DeZio\\WHMCS\\Models\\Order] 30910",
        "trace": "Illuminate\\Database\\Eloquent\\ModelNotFoundException: No query results for model [DeZio\\WHMCS\\Models\\Order] 30910 in /var/www/api/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:444\nStack trace:\n#0 /var/www/api/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->findOrFail()\n#1 /var/www/api/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(52): Illuminate\\Database\\Eloquent\\Relations\\Relation->forwardCallTo()\n#2 /var/www/api/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php(481): Illuminate\\Database\\Eloquent\\Relations\\Relation->forwardDecoratedCallTo()\n#3 /var/www/api/app/Http/Controllers/ClientOrderApiController.php(44): Illuminate\\Database\\Eloquent\\Relations\\Relation->__call()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\ClientOrderApiController->show()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#10 /var/www/api/app/Http/Middleware/ApiAccessPermission.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\ApiAccessPermission->handle()\n#12 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#14 /var/www/api/app/Http/Middleware/ApiLog.php(38): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\ApiLog->handle()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(44): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Auth\\Middleware\\Authenticate->handle()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#26 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#28 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#29 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#34 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#35 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#36 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#37 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#38 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#39 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#40 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#41 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#42 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#43 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#44 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#46 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#47 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#48 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#49 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#50 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#51 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#52 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#53 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#54 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#55 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#56 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#59 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#60 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#61 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#62 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#63 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#64 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#65 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#66 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#67 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#68 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#69 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#70 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#71 {main}"
    }
}
 

Request   

GET client/orders/{orderId}

URL Parameters

orderId  integer  

The order ID.

Client Tickets

List support tickets

Returns a list of support ticket requests

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/tickets" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/tickets"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "id": 56491,
            "date": "2022-10-11T17:02:29.000000Z",
            "subject": "12345678978978945645613",
            "client_name": "Dennis Ziolkowski",
            "generic_cat": "Allgemein",
            "status": "Beantwortet",
            "pending-support-reply": false,
            "pending-customer-reply": true,
            "active": true,
            "urgency": "Low",
            "message": "                    DB::connection("whmcs")->table('tbltickets')->where('tid', $response['result']->tid)->update(['service' => $service]);\r\n\nJa, ich erlaube der Henrik Kramer e. K. (Prepaid-Hoster) auf meinen Server zuzugreifen [...]\n",
            "last_reply": "2022-11-20T00:49:57.000000Z",
            "replies": 5,
            "latest_reply": {
                "supporter": "Nathalie v. d. Forst",
                "client": false,
                "message": "Moin Dennis Ziolkowski,\r\nvielen Dank für Ihre Anfrage.\r\n\r\nTest 12309ß327 1ß0 4372189 43798102 31\r\n\r\nMit freundlichen Grüßen\r\n\r\nNathalie von der Forst\r\nSupport\r\n\r\nHenrik Kramer e. K.\r\nKurpromenade 48\r\n23743 Grömitz",
                "date": "2022-11-20T00:49:57.000000Z"
            },
            "last_reply_diff_for_humans": "vor 14 Stunden"
        }
    ]
}
 

Request   

GET client/tickets

Response

Response Fields

id  integer  

The ticket ID

subject  string  

The ticket subject

generic_cat  string  

The ticket category

status  string  

The internal ticket status label

pending-support-reply  boolean  

Whether the ticket is in awaiting support reply

pending-customer-reply  boolean  

Whether the ticket is in awaiting customer reply

active  boolean  

Whether the ticket is active

urgency  string  

The tickets urgency. Can be low, normal or high.

message  string  

The tickets message

last_reply  object[]  

The tickets last reply date time

last_reply[].supporter    

Name of the supporter or client replying

last_reply[].client  boolean  

Whether this reply was made by the client

last_reply[].message    

The reply message

last_reply[].date    

The reply date and time

replies  integer  

The total number of replies on this ticket

last_reply_diff_for_humans  string  

Last reply date in human readable format

GET client/tickets/feedback

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/tickets/feedback" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/tickets/feedback"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

[]
 

Request   

GET client/tickets/feedback

Give feedback for a ticket

Example request:
curl --request POST \
    "https://api.pph.sh/client/tickets/feedback/1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/tickets/feedback/1"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/tickets/feedback/{ticket_id}

URL Parameters

ticket_id  integer  

The ID of the ticket.

Client Transactions

List transactions

requires authentication

Returns a list of transations

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/transactions" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"after\": \"2024-04-14T05:00:29\",
    \"before\": \"2024-04-14T05:00:29\"
}"
const url = new URL(
    "https://api.pph.sh/client/transactions"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "after": "2024-04-14T05:00:29",
    "before": "2024-04-14T05:00:29"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "id": 47129,
            "gateway": "banktransfer",
            "date": "2021-05-11T16:21:54.000000Z",
            "diff_for_humans": "vor 2 Minuten",
            "description": "Invoice Payment",
            "amountin": 1,
            "invoiceid": 155975
        }
    ],
    "links": {
        "first": "http://api.pph.sh/client/transactions?page=1",
        "last": "http://api.pph.sh/client/transactions?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "http://api.pph.sh/client/transactions?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "http://api.pph.sh/client/transactions",
        "per_page": 15,
        "to": 1,
        "total": 1
    }
}
 

Request   

GET client/transactions

Query Parameters

before  string optional  

date optional Only get transactions before a specified date.

after  string optional  

date optional Only get transactions after a specified date.

gateway  string optional  

optional Only get transactions accounted through a specific gateway.

page  integer optional  

optional Specify a page.

limit  integer optional  

optional Limit items per page.

Body Parameters

after  string optional  

value muss ein gültiges Datum sein.

before  string optional  

value muss ein gültiges Datum sein.

Transaction

Returns the invoice for a specific transaction

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/transactions/47129" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/transactions/47129"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "id": 47129,
        "gateway": "banktransfer",
        "date": "2021-05-11T16:21:54.000000Z",
        "diff_for_humans": "vor 2 Minuten",
        "description": "Invoice Payment",
        "amountin": 1,
        "invoiceid": 155975
    }
}
 

Request   

GET client/transactions/{transactionId}

URL Parameters

transactionId  integer  

The transaction id.

Initiate payment

requires authentication

Example request:
curl --request POST \
    "https://api.pph.sh/client/transactions/initiate?paymentmethod=PayPal&value=15.6" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/transactions/initiate"
);

const params = {
    "paymentmethod": "PayPal",
    "value": "15.6",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/transactions/initiate

Query Parameters

paymentmethod  string  

The name of the payment gateway.

value  number  

The amount of credit to add. Must not be less than 'minimum-transaction'-rule.

Response

Response Fields

url  string  

The url for the transaction initiation. The url is valid for a few minutes.

Transaction invoice

Returns the invoice for a specific transaction

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/transactions/47129/invoice" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/transactions/47129/invoice"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "id": 155975,
        "duedate": "2021-05-10T22:00:00.000000Z",
        "datepaid": "2021-05-11T16:21:54.000000Z",
        "date": "2021-05-10T22:00:00.000000Z",
        "subtotal": 1,
        "credit": 0,
        "tax": 0,
        "taxrate": 19,
        "total": 1,
        "status": "Paid",
        "status_label": "Bezahlt",
        "is_open": false,
        "items": [
            {
                "id": 172053,
                "invoiceid": 155975,
                "type": "AddFunds",
                "short_description": "Guthaben / Vorauszahlung hinzufügen",
                "description": "Guthaben / Vorauszahlung hinzufügen",
                "relid": 0,
                "amount": "1.00",
                "taxed": 0
            }
        ],
        "transaction": {
            "id": 47129,
            "gateway": "banktransfer",
            "date": "2021-05-11T16:21:54.000000Z",
            "diff_for_humans": "vor 2 Minuten",
            "description": "Invoice Payment",
            "amountin": 1,
            "invoiceid": 155975
        },
        "resources": {
            "invoice": "http://api.pph.sh/client/invoices/155975",
            "download": "http://api.pph.sh/client/invoices/155975/download"
        }
    }
}
 

Request   

GET client/transactions/{transactionId}/invoice

URL Parameters

transactionId  integer  

The transaction id.

Dedicated Server

Available filter options

Returns a list of available filter options.

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/dedicated/options" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/dedicated/options"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "cpu": {
            "id": "cpu",
            "label": "Prozessor",
            "format": "%s",
            "type": "option",
            "sort": false,
            "values": [
                {
                    "id": "Opteron 6338P",
                    "label": "AMD Opteron 6338P (12C/24T @2.3GHz)",
                    "bench": 3850,
                    "cpu": {
                        "id": 100,
                        "cpu_name": "amd Opteron 6338P",
                        "frq": 2.3,
                        "frq_turbo": null,
                        "cores": 12,
                        "threads": 24,
                        "created_at": "2023-06-25T15:58:19.000000Z",
                        "updated_at": "2023-06-25T15:58:19.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "opteron",
                            "label": "Opteron"
                        },
                        "short_name": "6338P"
                    }
                },
                {
                    "id": "Xeon E3-1245",
                    "label": "Intel Xeon E3-1245 (4C/8T @3.3GHz)",
                    "bench": 5244,
                    "cpu": {
                        "id": 82,
                        "cpu_name": "intel Xeon E3-1245 - Red.PS",
                        "frq": 3.3,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:31:44.000000Z",
                        "updated_at": "2023-06-01T11:31:44.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1245 - Red.PS"
                    }
                },
                {
                    "id": "Core i7-2600",
                    "label": "Intel Core i7-2600 (4C/8T @3.4GHz)",
                    "bench": 5343,
                    "cpu": {
                        "id": 78,
                        "cpu_name": "intel Core i7-2600",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:31:20.000000Z",
                        "updated_at": "2023-06-01T11:31:20.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-2600"
                    }
                },
                {
                    "id": "Xeon E3-1245V2",
                    "label": "Intel Xeon E3-1245V2 (4C/8T @3.4GHz)",
                    "bench": 6313,
                    "cpu": {
                        "id": 102,
                        "cpu_name": "intel Xeon E3-1245V2",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-10-01T11:32:29.000000Z",
                        "updated_at": "2023-10-01T11:32:29.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1245V2"
                    }
                },
                {
                    "id": "Core i7-3770",
                    "label": "Intel Core i7-3770 (4C/8T @3.4GHz)",
                    "bench": 6370,
                    "cpu": {
                        "id": 75,
                        "cpu_name": "intel Core i7-3770",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:35.000000Z",
                        "updated_at": "2023-06-01T11:30:35.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-3770"
                    }
                },
                {
                    "id": "Core i7-4770",
                    "label": "Intel Core i7-4770 (4C/8T @3.4GHz)",
                    "bench": 7048,
                    "cpu": {
                        "id": 69,
                        "cpu_name": "intel Core i7-4770",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:29:56.000000Z",
                        "updated_at": "2023-06-01T11:29:56.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-4770"
                    }
                },
                {
                    "id": "Xeon E3-1246V3",
                    "label": "Intel Xeon E3-1246V3 (4C/8T @3.5GHz)",
                    "bench": 7121,
                    "cpu": {
                        "id": 72,
                        "cpu_name": "intel Xeon E3-1246V3",
                        "frq": 3.5,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:15.000000Z",
                        "updated_at": "2023-06-01T11:30:15.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1246V3"
                    }
                },
                {
                    "id": "Xeon E3-1270V3",
                    "label": "Intel Xeon E3-1270V3 (4C/8T @3.5GHz)",
                    "bench": 7277,
                    "cpu": {
                        "id": 74,
                        "cpu_name": "intel Xeon E3-1270V3",
                        "frq": 3.5,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:28.000000Z",
                        "updated_at": "2023-06-01T11:30:28.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1270V3"
                    }
                },
                {
                    "id": "Xeon E3-1271V3",
                    "label": "Intel Xeon E3-1271V3 (4C/8T @3.6GHz)",
                    "bench": 7470,
                    "cpu": {
                        "id": 76,
                        "cpu_name": "intel Xeon E3-1271V3",
                        "frq": 3.6,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:43.000000Z",
                        "updated_at": "2023-06-01T11:30:43.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1271V3"
                    }
                },
                {
                    "id": "Core i7-6700",
                    "label": "Intel Core i7-6700 (4C/8T @3.4GHz)",
                    "bench": 8048,
                    "cpu": {
                        "id": 68,
                        "cpu_name": "intel Core i7-6700",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:29:50.000000Z",
                        "updated_at": "2023-06-01T11:29:50.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-6700"
                    }
                },
                {
                    "id": "Core i7-3930",
                    "label": "Intel Core i7-3930 (6C/12T @3.2GHz)",
                    "bench": 8078,
                    "cpu": {
                        "id": 86,
                        "cpu_name": "intel Core i7-3930",
                        "frq": 3.2,
                        "frq_turbo": null,
                        "cores": 6,
                        "threads": 12,
                        "created_at": "2023-06-01T11:32:07.000000Z",
                        "updated_at": "2023-06-01T11:32:07.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-3930"
                    }
                },
                {
                    "id": "Xeon E3-1275v5",
                    "label": "Intel Xeon E3-1275v5 (4C/8T @3.6GHz)",
                    "bench": 8292,
                    "cpu": {
                        "id": 70,
                        "cpu_name": "intel Xeon E3-1275v5",
                        "frq": 3.6,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:03.000000Z",
                        "updated_at": "2023-06-01T11:30:03.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1275v5"
                    }
                },
                {
                    "id": "Xeon E3-1275V6",
                    "label": "Intel Xeon E3-1275V6 (4C/8T @3.8GHz)",
                    "bench": 8564,
                    "cpu": {
                        "id": 73,
                        "cpu_name": "intel Xeon E3-1275V6",
                        "frq": 3.8,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:22.000000Z",
                        "updated_at": "2023-06-01T11:30:22.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E3-1275V6"
                    }
                },
                {
                    "id": "Core i7-7700",
                    "label": "Intel Core i7-7700 (4C/8T @3.6GHz)",
                    "bench": 8581,
                    "cpu": {
                        "id": 71,
                        "cpu_name": "intel Core i7-7700",
                        "frq": 3.6,
                        "frq_turbo": null,
                        "cores": 4,
                        "threads": 8,
                        "created_at": "2023-06-01T11:30:09.000000Z",
                        "updated_at": "2023-06-01T11:30:09.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-7700"
                    }
                },
                {
                    "id": "Xeon E5-1650V2",
                    "label": "Intel Xeon E5-1650V2 (6C/12T @3.5GHz)",
                    "bench": 8977,
                    "cpu": {
                        "id": 85,
                        "cpu_name": "intel Xeon E5-1650V2",
                        "frq": 3.5,
                        "frq_turbo": null,
                        "cores": 6,
                        "threads": 12,
                        "created_at": "2023-06-01T11:32:01.000000Z",
                        "updated_at": "2023-06-01T11:32:01.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E5-1650V2"
                    }
                },
                {
                    "id": "Xeon E5-1650V3",
                    "label": "Intel Xeon E5-1650V3 (6C/12T @3.5GHz)",
                    "bench": 10382,
                    "cpu": {
                        "id": 83,
                        "cpu_name": "intel Xeon E5-1650V3",
                        "frq": 3.5,
                        "frq_turbo": null,
                        "cores": 6,
                        "threads": 12,
                        "created_at": "2023-06-01T11:31:49.000000Z",
                        "updated_at": "2023-06-01T11:31:49.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "E5-1650V3"
                    }
                },
                {
                    "id": "Core i7-8700",
                    "label": "Intel Core i7-8700 (6C/12T @3.2GHz)",
                    "bench": 13180,
                    "cpu": {
                        "id": 81,
                        "cpu_name": "intel Core i7-8700",
                        "frq": 3.2,
                        "frq_turbo": null,
                        "cores": 6,
                        "threads": 12,
                        "created_at": "2023-06-01T11:31:37.000000Z",
                        "updated_at": "2023-06-01T11:31:37.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i7-8700"
                    }
                },
                {
                    "id": "XEON E-2176G",
                    "label": "Intel XEON E-2176G (6C/12T @3.7GHz)",
                    "bench": 13635,
                    "cpu": {
                        "id": 92,
                        "cpu_name": "intel XEON E-2176G",
                        "frq": 3.7,
                        "frq_turbo": null,
                        "cores": 6,
                        "threads": 12,
                        "created_at": "2023-06-01T11:32:54.000000Z",
                        "updated_at": "2023-06-01T11:32:54.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "XEON"
                        },
                        "short_name": "E-2176G"
                    }
                },
                {
                    "id": "XEON E-2276G",
                    "label": "Intel XEON E-2276G (6C/12T @3.8GHz)",
                    "bench": 13803,
                    "cpu": {
                        "id": 93,
                        "cpu_name": "intel XEON E-2276G",
                        "frq": 3.8,
                        "frq_turbo": null,
                        "cores": 6,
                        "threads": 12,
                        "created_at": "2023-06-01T11:33:00.000000Z",
                        "updated_at": "2023-06-01T11:33:00.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "XEON"
                        },
                        "short_name": "E-2276G"
                    }
                },
                {
                    "id": "Ryzen 7 PRO 1700X",
                    "label": "AMD Ryzen 7 PRO 1700X (8C/16T @3.4GHz)",
                    "bench": 15398,
                    "cpu": {
                        "id": 80,
                        "cpu_name": "amd Ryzen 7 PRO 1700X",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 8,
                        "threads": 16,
                        "created_at": "2023-06-01T11:31:30.000000Z",
                        "updated_at": "2023-06-01T11:31:30.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "ryzen",
                            "label": "Ryzen"
                        },
                        "short_name": "7 PRO 1700X"
                    }
                },
                {
                    "id": "Ryzen 7 1700X",
                    "label": "AMD Ryzen 7 1700X (8C/16T @3.4GHz)",
                    "bench": 15622,
                    "cpu": {
                        "id": 79,
                        "cpu_name": "amd Ryzen 7 1700X",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 8,
                        "threads": 16,
                        "created_at": "2023-06-01T11:31:25.000000Z",
                        "updated_at": "2023-06-01T11:31:25.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "ryzen",
                            "label": "Ryzen"
                        },
                        "short_name": "7 1700X"
                    }
                },
                {
                    "id": "Xeon W-2145",
                    "label": "Intel Xeon W-2145 (8C/16T @3.7GHz)",
                    "bench": 18292,
                    "cpu": {
                        "id": 91,
                        "cpu_name": "intel Xeon W-2145",
                        "frq": 3.7,
                        "frq_turbo": null,
                        "cores": 8,
                        "threads": 16,
                        "created_at": "2023-06-01T11:32:38.000000Z",
                        "updated_at": "2023-06-01T11:32:38.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "W-2145"
                    }
                },
                {
                    "id": "Core i9-9900K",
                    "label": "Intel Core i9-9900K (8C/16T @3.6GHz)",
                    "bench": 18879,
                    "cpu": {
                        "id": 87,
                        "cpu_name": "intel Core i9-9900K",
                        "frq": 3.6,
                        "frq_turbo": null,
                        "cores": 8,
                        "threads": 16,
                        "created_at": "2023-06-01T11:32:14.000000Z",
                        "updated_at": "2023-06-01T11:32:14.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i9-9900K"
                    }
                },
                {
                    "id": "Core i5-12500",
                    "label": "Intel Core i5-12500 (8C/16T @3.2GHz)",
                    "bench": 19901,
                    "cpu": {
                        "id": 88,
                        "cpu_name": "intel Core i5-12500",
                        "frq": 3.2,
                        "frq_turbo": null,
                        "cores": 8,
                        "threads": 16,
                        "created_at": "2023-06-01T11:32:20.000000Z",
                        "updated_at": "2023-06-01T11:32:20.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i5-12500"
                    }
                },
                {
                    "id": "Ryzen 7 3700X",
                    "label": "AMD Ryzen 7 3700X (8C/16T @3.6GHz)",
                    "bench": 22719,
                    "cpu": {
                        "id": 89,
                        "cpu_name": "amd Ryzen 7 3700X",
                        "frq": 3.6,
                        "frq_turbo": null,
                        "cores": 8,
                        "threads": 16,
                        "created_at": "2023-06-01T11:32:25.000000Z",
                        "updated_at": "2023-06-01T11:32:25.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "ryzen",
                            "label": "Ryzen"
                        },
                        "short_name": "7 3700X"
                    }
                },
                {
                    "id": "EPYC 7401P",
                    "label": "AMD EPYC 7401P (24C/48T @2GHz)",
                    "bench": 23813,
                    "cpu": {
                        "id": 97,
                        "cpu_name": "amd EPYC 7401P",
                        "frq": 2,
                        "frq_turbo": null,
                        "cores": 24,
                        "threads": 48,
                        "created_at": "2023-06-01T11:33:39.000000Z",
                        "updated_at": "2023-06-01T11:33:39.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "epyc",
                            "label": "EPYC"
                        },
                        "short_name": "7401P"
                    }
                },
                {
                    "id": "Ryzen Threadripper 2950X",
                    "label": "AMD Ryzen Threadripper 2950X (16C/32T @3.5GHz)",
                    "bench": 30191,
                    "cpu": {
                        "id": 95,
                        "cpu_name": "amd Ryzen Threadripper 2950X",
                        "frq": 3.5,
                        "frq_turbo": null,
                        "cores": 16,
                        "threads": 32,
                        "created_at": "2023-06-01T11:33:26.000000Z",
                        "updated_at": "2023-06-01T11:33:26.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "ryzen",
                            "label": "Ryzen"
                        },
                        "short_name": "Threadripper 2950X"
                    }
                },
                {
                    "id": "Xeon W-2295",
                    "label": "Intel Xeon W-2295 (18C/36T @3GHz)",
                    "bench": 30508,
                    "cpu": {
                        "id": 103,
                        "cpu_name": "intel Xeon W-2295",
                        "frq": 3,
                        "frq_turbo": null,
                        "cores": 18,
                        "threads": 36,
                        "created_at": "2023-12-22T13:51:47.000000Z",
                        "updated_at": "2023-12-22T13:51:47.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "xeon",
                            "label": "Xeon"
                        },
                        "short_name": "W-2295"
                    }
                },
                {
                    "id": "Ryzen 9 3900",
                    "label": "AMD Ryzen 9 3900 (12C/24T @3.1GHz)",
                    "bench": 30649,
                    "cpu": {
                        "id": 90,
                        "cpu_name": "amd Ryzen 9 3900",
                        "frq": 3.1,
                        "frq_turbo": null,
                        "cores": 12,
                        "threads": 24,
                        "created_at": "2023-06-01T11:32:31.000000Z",
                        "updated_at": "2023-06-01T11:32:31.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "ryzen",
                            "label": "Ryzen"
                        },
                        "short_name": "9 3900"
                    }
                },
                {
                    "id": "Core i9-12900K",
                    "label": "Intel Core i9-12900K (16C/24T @3.2GHz)",
                    "bench": 41594,
                    "cpu": {
                        "id": 99,
                        "cpu_name": "intel Core i9-12900K",
                        "frq": 3.2,
                        "frq_turbo": null,
                        "cores": 16,
                        "threads": 24,
                        "created_at": "2023-06-01T11:33:52.000000Z",
                        "updated_at": "2023-06-01T11:33:52.000000Z",
                        "vendor": "Intel",
                        "generation": {
                            "id": "core",
                            "label": "Core"
                        },
                        "short_name": "i9-12900K"
                    }
                },
                {
                    "id": "EPYC 7502",
                    "label": "AMD EPYC 7502",
                    "bench": 45839,
                    "cpu": null
                },
                {
                    "id": "Ryzen 9 5950X",
                    "label": "AMD Ryzen 9 5950X (16C/32T @3.4GHz)",
                    "bench": 45895,
                    "cpu": {
                        "id": 98,
                        "cpu_name": "amd Ryzen 9 5950X",
                        "frq": 3.4,
                        "frq_turbo": null,
                        "cores": 16,
                        "threads": 32,
                        "created_at": "2023-06-01T11:33:45.000000Z",
                        "updated_at": "2023-06-01T11:33:45.000000Z",
                        "vendor": "AMD",
                        "generation": {
                            "id": "ryzen",
                            "label": "Ryzen"
                        },
                        "short_name": "9 5950X"
                    }
                },
                {
                    "id": "EPYC 7502P",
                    "label": "AMD EPYC 7502P",
                    "bench": 48724,
                    "cpu": null
                }
            ]
        },
        "memory": {
            "id": "memory",
            "label": "Arbeitsspeicher",
            "format": "%s GB",
            "type": "range",
            "values": [
                16,
                32,
                64,
                128,
                160,
                192,
                224,
                256,
                320,
                352,
                384,
                448,
                512,
                576,
                640,
                704,
                768,
                1024
            ]
        },
        "disk": {
            "id": "disk",
            "label": "Speicherplatz",
            "format": "%s GB",
            "type": "range",
            "values": [
                0,
                240,
                250,
                256,
                480,
                500,
                512,
                720,
                960,
                1000,
                1024,
                1440,
                1500,
                1536,
                1920,
                1966,
                2000,
                2048,
                2880,
                3072,
                3840,
                3932,
                4096,
                4800,
                5898,
                6144,
                7680,
                7864,
                8192,
                10240,
                11796,
                12288,
                15728,
                16384,
                19660,
                20480,
                23592,
                24576,
                27524,
                30720,
                31456,
                32768,
                40960,
                61440,
                65536,
                79872,
                92160,
                102400,
                153600,
                163840
            ]
        },
        "disktype": {
            "id": "disktype",
            "label": "Speicher-Typ",
            "format": "%s",
            "type": "option",
            "values": [
                "hdd",
                "hybrid",
                "nvme",
                "ssd"
            ]
        },
        "price": {
            "id": "price",
            "label": "Preis",
            "format": "%s Euro",
            "type": "range",
            "values": [
                51,
                52,
                53,
                54,
                55,
                57,
                58,
                59,
                60,
                61,
                62,
                64,
                65,
                66,
                67,
                68,
                70,
                71,
                72,
                73,
                74,
                76,
                77,
                78,
                79,
                80,
                82,
                83,
                84,
                85,
                93,
                94,
                95,
                97,
                98,
                106,
                107,
                108,
                110,
                111,
                112,
                113,
                115,
                116,
                117,
                119,
                120,
                121,
                122,
                124,
                125,
                126,
                128,
                129,
                130,
                131,
                133,
                134,
                135,
                136,
                138,
                139,
                140,
                143,
                144,
                145,
                147,
                148,
                149,
                150,
                152,
                153,
                154,
                156,
                157,
                158,
                159,
                161,
                162,
                163,
                164,
                166,
                167,
                168,
                170,
                171,
                172,
                173,
                175,
                176,
                177,
                178,
                180,
                181,
                182,
                184,
                185,
                186,
                187,
                189,
                190,
                191,
                192,
                194,
                195,
                198,
                199,
                200,
                201,
                203,
                204,
                206,
                208,
                210,
                212,
                213,
                214,
                215,
                217,
                218,
                219,
                220,
                223,
                224,
                226,
                227,
                229,
                232,
                233,
                234,
                236,
                237,
                238,
                241,
                242,
                243,
                245,
                246,
                247,
                248,
                251,
                252,
                254,
                255,
                256,
                257,
                259,
                260,
                261,
                262,
                266,
                268,
                269,
                271,
                273,
                274,
                275,
                276,
                278,
                279,
                280,
                282,
                283,
                284,
                285,
                289,
                290,
                292,
                293,
                294,
                297,
                298,
                299,
                301,
                302,
                304,
                306,
                307,
                311,
                312,
                316,
                318,
                320,
                321,
                322,
                324,
                326,
                327,
                329,
                331,
                334,
                335,
                339,
                340,
                341,
                344,
                348,
                350,
                355,
                357,
                380,
                381,
                383,
                385,
                386,
                387,
                390,
                392,
                394,
                395,
                396,
                400,
                404,
                408,
                415,
                420,
                424,
                428,
                445,
                451,
                455,
                469,
                476,
                478,
                483,
                484,
                488,
                489,
                493,
                495,
                502,
                503,
                526,
                555,
                572,
                604,
                605,
                609,
                616,
                622,
                630,
                634,
                638,
                641,
                646,
                650,
                657,
                707,
                918
            ]
        }
    }
}
 

Request   

GET public/products/dedicated/options

Pricing for additional IPs

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/dedicated/ips" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/dedicated/ips"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "single": [
            {
                "name": "1 zusätzliche IP(s)",
                "setup": 10,
                "price": 2.5
            },
            {
                "name": "2 zusätzliche IP(s)",
                "setup": 20,
                "price": 5
            },
            {
                "name": "3 zusätzliche IP(s)",
                "setup": 30,
                "price": 7.5
            },
            {
                "name": "4 zusätzliche IP(s)",
                "setup": 40,
                "price": 10
            },
            {
                "name": "5 zusätzliche IP(s)",
                "setup": 50,
                "price": 12.5
            },
            {
                "name": "6 zusätzliche IP(s)",
                "setup": 60,
                "price": 15
            }
        ],
        "subnets": [
            {
                "name": "/29-IP Subnetz (6 verwendbare IPs)",
                "setup": 80,
                "price": 20
            },
            {
                "name": "/28-IP Subnetz (14 verwendbare IPs)",
                "setup": 160,
                "price": 40
            },
            {
                "name": "/27-IP Subnetz (30 verwendbare IPs)",
                "setup": 320,
                "price": 80
            }
        ]
    }
}
 

Request   

GET public/products/dedicated/ips

List orderable servers

Returns a list of orderable dedicated servers

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/dedicated?sort=price&limit=5" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/dedicated"
);

const params = {
    "sort": "price",
    "limit": "5",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "current_page": 1,
    "data": [
        {
            "serverid": 1730555,
            "recommendation": false,
            "vendor": "intel",
            "hardwareid": "intel-core-i7-4770-4x-ram-8192-mb-ddr3-2x-ssd-sata-240-gb",
            "description": [
                "Intel Core i7-4770",
                "4x RAM 8192 MB DDR3",
                "2x SSD SATA 240 GB"
            ],
            "cpu": "Core i7-4770",
            "benchmark": 7048,
            "memory": 32,
            "disksize": 240,
            "diskcount": 2,
            "disktype": {
                "rotational": false,
                "type": "ssd"
            },
            "disktags": [
                "ssd"
            ],
            "datacenter": "FSN1-DC10",
            "networkspeed": 1000,
            "price": 56.98,
            "setup": 10,
            "internal": "MTczMDU1NXwyOjMyfDM4MDg=",
            "discount": null,
            "extra": {
                "special_offer": false
            }
        }
    ]
}
 

Request   

GET public/products/dedicated

Query Parameters

sort  string optional  

Sort response by a specific field.

limit  integer optional  

Limit the response length.

Recommends the cheapest servers by category

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/dedicated/recommended" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/dedicated/recommended"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "special": [],
        "special_info": {
            "valid_until": null
        },
        "ssd": {
            "serverid": 2350389,
            "recommendation": false,
            "vendor": "intel",
            "hardwareid": "intel-xeon-w-2145-4x-ram-32768-mb-ddr4-ecc-reg-1x-ssd-sata-960-gb-datacenter-nic-1-gbit-intel-i210",
            "description": [
                "Intel Xeon W-2145",
                "4x RAM 32768 MB DDR4 ECC reg.",
                "1x SSD SATA 960 GB Datacenter",
                "NIC 1 Gbit - Intel I210"
            ],
            "cpu": "Xeon W-2145",
            "cpu_info": {
                "id": 91,
                "cpu_name": "intel Xeon W-2145",
                "frq": 3.7,
                "frq_turbo": null,
                "cores": 8,
                "threads": 16,
                "created_at": "2023-06-01T11:32:38.000000Z",
                "updated_at": "2023-06-01T11:32:38.000000Z",
                "vendor": "Intel",
                "generation": {
                    "id": "xeon",
                    "label": "Xeon"
                },
                "short_name": "W-2145"
            },
            "benchmark": 18292,
            "memory": 128,
            "disksize": 960,
            "diskcount": 1,
            "disktype": {
                "rotational": false,
                "type": "ssd"
            },
            "disktags": [
                "dc",
                "ssd",
                "ecc",
                "inic"
            ],
            "datacenter": "FSN1-DC20",
            "networkspeed": 1000,
            "price": 83.99,
            "setup": 10,
            "internal": 6866.299999999999,
            "discount": null,
            "pf": {
                "start": 83.99,
                "perMemory": 0.43744791666666666,
                "perDisk": 0.08748958333333333,
                "perCpu": 0.19997619047619047,
                "perBench": 0.004591624753990815,
                "sum": 0.73
            },
            "windows": true,
            "extra": {
                "special_offer": false
            },
            "original": {
                "id": 2350389,
                "name": "Server Auction",
                "description": [
                    "Intel Xeon W-2145",
                    "4x RAM 32768 MB DDR4 ECC reg.",
                    "1x SSD SATA 960 GB Datacenter",
                    "NIC 1 Gbit - Intel I210"
                ],
                "traffic": "unlimited",
                "dist": [
                    "Rescue system"
                ],
                "arch": [
                    64
                ],
                "lang": [
                    "en"
                ],
                "cpu": "Intel Xeon W-2145",
                "cpu_benchmark": 18292,
                "memory_size": 128,
                "hdd_size": 960,
                "hdd_text": "DC SSD ECC INIC",
                "hdd_count": 1,
                "datacenter": "FSN1-DC20",
                "network_speed": "1 Gbit/s",
                "price": "56.0000",
                "price_hourly": "0.0897",
                "price_setup": "0.0000",
                "price_vat": "66.6400",
                "price_hourly_vat": "0.1067",
                "price_setup_vat": "0.0000",
                "fixed_price": false,
                "next_reduce": 11243,
                "next_reduce_date": "2024-04-14 08:04:00",
                "orderable_addons": [
                    {
                        "id": "primary_ipv4",
                        "name": "Primary IPv4",
                        "min": 0,
                        "max": 1,
                        "prices": [
                            {
                                "location": "FSN1",
                                "price": {
                                    "net": "1.7000",
                                    "gross": "2.0230",
                                    "hourly_net": "0.0027",
                                    "hourly_gross": "0.0032"
                                },
                                "price_setup": {
                                    "net": "0.0000",
                                    "gross": "0.0000"
                                }
                            }
                        ]
                    }
                ]
            }
        },
        "amd": {
            "serverid": 2354766,
            "recommendation": false,
            "vendor": "amd",
            "hardwareid": "amd-ryzen-7-pro-1700x-4x-ram-16384-mb-ddr4-2x-ssd-sata-512-gb",
            "description": [
                "AMD Ryzen 7 PRO 1700X",
                "4x RAM 16384 MB DDR4",
                "2x SSD SATA 512 GB"
            ],
            "cpu": "Ryzen 7 PRO 1700X",
            "cpu_info": {
                "id": 80,
                "cpu_name": "amd Ryzen 7 PRO 1700X",
                "frq": 3.4,
                "frq_turbo": null,
                "cores": 8,
                "threads": 16,
                "created_at": "2023-06-01T11:31:30.000000Z",
                "updated_at": "2023-06-01T11:31:30.000000Z",
                "vendor": "AMD",
                "generation": {
                    "id": "ryzen",
                    "label": "Ryzen"
                },
                "short_name": "7 PRO 1700X"
            },
            "benchmark": 15398,
            "memory": 64,
            "disksize": 1024,
            "diskcount": 2,
            "disktype": {
                "rotational": false,
                "type": "ssd"
            },
            "disktags": [
                "ssd"
            ],
            "datacenter": "FSN1-DC14",
            "networkspeed": 1000,
            "price": 58.99,
            "setup": 10,
            "internal": 4367.3,
            "discount": null,
            "pf": {
                "start": 58.99,
                "perMemory": 0.6144791666666667,
                "perDisk": 0.057607421875,
                "perCpu": 0.15125641025641026,
                "perBench": 0.003831017015196779,
                "sum": 0.83
            },
            "windows": true,
            "extra": {
                "special_offer": false
            },
            "original": {
                "id": 2354766,
                "name": "Server Auction",
                "description": [
                    "AMD Ryzen 7 PRO 1700X",
                    "4x RAM 16384 MB DDR4",
                    "2x SSD SATA 512 GB"
                ],
                "traffic": "unlimited",
                "dist": [
                    "Rescue system"
                ],
                "arch": [
                    64
                ],
                "lang": [
                    "en"
                ],
                "cpu": "AMD Ryzen 7 PRO 1700X",
                "cpu_benchmark": 15398,
                "memory_size": 64,
                "hdd_size": 512,
                "hdd_text": "SSD",
                "hdd_count": 2,
                "datacenter": "FSN1-DC14",
                "network_speed": "1 Gbit/s",
                "price": "35.0000",
                "price_hourly": "0.0561",
                "price_setup": "0.0000",
                "price_vat": "41.6500",
                "price_hourly_vat": "0.0668",
                "price_setup_vat": "0.0000",
                "fixed_price": false,
                "next_reduce": 24131,
                "next_reduce_date": "2024-04-14 11:39:00",
                "orderable_addons": [
                    {
                        "id": "primary_ipv4",
                        "name": "Primary IPv4",
                        "min": 0,
                        "max": 1,
                        "prices": [
                            {
                                "location": "FSN1",
                                "price": {
                                    "net": "1.7000",
                                    "gross": "2.0230",
                                    "hourly_net": "0.0027",
                                    "hourly_gross": "0.0032"
                                },
                                "price_setup": {
                                    "net": "0.0000",
                                    "gross": "0.0000"
                                }
                            }
                        ]
                    }
                ]
            }
        },
        "space": {
            "serverid": 2271507,
            "recommendation": false,
            "vendor": "intel",
            "hardwareid": "intel-core-i7-6700-2x-ram-16384-mb-ddr4-2x-hdd-sata-40-tb-enterprise-nic-1-gbit-intel-i219-lm",
            "description": [
                "Intel Core i7-6700",
                "2x RAM 16384 MB DDR4",
                "2x HDD SATA 4,0 TB Enterprise",
                "NIC 1 Gbit - Intel I219-LM"
            ],
            "cpu": "Core i7-6700",
            "cpu_info": {
                "id": 68,
                "cpu_name": "intel Core i7-6700",
                "frq": 3.4,
                "frq_turbo": null,
                "cores": 4,
                "threads": 8,
                "created_at": "2023-06-01T11:29:50.000000Z",
                "updated_at": "2023-06-01T11:29:50.000000Z",
                "vendor": "Intel",
                "generation": {
                    "id": "core",
                    "label": "Core"
                },
                "short_name": "i7-6700"
            },
            "benchmark": 8048,
            "memory": 32,
            "disksize": 8192,
            "diskcount": 2,
            "disktype": {
                "rotational": true,
                "type": "hdd"
            },
            "disktags": [
                "ent.hdd",
                "inic"
            ],
            "datacenter": "FSN1-DC13",
            "networkspeed": 1000,
            "price": 51.99,
            "setup": 10,
            "internal": 3653.3,
            "discount": null,
            "pf": {
                "start": 51.99,
                "perMemory": 1.0831250000000001,
                "perDisk": 0.006346435546875,
                "perCpu": 0.13330769230769232,
                "perBench": 0.006459990059642148,
                "sum": 1.23
            },
            "windows": true,
            "extra": {
                "special_offer": false
            },
            "original": {
                "id": 2271507,
                "name": "Server Auction",
                "description": [
                    "Intel Core i7-6700",
                    "2x RAM 16384 MB DDR4",
                    "2x HDD SATA 4,0 TB Enterprise",
                    "NIC 1 Gbit - Intel I219-LM"
                ],
                "traffic": "unlimited",
                "dist": [
                    "Rescue system"
                ],
                "arch": [
                    64
                ],
                "lang": [
                    "en"
                ],
                "cpu": "Intel Core i7-6700",
                "cpu_benchmark": 8048,
                "memory_size": 32,
                "hdd_size": 4096,
                "hdd_text": "ENT.HDD INIC",
                "hdd_count": 2,
                "datacenter": "FSN1-DC13",
                "network_speed": "1 Gbit/s",
                "price": "29.0000",
                "price_hourly": "0.0465",
                "price_setup": "0.0000",
                "price_vat": "34.5100",
                "price_hourly_vat": "0.0553",
                "price_setup_vat": "0.0000",
                "fixed_price": true,
                "next_reduce": 0,
                "next_reduce_date": "null",
                "orderable_addons": [
                    {
                        "id": "primary_ipv4",
                        "name": "Primary IPv4",
                        "min": 0,
                        "max": 1,
                        "prices": [
                            {
                                "location": "FSN1",
                                "price": {
                                    "net": "1.7000",
                                    "gross": "2.0230",
                                    "hourly_net": "0.0027",
                                    "hourly_gross": "0.0032"
                                },
                                "price_setup": {
                                    "net": "0.0000",
                                    "gross": "0.0000"
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}
 

Domains

WHOIS servers

Returns a list of TLDs and their whois servers

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/whois-servers?tld=de" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/whois-servers"
);

const params = {
    "tld": "de",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "servers": [
            {
                "tld": "de",
                "whois": "whois.denic.de"
            }
        ]
    },
    "success": true
}
 

Request   

GET public/domains/whois-servers

Query Parameters

tld  string optional  

A tld to filter.

Get a single tld info

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/tld-info/de" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/tld-info/de"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "tld": "de",
        "type": "country-code",
        "year": "1986",
        "manager": "DENIC eG",
        "categories": [
            "Länder"
        ],
        "pricing": {
            "register": 3.99,
            "transfer": 3.99,
            "renew": 3.99,
            "restore": 21.99,
            "default": {
                "register": 3.99,
                "transfer": 3.99,
                "renew": 3.99
            }
        }
    }
}
 

Request   

GET public/domains/tld-info/{tld}

URL Parameters

The tld  string  

Available TLDs

Returns a list of available top level domains

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/extensions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/extensions"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "extension": ".de",
            "tag": "hot",
            "pricing": {
                "register": 8.99,
                "renew": 8.99,
                "transfer": 8.99
            },
            "details": {
                "type": "country-code",
                "year": "1986",
                "manager": "DENIC eG",
                "categories": [
                    "Länder"
                ]
            }
        }
    ]
}
 

Request   

GET public/domains/extensions

Specific TLD info

Returns a list of available top level domains

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/extensions/de" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/extensions/de"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "extension": ".de",
        "tag": "",
        "pricing": {
            "register": 3.99,
            "renew": 3.99,
            "transfer": 3.99
        },
        "popularity": 0,
        "details": {
            "type": "country-code",
            "year": "1986",
            "manager": "DENIC eG",
            "categories": [
                "Länder"
            ]
        }
    }
}
 

Request   

GET public/domains/extensions/{tld}

URL Parameters

The tld  string  

Returns simple information about a domain inquiry

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/search?query=domain.com&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/search"
);

const params = {
    "query": "domain.com",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, no-cache, public
content-type: application/json
x-ratelimit-limit: 10
x-ratelimit-remaining: 8
access-control-allow-origin: *
 

{
    "data": {
        "query": "domain.com",
        "tld": "com",
        "sld": "domain",
        "list": [
            {
                "tld": "com",
                "sld": "domain",
                "name": "domain.com",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.com&hash=d86cc5f9a385001fe940f31ef0d1423d&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "1985",
                    "manager": "VeriSign Global Registry Services",
                    "categories": [
                        "Generisch"
                    ]
                }
            },
            {
                "tld": "de",
                "sld": "domain",
                "name": "domain.de",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.de&hash=3c7866fdbb5884996cc9a891f5fb2fe2&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "1986",
                    "manager": "DENIC eG",
                    "categories": [
                        "Länder"
                    ]
                }
            },
            {
                "tld": "eu",
                "sld": "domain",
                "name": "domain.eu",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.eu&hash=87052ec82e01c4528f7afe89c733e48c&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "2005",
                    "manager": "EURid vzw/asbl",
                    "categories": [
                        "Regional, Kulturell"
                    ]
                }
            },
            {
                "tld": "me",
                "sld": "domain",
                "name": "domain.me",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.me&hash=7184d130c2d1c9abdd791707f49c5e74&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "2007",
                    "manager": "Government of Montenegro",
                    "categories": [
                        "Länder"
                    ]
                }
            },
            {
                "tld": "dev",
                "sld": "domain",
                "name": "domain.dev",
                "highlight": "1",
                "tag": "hot",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.dev&hash=cbac9be424a11c0f7dfaf3f5beab7392&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "2014",
                    "manager": "Charleston Road Registry Inc.",
                    "categories": [
                        "Organisationen"
                    ]
                }
            },
            {
                "tld": "xyz",
                "sld": "domain",
                "name": "domain.xyz",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.xyz&hash=aeea388d7497d3c4bdcef9a032958328&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "2014",
                    "manager": "XYZ.COM LLC",
                    "categories": [
                        "Verschiedenes"
                    ]
                }
            },
            {
                "tld": "io",
                "sld": "domain",
                "name": "domain.io",
                "highlight": "1",
                "tag": "hot",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.io&hash=7bd05b1327fbf48d592a48539d51af91&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "1997",
                    "manager": "Internet Computer Bureau Limited",
                    "categories": [
                        "Internet",
                        "Länder"
                    ]
                }
            },
            {
                "tld": "net",
                "sld": "domain",
                "name": "domain.net",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.net&hash=a970d373ffc9bdb353de5b6e78ba170e&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "1985",
                    "manager": "VeriSign Global Registry Services",
                    "categories": [
                        "Generisch"
                    ]
                }
            },
            {
                "tld": "network",
                "sld": "domain",
                "name": "domain.network",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.network&hash=f0011ed0c11209cf09e31e3487effa11&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "2014",
                    "manager": "Binky Moon, LLC",
                    "categories": [
                        "Business",
                        "Community",
                        "Social & Lifestyle",
                        "Technologie",
                        "Internet"
                    ]
                }
            },
            {
                "tld": "shop",
                "sld": "domain",
                "name": "domain.shop",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.shop&hash=485fd837c88df04c968475247ccf38a4&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "2016",
                    "manager": "GMO Registry, Inc.",
                    "categories": [
                        "Kommerziell"
                    ]
                }
            },
            {
                "tld": "org",
                "sld": "domain",
                "name": "domain.org",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.org&hash=6f2816ea63ed4b3762ec982373fbab47&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "1985",
                    "manager": "Public Interest Registry (PIR)",
                    "categories": [
                        "Generisch"
                    ]
                }
            },
            {
                "tld": "at",
                "sld": "domain",
                "name": "domain.at",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.at&hash=54fc68445111b63980c31fc205359a85&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "1988",
                    "manager": "nic.at GmbH",
                    "categories": [
                        "Länder"
                    ]
                }
            },
            {
                "tld": "ch",
                "sld": "domain",
                "name": "domain.ch",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.ch&hash=5c72bbbe65e660d00b0b7e9e276edb5c&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "1987",
                    "manager": "SWITCH The Swiss Education & Research Network",
                    "categories": [
                        "Länder"
                    ]
                }
            },
            {
                "tld": "tv",
                "sld": "domain",
                "name": "domain.tv",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.tv&hash=5c1ddfd306cdf44cad89945f37b94c98&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "country-code",
                    "year": "1996",
                    "manager": "Ministry of Finance and Tourism",
                    "categories": [
                        "Medien, Art, Musik",
                        "Länder"
                    ]
                }
            },
            {
                "tld": "business",
                "sld": "domain",
                "name": "domain.business",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.business&hash=26aff09cf2675e0085ded72dea8f1a25&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "2014",
                    "manager": "Binky Moon, LLC",
                    "categories": [
                        "Business"
                    ]
                }
            },
            {
                "tld": "info",
                "sld": "domain",
                "name": "domain.info",
                "highlight": "1",
                "tag": "",
                "availability": "https://api.pph.sh/public/domains/check?query=domain.info&hash=8e3435b8c6aca7d6f2c0372e8e69cda4&u=f528764d624db129b32c21fbca0cb8d6",
                "info": {
                    "type": "generic",
                    "year": "2001",
                    "manager": "Afilias Limited",
                    "categories": [
                        "Generisch"
                    ]
                }
            }
        ]
    },
    "success": true
}
 

Domain availability

Returns information about the availability of a single domain

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/check?query=domain.com" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"query\": \"debitis\"
}"
const url = new URL(
    "https://api.pph.sh/public/domains/check"
);

const params = {
    "query": "domain.com",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "query": "debitis"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (500):

Show headers
cache-control: max-age=120, must-revalidate, no-cache, no-store, public
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "Error",
        "errors": "Call to a member function getQuery() on array",
        "exception": true,
        "url": "https://fsn-01.api.pph.sh/public/domains/check",
        "message": "Call to a member function getQuery() on array",
        "trace": "Error: Call to a member function getQuery() on array in /var/www/api/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:23\nStack trace:\n#0 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php(152): Illuminate\\Http\\Resources\\Json\\JsonResource->forwardCallTo()\n#1 /var/www/api/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Http\\Resources\\Json\\JsonResource->__call()\n#2 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php(152): Illuminate\\Http\\Resources\\Json\\JsonResource->forwardCallTo()\n#3 /var/www/api/app/Http/Resources/DomainAvailabilityResource.php(24): Illuminate\\Http\\Resources\\Json\\JsonResource->__call()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php(95): App\\Http\\Resources\\DomainAvailabilityResource->toArray()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceResponse.php(39): Illuminate\\Http\\Resources\\Json\\JsonResource->resolve()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php(231): Illuminate\\Http\\Resources\\Json\\ResourceResponse->toResponse()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(802): Illuminate\\Http\\Resources\\Json\\JsonResource->toResponse()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(789): Illuminate\\Routing\\Router::toResponse()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Router->prepareResponse()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Http\\Middleware\\SetCacheHeaders->handle()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#26 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#28 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#29 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#32 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#34 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#35 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#36 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#37 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#38 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#39 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#46 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#47 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#48 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#49 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#50 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#51 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#52 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#54 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#55 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#56 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#58 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#59 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#60 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#61 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#62 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#63 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#64 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#65 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#66 {main}"
    }
}
 

Request   

GET public/domains/check

Query Parameters

query  string optional  

The domain to check the availability for.

Body Parameters

query  string  

GET public/domains/records

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/records" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"domain\": \"iste\"
}"
const url = new URL(
    "https://api.pph.sh/public/domains/records"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "domain": "iste"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (500):

Show headers
cache-control: max-age=120, must-revalidate, no-cache, no-store, public
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "RuntimeException",
        "url": "https://fsn-01.api.pph.sh/public/domains/records",
        "message": "Unable to find nameserver for iste",
        "trace": "RuntimeException: Unable to find nameserver for iste in /var/www/api/app/Api/Domain/AutoImport/DomainRecordFinder.php:41\nStack trace:\n#0 /var/www/api/app/Api/Domain/AutoImport/DomainRecordFinder.php(22): App\\Api\\Domain\\AutoImport\\DomainRecordFinder::getDefaultNameserver()\n#1 /var/www/api/app/Http/Controllers/DomainInfoApiController.php(318): App\\Api\\Domain\\AutoImport\\DomainRecordFinder::create()\n#2 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\DomainInfoApiController->guessRecords()\n#3 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Http\\Middleware\\SetCacheHeaders->handle()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#26 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#28 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#29 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#31 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#34 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#35 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#36 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#46 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#47 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#48 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#52 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#54 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#55 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#56 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#57 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#58 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#59 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#60 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#61 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#62 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#63 {main}"
    }
}
 

Request   

GET public/domains/records

Body Parameters

domain  string  

nameserver  string optional  

GET public/domains/info/{domainName}

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/info/corporis" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/info/corporis"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: max-age=120, must-revalidate, no-cache, no-store, public
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "ErrorException",
        "url": "https://fsn-01.api.pph.sh/public/domains/info/corporis",
        "message": "fsockopen(): php_network_getaddresses: getaddrinfo for  failed: Name or service not known",
        "trace": "ErrorException: fsockopen(): php_network_getaddresses: getaddrinfo for  failed: Name or service not known in /var/www/api/vendor/purplepixie/phpdns/src/PurplePixie/PhpDns/DNSQuery.php:433\nStack trace:\n#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError()\n#1 /var/www/api/vendor/purplepixie/phpdns/src/PurplePixie/PhpDns/DNSQuery.php(433): fsockopen()\n#2 /var/www/api/app/Http/Controllers/DomainInfoApiController.php(364): PurplePixie\\PhpDns\\DNSQuery->query()\n#3 /var/www/api/app/Http/Controllers/DomainInfoApiController.php(368): App\\Http\\Controllers\\DomainInfoApiController->App\\Http\\Controllers\\{closure}()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\DomainInfoApiController->domainInfo()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Http\\Middleware\\SetCacheHeaders->handle()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#26 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#28 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#29 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#31 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#33 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#34 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#35 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#36 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#37 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#38 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#46 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#47 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#48 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#49 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#50 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#52 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#54 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#55 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#56 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#57 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#59 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#60 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#61 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#62 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#63 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#64 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#65 {main}"
    }
}
 

Request   

GET public/domains/info/{domainName}

URL Parameters

domainName  string  

GET public/domains/internal-pricing/sync

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/internal-pricing/sync" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/internal-pricing/sync"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (403):

Show headers
cache-control: max-age=120, must-revalidate, no-cache, no-store, public
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "*",
        "message": "No internal key was specified",
        "url": "https://fsn-01.api.pph.sh/public/domains/internal-pricing/sync"
    }
}
 

Request   

GET public/domains/internal-pricing/sync

POST public/domains/internal-pricing/set

Example request:
curl --request POST \
    "https://api.pph.sh/public/domains/internal-pricing/set" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/internal-pricing/set"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST public/domains/internal-pricing/set

Endpoints

GET client/hosting/{hosting_id}/ddos

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hosting/52/ddos" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hosting/52/ddos"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [],
    "links": {
        "first": "https://fsn-01.api.pph.sh/client/hosting/43651/ddos?page=1",
        "last": "https://fsn-01.api.pph.sh/client/hosting/43651/ddos?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://fsn-01.api.pph.sh/client/hosting/43651/ddos?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://fsn-01.api.pph.sh/client/hosting/43651/ddos",
        "per_page": 15,
        "to": null,
        "total": 0
    },
    "minutes_sum": 0,
    "ongoing": false
}
 

Request   

GET client/hosting/{hosting_id}/ddos

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

GET client/hostings/{hosting_id}/server/security

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/52/server/security" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/server/security"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": []
}
 

Request   

GET client/hostings/{hosting_id}/server/security

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

POST client/hostings/{hosting_id}/server/security

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/52/server/security" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/server/security"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hosting_id}/server/security

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

GET public/stats/tickets

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/stats/tickets" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/stats/tickets"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "tickets": 223,
        "first": {
            "min": 0.45,
            "max": 3966.4666666666667,
            "average": 26,
            "unit": "minutes"
        },
        "last": {
            "min": 0.45,
            "max": 16891.033333333333,
            "average": 74,
            "unit": "minutes"
        },
        "text": {
            "per_day": "7 Tickets pro Tag",
            "first_answer": "36% in unter 10 Min.",
            "resolve_time": "74 Minuten nach Eröffnung des Tickets",
            "start": "14.03.2024",
            "end": "14.04.2024"
        },
        "date": "2024-04-14 05:01:36",
        "previous": {
            "text": {
                "per_day": "7 Tickets pro Tag",
                "first_answer": "34% in unter 10 Min.",
                "resolve_time": "97 Minuten nach Eröffnung des Tickets",
                "start": "12.02.2024",
                "end": "14.03.2024"
            }
        }
    }
}
 

Request   

GET public/stats/tickets

GET client/hostings/{hostingId}/virtual-server/capture

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/virtual-server/capture" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/virtual-server/capture"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "HttpException",
        "url": "https://fsn-01.api.pph.sh/client/hostings/43651/virtual-server/capture",
        "code": 401,
        "message": "Unauthorized",
        "trace": "Symfony\\Component\\HttpKernel\\Exception\\HttpException: Unauthorized in /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1132\nStack trace:\n#0 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(44): Illuminate\\Foundation\\Application->abort()\n#1 /var/www/api/app/Providers/AuthServiceProvider.php(117): abort()\n#2 /var/www/api/app/Providers/AuthServiceProvider.php(64): App\\Providers\\AuthServiceProvider->abortUnauthorized()\n#3 [internal function]: App\\Providers\\AuthServiceProvider->App\\Providers\\{closure}()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/RequestGuard.php(58): call_user_func()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php(60): Illuminate\\Auth\\RequestGuard->user()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(63): Illuminate\\Auth\\RequestGuard->check()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(42): Illuminate\\Auth\\Middleware\\Authenticate->authenticate()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Auth\\Middleware\\Authenticate->handle()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#26 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#28 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#29 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#34 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#35 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#36 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#48 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#52 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#54 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#55 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#56 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#59 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#60 {main}"
    }
}
 

Request   

GET client/hostings/{hostingId}/virtual-server/capture

URL Parameters

The hosting id  int  

GET public/advertising/faq

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/advertising/faq" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/advertising/faq"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: private
content-type: application/json
access-control-allow-origin: *
 

[]
 

Request   

GET public/advertising/faq

GET public/advertising/web

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/advertising/web" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/advertising/web"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: private
content-type: application/json
access-control-allow-origin: *
 

[]
 

Request   

GET public/advertising/web

GET client/paypal/subscriptions

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/paypal/subscriptions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/paypal/subscriptions"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "HttpException",
        "url": "https://fsn-01.api.pph.sh/client/paypal/subscriptions",
        "code": 401,
        "message": "Unauthorized",
        "trace": "Symfony\\Component\\HttpKernel\\Exception\\HttpException: Unauthorized in /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1132\nStack trace:\n#0 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(44): Illuminate\\Foundation\\Application->abort()\n#1 /var/www/api/app/Providers/AuthServiceProvider.php(117): abort()\n#2 /var/www/api/app/Providers/AuthServiceProvider.php(64): App\\Providers\\AuthServiceProvider->abortUnauthorized()\n#3 [internal function]: App\\Providers\\AuthServiceProvider->App\\Providers\\{closure}()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/RequestGuard.php(58): call_user_func()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php(60): Illuminate\\Auth\\RequestGuard->user()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(63): Illuminate\\Auth\\RequestGuard->check()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(42): Illuminate\\Auth\\Middleware\\Authenticate->authenticate()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Auth\\Middleware\\Authenticate->handle()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#26 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#28 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#29 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#34 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#35 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#36 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#48 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#52 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#54 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#55 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#56 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#59 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#60 {main}"
    }
}
 

Request   

GET client/paypal/subscriptions

GET client/pro

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/pro" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/pro"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "credit": 7.68,
        "status": true,
        "category": "pro_lite",
        "generation": 1,
        "pro": [
            {
                "id": 44180,
                "product_name": "Prepaid Hoster PRO (Gen 1)",
                "product_group": "Prepaid-Hoster PRO",
                "label": "",
                "module": "pphpro",
                "package_id": 304,
                "order_id": 77817,
                "ipaddress": "",
                "description": [],
                "active": true,
                "suspended": false,
                "domain": "54226-41003",
                "status": "Active",
                "billingcycle": "Monthly",
                "has_invoices": true,
                "has_unpaid_invoice": false,
                "created_at": "2023-06-25T22:00:00.000000Z",
                "next_due_date": "2024-10-25T22:00:00.000000Z",
                "next_due_in": 194,
                "next_due_human": "in 6 Mon.",
                "amount": 6.49,
                "firstpaymentamount": 6.49,
                "cancellation": false,
                "management_url": "https://api.pph.sh/client/routes?hosting=44180&tab=main",
                "addons": []
            }
        ],
        "available_packages": [
            "pro",
            "pro_lite"
        ]
    }
}
 

Request   

GET client/pro

POST client/pro/activate

Example request:
curl --request POST \
    "https://api.pph.sh/client/pro/activate" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"pro_variant\": \"velit\",
    \"billingCycle\": \"annually\"
}"
const url = new URL(
    "https://api.pph.sh/client/pro/activate"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "pro_variant": "velit",
    "billingCycle": "annually"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/pro/activate

Body Parameters

pro_variant  string  

billingCycle  string  

Must be one of monthly, quarterly, semiannually, or annually.

GET public/product/{pid}/min-price

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/product/5316/min-price" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/product/5316/min-price"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "min": 0
}
 

Request   

GET public/product/{pid}/min-price

URL Parameters

pid  string  

GET client/hostings/{hosting_id}/auto-update

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/52/auto-update" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/auto-update"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "credit": 7.68,
        "enabled": true,
        "can_be_enabled": true,
        "can_run_now": true,
        "auto_update": {
            "id": 32,
            "hosting_id": 43651,
            "last_started_at": "2024-04-13T20:40:22.000000Z",
            "enabled": true,
            "last_update": "2024-04-13T20:41:16.000000Z",
            "created_at": "2023-05-26T09:07:38.000000Z",
            "updated_at": "2024-04-13T20:41:16.000000Z"
        },
        "last_performed_update": {
            "date": "07.04.2024 14:41",
            "updates": 82
        },
        "last_check": "13.04.2024 22:40"
    }
}
 

Request   

GET client/hostings/{hosting_id}/auto-update

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

POST client/hostings/{hosting_id}/auto-update/activate

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/52/auto-update/activate" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/auto-update/activate"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hosting_id}/auto-update/activate

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

POST client/hostings/{hosting_id}/auto-update/deactivate

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/52/auto-update/deactivate" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/auto-update/deactivate"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hosting_id}/auto-update/deactivate

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

POST client/hostings/{hosting_id}/auto-update/run

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/52/auto-update/run" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/auto-update/run"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hosting_id}/auto-update/run

URL Parameters

hosting_id  integer  

The ID of the hosting.

The hosting id  int  

POST public/contact/cancellation

Example request:
curl --request POST \
    "https://api.pph.sh/public/contact/cancellation" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"firstname\": \"corrupti\",
    \"lastname\": \"qui\",
    \"email\": \"rgreenfelder@example.org\",
    \"client_number\": \"sapiente\",
    \"order_number\": \"quam\",
    \"cancellation_time\": \"end_of_billingperiod\"
}"
const url = new URL(
    "https://api.pph.sh/public/contact/cancellation"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "firstname": "corrupti",
    "lastname": "qui",
    "email": "rgreenfelder@example.org",
    "client_number": "sapiente",
    "order_number": "quam",
    "cancellation_time": "end_of_billingperiod"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST public/contact/cancellation

Body Parameters

firstname  string  

lastname  string  

email  string  

value muss eine gültige E-Mail-Adresse sein.

client_number  string  

order_number  string  

cancellation_time  string  

Must be one of immediate or end_of_billingperiod.

GET public/contact/channel/{channel}

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/contact/channel/autem" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/contact/channel/autem"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

[]
 

Request   

GET public/contact/channel/{channel}

URL Parameters

channel  string  

The channel.

GET public/virtualizor/backup/servers

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/virtualizor/backup/servers" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/virtualizor/backup/servers"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "bsid": 8,
            "country": "FIN"
        },
        {
            "bsid": 9,
            "country": "DE",
            "default": true
        }
    ]
}
 

Request   

GET public/virtualizor/backup/servers

GET public/now

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/now" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/now"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "now": "2024-04-14T03:00:28.597394Z",
    "format": "2024-04-14 05:00:28"
}
 

Request   

GET public/now

GET public/products/gameservers/resources

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/gameservers/resources" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/gameservers/resources"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "hostname": "virt-host121.kramer-hosting.de",
            "live": {
                "cpu": 16.54,
                "vps": 11
            },
            "cores": {
                "used": 30,
                "max": 32,
                "available": 2,
                "percentage": 94
            },
            "memory": {
                "used": 120,
                "max": 128,
                "available": 8,
                "percentage": 94
            },
            "date": "14.04.2024 04:59:51"
        }
    ]
}
 

Request   

GET public/products/gameservers/resources

GET public/products/gameservers/comparison

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/gameservers/comparison" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/gameservers/comparison"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "1": "1 => 2",
    "2": "2 => 4",
    "3": "3 => 6",
    "4": "4 => 8",
    "5": "5 => 10",
    "6": "6 => 11",
    "7": "7 => 13",
    "8": "8 => 15"
}
 

Request   

GET public/products/gameservers/comparison

Get the mode of the cloud manager configuration for a hosting.

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/mode" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/mode"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "HttpException",
        "url": "https://fsn-01.api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/mode",
        "code": 401,
        "message": "Unauthorized",
        "trace": "Symfony\\Component\\HttpKernel\\Exception\\HttpException: Unauthorized in /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1132\nStack trace:\n#0 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(44): Illuminate\\Foundation\\Application->abort()\n#1 /var/www/api/app/Providers/AuthServiceProvider.php(117): abort()\n#2 /var/www/api/app/Providers/AuthServiceProvider.php(64): App\\Providers\\AuthServiceProvider->abortUnauthorized()\n#3 [internal function]: App\\Providers\\AuthServiceProvider->App\\Providers\\{closure}()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/RequestGuard.php(58): call_user_func()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php(60): Illuminate\\Auth\\RequestGuard->user()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(63): Illuminate\\Auth\\RequestGuard->check()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(42): Illuminate\\Auth\\Middleware\\Authenticate->authenticate()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Auth\\Middleware\\Authenticate->handle()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#26 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#28 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#29 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#34 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#35 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#36 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#48 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#52 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#54 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#55 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#56 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#59 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#60 {main}"
    }
}
 

Request   

GET client/hostings/{hostingId}/virtual-server/cloud-manager/mode

URL Parameters

The hosting id  int  

Set the mode of the cloud manager configuration for a hosting.

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/mode" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/mode"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hostingId}/virtual-server/cloud-manager/mode

URL Parameters

The hosting id  int  

POST client/hostings/{hostingId}/virtual-server/cloud-manager/auto

Example request:
curl --request POST \
    "https://api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/auto" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/43651/virtual-server/cloud-manager/auto"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/hostings/{hostingId}/virtual-server/cloud-manager/auto

URL Parameters

The hosting id  int  

GET public/game-root/live.json

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/game-root/live.json" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/game-root/live.json"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "live": {
            "game-root01": [
                {
                    "name": "Game Root 2 mit RAM Upgrade",
                    "cores": 4,
                    "memory": 16,
                    "disk": 100
                },
                {
                    "name": "Game Root 2 ",
                    "cores": 4,
                    "memory": 8,
                    "disk": 100
                }
            ],
            "game-root02": [
                {
                    "name": "Game Root 3",
                    "cores": 8,
                    "memory": 16,
                    "disk": 200
                },
                {
                    "name": "Game Root 1 mit RAM Upgrade",
                    "cores": 2,
                    "memory": 8,
                    "disk": 50
                },
                {
                    "name": "Game Root 2 mit RAM Upgrade",
                    "cores": 4,
                    "memory": 16,
                    "disk": 100
                },
                {
                    "name": "Game Root 2 mit RAM Upgrade",
                    "cores": 4,
                    "memory": 16,
                    "disk": 100
                },
                {
                    "name": "Game Root 1",
                    "cores": 2,
                    "memory": 4,
                    "disk": 25
                },
                {
                    "name": "Game Root 2 ",
                    "cores": 4,
                    "memory": 8,
                    "disk": 100
                },
                {
                    "name": "Game Root 3",
                    "cores": 8,
                    "memory": 16,
                    "disk": 200
                }
            ]
        },
        "max": {
            "name": "",
            "cores": 32,
            "memory": 128,
            "disk": 1600
        },
        "percentages": {
            "game-root01": [
                {
                    "cores": 12.5,
                    "memory": 12.5,
                    "disk": 6.25
                },
                {
                    "cores": 12.5,
                    "memory": 6.25,
                    "disk": 6.25
                }
            ],
            "game-root02": [
                {
                    "cores": 25,
                    "memory": 12.5,
                    "disk": 12.5
                },
                {
                    "cores": 6.25,
                    "memory": 6.25,
                    "disk": 3.125
                },
                {
                    "cores": 12.5,
                    "memory": 12.5,
                    "disk": 6.25
                },
                {
                    "cores": 12.5,
                    "memory": 12.5,
                    "disk": 6.25
                },
                {
                    "cores": 6.25,
                    "memory": 3.125,
                    "disk": 1.5625
                },
                {
                    "cores": 12.5,
                    "memory": 6.25,
                    "disk": 6.25
                },
                {
                    "cores": 25,
                    "memory": 12.5,
                    "disk": 12.5
                }
            ]
        },
        "sums": {
            "game-root01": {
                "cores": 8,
                "memory": 24,
                "disk": 200
            },
            "game-root02": {
                "cores": 32,
                "memory": 84,
                "disk": 775
            }
        },
        "servers": [
            "game-root01",
            "game-root02"
        ]
    }
}
 

Request   

GET public/game-root/live.json

GET public/lets-encrypt/verify

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/lets-encrypt/verify" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/lets-encrypt/verify"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: must-revalidate, no-cache, no-store, private
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "TypeError",
        "errors": "App\\Api\\Support\\Virtualizor\\VirtualServer\\CertbotCertificateInstaller::__construct(): Argument #1 ($hosting) must be of type DeZio\\WHMCS\\Models\\Hosting, null given, called in /var/www/api/app/Api/Support/Virtualizor/Controller/LetsEncryptController.php on line 22",
        "exception": true,
        "url": "https://fsn-01.api.pph.sh/public/lets-encrypt/verify",
        "message": "App\\Api\\Support\\Virtualizor\\VirtualServer\\CertbotCertificateInstaller::__construct(): Argument #1 ($hosting) must be of type DeZio\\WHMCS\\Models\\Hosting, null given, called in /var/www/api/app/Api/Support/Virtualizor/Controller/LetsEncryptController.php on line 22",
        "trace": "TypeError: App\\Api\\Support\\Virtualizor\\VirtualServer\\CertbotCertificateInstaller::__construct(): Argument #1 ($hosting) must be of type DeZio\\WHMCS\\Models\\Hosting, null given, called in /var/www/api/app/Api/Support/Virtualizor/Controller/LetsEncryptController.php on line 22 and defined in /var/www/api/app/Api/Support/Virtualizor/VirtualServer/CertbotCertificateInstaller.php:10\nStack trace:\n#0 /var/www/api/app/Api/Support/Virtualizor/Controller/LetsEncryptController.php(22): App\\Api\\Support\\Virtualizor\\VirtualServer\\CertbotCertificateInstaller->__construct()\n#1 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(48): App\\Api\\Support\\Virtualizor\\Controller\\LetsEncryptController->createAcmeChallenge()\n#2 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()\n#3 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#25 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#26 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#27 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#28 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#29 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#33 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#34 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#35 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#36 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#45 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#48 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#51 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#52 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#53 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#54 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#55 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#56 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#58 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#59 {main}"
    }
}
 

Request   

GET public/lets-encrypt/verify

GET public/managed-server/prepare/{vpsid}

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/managed-server/prepare/qui" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/managed-server/prepare/qui"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "No query results for model [DeZio\\WHMCS\\Models\\Hosting]."
}
 

Request   

GET public/managed-server/prepare/{vpsid}

URL Parameters

vpsid  string  

POST client/paypal/subscription

Example request:
curl --request POST \
    "https://api.pph.sh/client/paypal/subscription" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"amount\": 215,
    \"day\": 21,
    \"recurring_times\": 12,
    \"auto_pay_invoices\": false,
    \"return_url\": \"http:\\/\\/www.dietrich.com\\/\",
    \"cancel_url\": \"http:\\/\\/rempel.com\\/\"
}"
const url = new URL(
    "https://api.pph.sh/client/paypal/subscription"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "amount": 215,
    "day": 21,
    "recurring_times": 12,
    "auto_pay_invoices": false,
    "return_url": "http:\/\/www.dietrich.com\/",
    "cancel_url": "http:\/\/rempel.com\/"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/paypal/subscription

Body Parameters

amount  number  

value muss mindestens 5 sein. value darf maximal 250 sein.

day  number optional  

value muss mindestens 1 sein. value darf maximal 31 sein.

recurring_times  number optional  

value muss mindestens 0 sein. value darf maximal 24 sein.

auto_pay_invoices  boolean optional  

return_url  string  

Must be a valid URL.

cancel_url  string  

Must be a valid URL.

POST client/paypal/subscription/{token}/cancel

Example request:
curl --request POST \
    "https://api.pph.sh/client/paypal/subscription/nihil/cancel" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/paypal/subscription/nihil/cancel"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/paypal/subscription/{token}/cancel

URL Parameters

token  string  

GET public/comparison/table.json

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/comparison/table.json" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/comparison/table.json"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "headings": {
        "linuxkvm": "Linux Root Server",
        "windowskvm": "Windows Root Server",
        "openvz": "Linux vServer",
        "ryzen": "Linux Ryzen Server"
    },
    "rows": {
        "res": {
            "category": "Ressourcenvergabe",
            "cells": {
                "linuxkvm": {
                    "value": "Teilweise geteilte Ressourcen",
                    "type": "text"
                },
                "windowskvm": {
                    "value": "Teilweise geteilte Ressourcen",
                    "type": "text"
                },
                "openvz": {
                    "value": "Geteilte Ressourcen",
                    "type": "text"
                },
                "ryzen": {
                    "value": "Aufgeteilt, exklusiv",
                    "type": "text"
                }
            }
        },
        "virt": {
            "category": "Virtualisierung",
            "cells": {
                "linuxkvm": {
                    "value": "KVM Virtuozzo",
                    "type": "text"
                },
                "windowskvm": {
                    "value": "KVM Virtuozzo",
                    "type": "text"
                },
                "openvz": {
                    "value": "OpenVZ 7 Virtuozzo",
                    "type": "text"
                },
                "ryzen": {
                    "value": "KVM Virtuozzo",
                    "type": "text"
                }
            }
        },
        "webinterface": {
            "category": "Webinterface",
            "cells": {
                "linuxkvm": {
                    "value": "true",
                    "type": "checkbox"
                },
                "windowskvm": {
                    "value": "true",
                    "type": "checkbox"
                },
                "openvz": {
                    "value": "true",
                    "type": "checkbox"
                },
                "ryzen": {
                    "value": "true",
                    "type": "checkbox"
                }
            }
        },
        "ssh": {
            "category": "SSH",
            "cells": {
                "linuxkvm": {
                    "value": "true",
                    "type": "checkbox"
                },
                "windowskvm": {
                    "value": "false",
                    "type": "checkbox"
                },
                "openvz": {
                    "value": "true",
                    "type": "checkbox"
                },
                "ryzen": {
                    "value": "true",
                    "type": "checkbox"
                }
            }
        },
        "rdp": {
            "category": "RDP",
            "cells": {
                "linuxkvm": {
                    "value": "false",
                    "type": "checkbox"
                },
                "windowskvm": {
                    "value": "true",
                    "type": "checkbox"
                },
                "openvz": {
                    "value": "false",
                    "type": "checkbox"
                },
                "ryzen": {
                    "value": "false",
                    "type": "checkbox"
                }
            }
        },
        "backups": {
            "category": "Backups",
            "cells": {
                "linuxkvm": {
                    "value": "5x inklusive",
                    "type": "text"
                },
                "windowskvm": {
                    "value": "5x inklusive",
                    "type": "text"
                },
                "openvz": {
                    "value": "5x inklusive",
                    "type": "text"
                },
                "ryzen": {
                    "value": "5x inklusive",
                    "type": "text"
                }
            }
        },
        "snapshots": {
            "category": "Snapshots",
            "cells": {
                "linuxkvm": {
                    "value": "1x inklusive",
                    "type": "text"
                },
                "windowskvm": {
                    "value": "1x inklusive",
                    "type": "text"
                },
                "openvz": {
                    "value": "false",
                    "type": "checkbox"
                },
                "ryzen": {
                    "value": "1x inklusive",
                    "type": "text"
                }
            }
        },
        "linuxgsm": {
            "category": "Gameserver Manager",
            "cells": {
                "linuxkvm": {
                    "value": "true",
                    "type": "checkbox"
                },
                "windowskvm": {
                    "value": "false",
                    "type": "checkbox"
                },
                "openvz": {
                    "value": "true",
                    "type": "checkbox"
                },
                "ryzen": {
                    "value": "true",
                    "type": "checkbox"
                }
            }
        }
    }
}
 

Request   

GET public/comparison/table.json

GET public/advertising/vcp

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/advertising/vcp" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/advertising/vcp"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: private
content-type: application/json
access-control-allow-origin: *
 

[]
 

Request   

GET public/advertising/vcp

GET client/pro/generations

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/pro/generations" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/pro/generations"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
content-type: text/html; charset=UTF-8
cache-control: no-cache, private
access-control-allow-origin: *
 


 

Request   

GET client/pro/generations

Retrieves the configuration options.

This method returns a JSON resource representing the configuration options. The configuration options are obtained from the server finder and converted to an array before being returned as a JSON resource.

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/server-finder" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/server-finder"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "branches": [
            {
                "id": "opener",
                "question": "In welchem Bereich möchtest Du deinen Server einsetzen?",
                "isMultiSelect": false,
                "selections": [
                    {
                        "label": "Privat",
                        "value": "privat",
                        "hint": null,
                        "goto": "bedarf",
                        "meta": {
                            "icon": "fas fa-user",
                            "not": [
                                "managed"
                            ],
                            "description": "Für mich oder meine Freunde"
                        }
                    },
                    {
                        "label": "Geschäftlich",
                        "value": "geschaeftlich",
                        "hint": null,
                        "goto": "verwaltung",
                        "meta": {
                            "icon": "fas fa-briefcase",
                            "not": [
                                "openvz",
                                "game-root"
                            ],
                            "boost": [
                                "managed",
                                "dedicated"
                            ],
                            "description": "Für ein Unternehmen"
                        }
                    },
                    {
                        "label": "Beides (Privat/Geschäftlich)",
                        "value": "beides",
                        "hint": null,
                        "goto": "bedarf",
                        "meta": {
                            "icon": "fas fa-people-roof",
                            "description": "Privat, wie auch geschäftlich"
                        }
                    },
                    {
                        "label": "Sonstiges",
                        "value": "sonstiges",
                        "hint": null,
                        "goto": "bedarf",
                        "meta": {
                            "icon": "fas fa-ellipsis-h",
                            "not": [
                                "managed"
                            ],
                            "description": "Für etwas anderes"
                        }
                    }
                ]
            },
            {
                "id": "verwaltung",
                "question": "Wie möchtest du deinen Server verwalten?",
                "isMultiSelect": false,
                "selections": [
                    {
                        "label": "Selbst verwalten",
                        "value": "self",
                        "hint": null,
                        "goto": "bedarf",
                        "meta": {
                            "icon": "fa-tools",
                            "description": "Volle Kontrolle, evtl. technisches Fachwissen erforderlich",
                            "not": [
                                "managed"
                            ]
                        }
                    },
                    {
                        "label": "Managed",
                        "value": "managed",
                        "hint": null,
                        "goto": "bedarf",
                        "meta": {
                            "icon": "fa-user-shield",
                            "description": "Wartung und Überwachung durch den Dienstanbieter",
                            "boost": [
                                "managed",
                                "managed",
                                "managed",
                                "managed"
                            ]
                        }
                    }
                ]
            },
            {
                "id": "bedarf",
                "question": "Was möchtest du mit deinem Server am ehesten machen?",
                "isMultiSelect": true,
                "selections": [
                    {
                        "label": "Webseiten",
                        "value": "webseiten",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. HTML, Wordpress, Joomla, etc.",
                            "group": "web",
                            "min_cores": 2,
                            "icon": "fa-globe",
                            "not": [
                                "kvm-windows"
                            ]
                        }
                    },
                    {
                        "label": "Online Shop",
                        "value": "online-shop",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. Magento, Shopware, etc.",
                            "group": "web",
                            "min_cores": 2,
                            "icon": "fa-shopping-cart",
                            "not": [
                                "kvm-windows"
                            ]
                        }
                    },
                    {
                        "label": "Livechat",
                        "value": "livechat",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. Livezilla, etc.",
                            "group": "web",
                            "icon": "fa-comments",
                            "not": [
                                "kvm-windows"
                            ]
                        }
                    },
                    {
                        "label": "Teamspeak 3",
                        "value": "teamspeak-3",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Gaming-Clans, etc.",
                            "not": [
                                "managed"
                            ],
                            "icon": "fa-microphone",
                            "group": "game-server-und-services"
                        }
                    },
                    {
                        "label": "Minecraft",
                        "value": "minecraft",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Vanilla, Spigot, Modpacks, etc.",
                            "not": [
                                "openvz",
                                "kvm-windows",
                                "managed"
                            ],
                            "icon": "fa-cube",
                            "boost": [
                                "game-root",
                                "dedicated"
                            ],
                            "group": "game-server-und-services",
                            "min_cores": 4,
                            "min_ram": 8,
                            "min_space": 100,
                            "grow": {
                                "cores": 2,
                                "ram": 2,
                                "space": 50
                            }
                        }
                    },
                    {
                        "label": "Gameserver",
                        "value": "gameserver",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Steam-Games, Five-M, etc.",
                            "not": [
                                "openvz"
                            ],
                            "boost": [
                                "game-root"
                            ],
                            "icon": "fa-gamepad",
                            "group": "game-server-und-services",
                            "min_cores": 4,
                            "min_ram": 8,
                            "min_space": 50,
                            "grow": {
                                "cores": 2,
                                "ram": 2,
                                "space": 50
                            }
                        }
                    },
                    {
                        "label": "NodeJS",
                        "value": "nodejs",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. Discord-Bot, etc.",
                            "group": "datenbanken-versionierung",
                            "icon": "fa-code"
                        }
                    },
                    {
                        "label": "Bot-Hosting",
                        "value": "bots",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. Sinusbot, TS3MusicBot. etc.",
                            "group": "datenbanken-versionierung",
                            "icon": "fa-robot"
                        }
                    },
                    {
                        "label": "Datenbanken",
                        "value": "datenbanken",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für MySQL, MongoDB etc.",
                            "not": [],
                            "boost": [
                                "kvm-linux"
                            ],
                            "icon": "fa-database",
                            "min_cores": 2,
                            "group": "datenbanken-versionierung"
                        }
                    },
                    {
                        "label": "Versionierung",
                        "value": "gitlab_dev",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "GitLab, SVN, etc.",
                            "not": [
                                "openvz",
                                "kvm-windows",
                                "game-root"
                            ],
                            "icon": "fab fa-git",
                            "boost": [
                                "kvm-linux"
                            ],
                            "group": "datenbanken-versionierung",
                            "min_cores": 4,
                            "min_ram": 4
                        }
                    },
                    {
                        "label": "Docker",
                        "value": "docker",
                        "hint": "Funktioniert nicht auf OpenVZ",
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für CI/CD, Mailcow, etc.",
                            "not": [
                                "openvz"
                            ],
                            "boost": [
                                "kvm-linux"
                            ],
                            "icon": "fab fa-docker",
                            "group": "server-verwaltung",
                            "min_cores": 4,
                            "min_ram": 8
                        }
                    },
                    {
                        "label": "Plesk",
                        "value": "plesk",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Webseiten, etc.",
                            "not": [
                                "openvz",
                                "game-root",
                                "kvm-windows"
                            ],
                            "boost": [
                                "kvm-linux"
                            ],
                            "icon": "fa-server",
                            "min_cores": 4,
                            "min_ram": 8,
                            "min_space": 50,
                            "group": "server-verwaltung"
                        }
                    },
                    {
                        "label": "Mail-Server",
                        "value": "mailserver",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. über Plesk, Mailcow, etc.",
                            "min_cores": 2,
                            "min_ram": 4,
                            "not": [
                                "openvz",
                                "kvm-windows"
                            ],
                            "boost": [
                                "kvm-linux"
                            ],
                            "icon": "fa-envelope",
                            "group": "server-verwaltung"
                        }
                    },
                    {
                        "label": "Private VPN",
                        "value": "vpn",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. zur Verschleierung der IP, etc.",
                            "not": [
                                "openvz",
                                "game-root"
                            ],
                            "boost": [
                                "kvm-linux"
                            ],
                            "icon": "fa-shield-alt",
                            "min_cores": 2,
                            "group": "cloud-und-storage-services"
                        }
                    },
                    {
                        "label": "Nextcloud",
                        "value": "nextcloud",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Dateiablage, etc.",
                            "min_space": 100,
                            "group": "server-verwaltung",
                            "icon": "fa-cloud",
                            "boost": [
                                "kvm-linux",
                                "dedicated"
                            ]
                        }
                    },
                    {
                        "label": "cPanel",
                        "value": "cpanel",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Webseiten, etc.",
                            "group": "server-verwaltung",
                            "icon": "fas fa-sliders-h"
                        }
                    },
                    {
                        "label": "Keyhelp",
                        "value": "keyhelp",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Webseiten, etc.",
                            "not": [
                                "openvz",
                                "kvm-windows",
                                "game-root"
                            ],
                            "group": "server-verwaltung",
                            "icon": "fa-key"
                        }
                    },
                    {
                        "label": "Filehosting",
                        "value": "filehosting",
                        "hint": "Benötigt viel Speicherplatz",
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Backups, etc.",
                            "min_space": 100,
                            "group": "cloud-und-storage-services",
                            "icon": "fa-folder",
                            "not": [
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "Arbeitsplatz in der Cloud",
                        "value": "rdp",
                        "hint": "Muss kvm-windows sein",
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für Office, etc.",
                            "not": [
                                "openvz",
                                "kvm-linux",
                                "game-root",
                                "managed"
                            ],
                            "icon": "fa-desktop",
                            "boost": [
                                "kvm-windows"
                            ],
                            "min_cores": 2
                        }
                    },
                    {
                        "label": "Multi-User auf Windows Server",
                        "value": "rdp_multiuser",
                        "hint": "Muss kvm-windows sein",
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für mehrere Mitarbeiter, etc.",
                            "not": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ],
                            "boost": [
                                "kvm-windows"
                            ],
                            "icon": "fa-users",
                            "min_cores": 4,
                            "min_ram": 4
                        }
                    },
                    {
                        "label": "Desktop Apps",
                        "value": "desktop-apps",
                        "hint": "Muss kvm-windows sein",
                        "goto": "zugriffe",
                        "meta": {
                            "icon": "fa-desktop",
                            "description": "z.B. Browser, etc.",
                            "boost": [
                                "kvm-windows"
                            ],
                            "not": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "Abrechnungssoftware",
                        "value": "abrechnungssoftware",
                        "hint": "Muss kvm-windows sein",
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. Lexware, etc.",
                            "boost": [
                                "kvm-windows"
                            ],
                            "icon": "fa-file-invoice-dollar",
                            "not": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ],
                            "min_cores": 4
                        }
                    },
                    {
                        "label": "Desktop CRM",
                        "value": "desktop-crm",
                        "hint": null,
                        "goto": "zugriffe",
                        "meta": {
                            "icon": "fa-handshake",
                            "description": "z.B. für Kundenverwaltung, etc.",
                            "boost": [
                                "kvm-windows"
                            ],
                            "not": [
                                "openvz",
                                "game-root",
                                "managed"
                            ],
                            "min_cores": 4
                        }
                    },
                    {
                        "label": "Börsensoftware",
                        "value": "boersensoftware",
                        "hint": "Benötigt meistens Windows",
                        "goto": "zugriffe",
                        "meta": {
                            "description": "z.B. für MetaRadar, etc.",
                            "icon": "fa-chart-line",
                            "boost": [
                                "kvm-windows"
                            ],
                            "not": [
                                "openvz",
                                "managed"
                            ],
                            "min_cores": 4
                        }
                    }
                ]
            },
            {
                "id": "zugriffe",
                "question": "Wie viele Zugriffe erwartest du auf deinem Server?",
                "isMultiSelect": false,
                "selections": [
                    {
                        "label": "Nur für mich",
                        "value": "only_me",
                        "hint": null,
                        "goto": "betriebssystem",
                        "meta": {
                            "icon": "fas fa-user",
                            "description": "z.B. für einen privaten Mailserver, etc."
                        }
                    },
                    {
                        "label": "Wenig",
                        "value": "low",
                        "hint": null,
                        "goto": "betriebssystem",
                        "meta": {
                            "icon": "fas fa-user-friends",
                            "description": "z.B. für ein kleines Vorhaben, etc."
                        }
                    },
                    {
                        "label": "Mittel",
                        "value": "middle",
                        "hint": null,
                        "goto": "betriebssystem",
                        "meta": {
                            "icon": "fas fa-users",
                            "more_cores": 2,
                            "more_ram": 4,
                            "description": "z.B. für mehr als ein kleines Vorhaben, etc."
                        }
                    },
                    {
                        "label": "Viel",
                        "value": "high",
                        "hint": null,
                        "goto": "betriebssystem",
                        "meta": {
                            "icon": "fas fa-globe-europe",
                            "not": [
                                "openvz"
                            ],
                            "boost": [
                                "game-root",
                                "kvm-linux",
                                "managed"
                            ],
                            "description": "z.B. Vorhaben für viele Benutzer",
                            "more_cores": 4,
                            "more_ram": 8
                        }
                    }
                ]
            },
            {
                "id": "betriebssystem",
                "question": "Welches Betriebssystem benötigst Du für dein Vorhaben?",
                "isMultiSelect": false,
                "selections": [
                    {
                        "label": "Linux",
                        "value": "linux",
                        "hint": null,
                        "goto": "budget",
                        "meta": {
                            "icon": "fab fa-linux",
                            "description": "Verwaltung über SSH",
                            "not": [
                                "kvm-windows"
                            ],
                            "boost": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "Debian",
                        "value": "debian",
                        "hint": null,
                        "goto": "budget",
                        "meta": {
                            "icon": "fab fa-linux",
                            "description": "Verwaltung über SSH",
                            "not": [
                                "kvm-windows"
                            ],
                            "boost": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "Ubuntu",
                        "value": "ubuntu",
                        "hint": null,
                        "goto": "budget",
                        "meta": {
                            "icon": "fab fa-linux",
                            "description": "Verwaltung über SSH",
                            "not": [
                                "kvm-windows"
                            ],
                            "boost": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "CentOS",
                        "value": "centos",
                        "hint": null,
                        "goto": "budget",
                        "meta": {
                            "icon": "fab fa-linux",
                            "description": "Verwaltung über SSH",
                            "not": [
                                "kvm-windows"
                            ],
                            "boost": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "Windows",
                        "value": "windows",
                        "hint": "Also kein Linux",
                        "goto": "budget",
                        "meta": {
                            "icon": "fab fa-windows",
                            "description": "Verwaltung über RDP",
                            "not": [
                                "openvz",
                                "kvm-linux",
                                "game-root"
                            ],
                            "boost": [
                                "kvm-windows",
                                "dedicated"
                            ]
                        }
                    },
                    {
                        "label": "Egal",
                        "value": "undefined",
                        "hint": null,
                        "goto": "budget",
                        "meta": {
                            "icon": "fas fa-question",
                            "description": "Egal, Hauptsache es läuft",
                            "boost": [
                                "kvm-linux",
                                "game-root"
                            ]
                        }
                    }
                ]
            },
            {
                "id": "budget",
                "question": "Wie hoch ist dein Budget?",
                "isMultiSelect": false,
                "selections": [
                    {
                        "label": "Niedrig",
                        "value": "niedrig",
                        "hint": null,
                        "goto": "ANALYSIS",
                        "meta": {
                            "icon": "fa-wallet",
                            "description": "Beschränkte Finanzmittel",
                            "boost": [
                                "openvz"
                            ],
                            "not": [
                                "managed",
                                "dedicated",
                                "game-root"
                            ]
                        }
                    },
                    {
                        "label": "Preis/Leistung",
                        "value": "preis-leistung",
                        "hint": "Nicht das günstigste, nicht das teuerste",
                        "goto": "ANALYSIS",
                        "meta": {
                            "icon": "fa-balance-scale",
                            "description": "Gutes Preis/Leistungsverhältnis",
                            "not": [
                                "dedicated"
                            ],
                            "boost": [
                                "game-root",
                                "kvm-linux",
                                "kvm-windows"
                            ]
                        }
                    },
                    {
                        "label": "Maximale Performance",
                        "value": "maximale-performance",
                        "hint": "Geld spielt keine Rolle",
                        "goto": "ANALYSIS",
                        "meta": {
                            "icon": "fa-rocket",
                            "description": "Höchste Leistung, höhere Kosten",
                            "not": [
                                "openvz"
                            ],
                            "boost": [
                                "game-root",
                                "kvm-linux",
                                "kvm-windows",
                                "dedicated",
                                "managed"
                            ]
                        }
                    }
                ]
            }
        ]
    }
}
 

Request   

GET public/server-finder

Process the given results and retrieve the final result.

Example request:
curl --request POST \
    "https://api.pph.sh/public/server-finder" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/server-finder"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST public/server-finder

POST public/server-finder/event

Example request:
curl --request POST \
    "https://api.pph.sh/public/server-finder/event" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/server-finder/event"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST public/server-finder/event

GET client/config

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/config" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/config"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "send_login_alerts": true,
        "session_timeout": 360,
        "nav_style": "servers",
        "enable-actions-v2": true,
        "discord_support_code": "X5NSD0",
        "enable-iso-installer": true
    }
}
 

Request   

GET client/config

POST client/config

Example request:
curl --request POST \
    "https://api.pph.sh/client/config" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"config_key\": \"sapiente\"
}"
const url = new URL(
    "https://api.pph.sh/client/config"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "config_key": "sapiente"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/config

Body Parameters

config_key  string  

config_value  string optional  

GET client/logins

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/logins" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/logins"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "description": "Logged in to VionityCP (https://dev.vionity.de)",
            "ip": "90.187.140.xxx",
            "date": "2024-04-14T02:15:09.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://dev.vionity.de)",
            "ip": "91.39.108.xxx",
            "date": "2024-04-14T02:08:07.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.108.xxx",
            "date": "2024-04-10T22:26:18.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.108.xxx",
            "date": "2024-04-07T11:51:13.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.108.xxx",
            "date": "2024-04-06T08:17:27.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://dev.vionity.de)",
            "ip": "90.187.140.xxx",
            "date": "2024-04-05T06:30:59.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "2a00:6020:a282:e200:c578:4334:b209:xxx",
            "date": "2024-04-03T22:43:36.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "2a00:6020:a282:e200:41e1:f153:6648:xxx",
            "date": "2024-04-02T19:45:40.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.102.xxx",
            "date": "2024-03-24T17:41:59.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.102.xxx",
            "date": "2024-03-22T10:37:20.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://instance04.vionity.de)",
            "ip": "91.39.102.xxx",
            "date": "2024-03-19T22:54:38.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.102.xxx",
            "date": "2024-03-19T13:15:01.000000Z"
        },
        {
            "description": "Logged in to VionityCP (https://www.vionity.de)",
            "ip": "91.39.102.xxx",
            "date": "2024-03-15T20:30:52.000000Z"
        }
    ]
}
 

Request   

GET client/logins

GET client/donation/config

requires authentication

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/donation/config" \
    --header "X-Token: {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/donation/config"
);

const headers = {
    "X-Token": "{YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "uuid": "b90e484d-6641-49c4-9c79-16ba774d3c92",
        "url": "https://spenden.pp-h.eu/b90e484d-6641-49c4-9c79-16ba774d3c92",
        "display_name": null
    }
}
 

Request   

GET client/donation/config

GET public/stats/testservers

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/stats/testservers" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/stats/testservers"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

{
    "data": {
        "from": "2024-03-08",
        "to": "2024-04-07",
        "count": 92,
        "count_per_day": 3.1,
        "conversions": 8,
        "conversion_rate": 8.7
    }
}
 

Request   

GET public/stats/testservers

GET public/stats/general

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/stats/general" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/stats/general"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: max-age=120, public
content-type: application/json
access-control-allow-origin: *
 

{
    "hostings": 2041,
    "domains": 1589,
    "clients": 1513
}
 

Request   

GET public/stats/general

GET public/domains/alternatives

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/domains/alternatives" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/domains/alternatives"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (500):

Show headers
cache-control: max-age=120, must-revalidate, no-cache, no-store, public
content-type: application/json
x-error: 1
access-control-allow-origin: *
 

{
    "data": {
        "error": true,
        "type": "TypeError",
        "errors": "App\\Api\\OpenAI\\DomainAlternatives::__construct(): Argument #1 ($domain) must be of type string, null given, called in /var/www/api/app/Api/public.php on line 246",
        "exception": true,
        "url": "https://fsn-01.api.pph.sh/public/domains/alternatives",
        "message": "App\\Api\\OpenAI\\DomainAlternatives::__construct(): Argument #1 ($domain) must be of type string, null given, called in /var/www/api/app/Api/public.php on line 246",
        "trace": "TypeError: App\\Api\\OpenAI\\DomainAlternatives::__construct(): Argument #1 ($domain) must be of type string, null given, called in /var/www/api/app/Api/public.php on line 246 and defined in /var/www/api/app/Api/OpenAI/DomainAlternatives.php:14\nStack trace:\n#0 /var/www/api/app/Api/public.php(246): App\\Api\\OpenAI\\DomainAlternatives->__construct()\n#1 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(238): Illuminate\\Routing\\RouteFileRegistrar->{closure}()\n#2 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(208): Illuminate\\Routing\\Route->runCallable()\n#3 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()\n#4 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()\n#5 /var/www/api/vendor/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#6 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Http\\Middleware\\SetCacheHeaders->handle()\n#7 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#8 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()\n#9 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#10 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()\n#11 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()\n#12 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()\n#13 /var/www/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()\n#14 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()\n#15 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()\n#16 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#17 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#18 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()\n#19 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#20 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()\n#21 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()\n#22 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#23 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()\n#24 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#25 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()\n#26 /var/www/api/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#27 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()\n#28 /var/www/api/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#29 /var/www/api/app/Http/Middleware/TrustProxies.php(25): Fideloper\\Proxy\\TrustProxies->handle()\n#30 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\TrustProxies->handle()\n#31 /var/www/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()\n#32 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()\n#33 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()\n#34 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(299): Illuminate\\Foundation\\Http\\Kernel->handle()\n#35 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(287): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->callLaravelOrLumenRoute()\n#36 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(89): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeApiCall()\n#37 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(45): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCall()\n#38 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php(35): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->makeResponseCallIfConditionsPass()\n#39 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(222): Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls->__invoke()\n#40 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(179): Knuckles\\Scribe\\Extracting\\Extractor->iterateThroughStrategies()\n#41 /var/www/api/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php(116): Knuckles\\Scribe\\Extracting\\Extractor->fetchResponses()\n#42 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(123): Knuckles\\Scribe\\Extracting\\Extractor->processRoute()\n#43 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(80): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoFromLaravelApp()\n#44 /var/www/api/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php(56): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->extractEndpointsInfoAndWriteToDisk()\n#45 /var/www/api/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php(55): Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp->get()\n#46 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Knuckles\\Scribe\\Commands\\GenerateDocumentation->handle()\n#47 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#48 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()\n#49 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()\n#50 /var/www/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()\n#51 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()\n#52 /var/www/api/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()\n#53 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()\n#54 /var/www/api/vendor/symfony/console/Application.php(1028): Illuminate\\Console\\Command->run()\n#55 /var/www/api/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand()\n#56 /var/www/api/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()\n#57 /var/www/api/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()\n#58 /var/www/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()\n#59 /var/www/api/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()\n#60 {main}"
    }
}
 

Request   

GET public/domains/alternatives

GET public/user-voices

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/user-voices" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/user-voices"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 1,
            "title": "Custom ISOs",
            "category": "Vionity > Cloud Manager",
            "description": "Es wäre cool wenn man eigene ISOs verwenden könnte",
            "current_status": "open",
            "is_public": 1,
            "votes": 1,
            "pph_comments": [
                {
                    "comment": "Aus technischer Sicht aktuell nicht möglich, aufgrund der fehlenden Guest-Tools in Custom ISOs.",
                    "created_at": "2023-05-08T11:09:12.000000Z",
                    "updated_at": "2023-05-08T11:09:14.000000Z"
                }
            ],
            "created_at": "2023-05-08T11:02:38.000000Z",
            "updated_at": "2023-09-21T11:59:57.000000Z"
        }
    ],
    "links": {
        "first": "https://fsn-01.api.pph.sh/public/user-voices?page=1",
        "last": "https://fsn-01.api.pph.sh/public/user-voices?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://fsn-01.api.pph.sh/public/user-voices?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://fsn-01.api.pph.sh/public/user-voices",
        "per_page": 15,
        "to": 1,
        "total": 1
    }
}
 

Request   

GET public/user-voices

GET public/products/kvm-packages/compare

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/products/kvm-packages/compare" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/products/kvm-packages/compare"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        {
            "id": 475,
            "specs": "2 Kerne / 2 GB RAM garantiert / 50 GB SSD Speicher",
            "input": {
                "cores": 1,
                "memory": 2,
                "space": 30
            },
            "cores": "2 Kerne",
            "memory": "2 GB RAM garantiert",
            "space": "50 GB SSD Speicher",
            "price": 5.26,
            "partial_price": {
                "cores": {
                    "price": 4,
                    "pieces": 2,
                    "pricePerPiece": 2,
                    "newPrice": 2
                },
                "memory": {
                    "price": 2,
                    "pieces": 2,
                    "pricePerPiece": 1,
                    "newPrice": 2
                },
                "space": {
                    "price": 2.1,
                    "pieces": 50,
                    "pricePerPiece": 0.042,
                    "newPrice": 1.26
                }
            }
        },
        {
            "id": 476,
            "specs": "2 Kerne / 4 GB RAM garantiert / 50 GB SSD Speicher",
            "input": {
                "cores": 2,
                "memory": 4,
                "space": 50
            },
            "cores": "2 Kerne",
            "memory": "4 GB RAM garantiert",
            "space": "50 GB SSD Speicher",
            "price": 9.7,
            "partial_price": {
                "cores": {
                    "price": 4,
                    "pieces": 2,
                    "pricePerPiece": 2,
                    "newPrice": 4
                },
                "memory": {
                    "price": 3.6,
                    "pieces": 4,
                    "pricePerPiece": 0.9,
                    "newPrice": 3.6
                },
                "space": {
                    "price": 2.1,
                    "pieces": 50,
                    "pricePerPiece": 0.042,
                    "newPrice": 2.1
                }
            }
        },
        {
            "id": 477,
            "specs": "2 Kerne / 6 GB RAM garantiert / 100 GB SSD Speicher",
            "input": {
                "cores": 3,
                "memory": 6,
                "space": 74
            },
            "cores": "2 Kerne",
            "memory": "6 GB RAM garantiert",
            "space": "100 GB SSD Speicher",
            "price": 14.51,
            "partial_price": {
                "cores": {
                    "price": 4,
                    "pieces": 2,
                    "pricePerPiece": 2,
                    "newPrice": 6
                },
                "memory": {
                    "price": 5.4,
                    "pieces": 6,
                    "pricePerPiece": 0.9,
                    "newPrice": 5.4
                },
                "space": {
                    "price": 4.2,
                    "pieces": 100,
                    "pricePerPiece": 0.042,
                    "newPrice": 3.108
                }
            }
        },
        {
            "id": 478,
            "specs": "4 Kerne / 8 GB RAM garantiert / 100 GB SSD Speicher",
            "input": {
                "cores": 4,
                "memory": 8,
                "space": 99
            },
            "cores": "4 Kerne",
            "memory": "8 GB RAM garantiert",
            "space": "100 GB SSD Speicher",
            "price": 19.36,
            "partial_price": {
                "cores": {
                    "price": 8,
                    "pieces": 4,
                    "pricePerPiece": 2,
                    "newPrice": 8
                },
                "memory": {
                    "price": 7.2,
                    "pieces": 8,
                    "pricePerPiece": 0.9,
                    "newPrice": 7.2
                },
                "space": {
                    "price": 4.2,
                    "pieces": 100,
                    "pricePerPiece": 0.042,
                    "newPrice": 4.158
                }
            }
        },
        {
            "id": 479,
            "specs": "4 Kerne / 10 GB RAM garantiert / 150 GB SSD Speicher",
            "input": {
                "cores": 5,
                "memory": 10,
                "space": 124
            },
            "cores": "4 Kerne",
            "memory": "10 GB RAM garantiert",
            "space": "150 GB SSD Speicher",
            "price": 24.21,
            "partial_price": {
                "cores": {
                    "price": 8,
                    "pieces": 4,
                    "pricePerPiece": 2,
                    "newPrice": 10
                },
                "memory": {
                    "price": 9,
                    "pieces": 10,
                    "pricePerPiece": 0.9,
                    "newPrice": 9
                },
                "space": {
                    "price": 6.3,
                    "pieces": 150,
                    "pricePerPiece": 0.041999999999999996,
                    "newPrice": 5.207999999999999
                }
            }
        },
        {
            "id": 480,
            "specs": "6 Kerne / 12 GB RAM garantiert / 150 GB SSD Speicher",
            "input": {
                "cores": 6,
                "memory": 12,
                "space": 149
            },
            "cores": "6 Kerne",
            "memory": "12 GB RAM garantiert",
            "space": "150 GB SSD Speicher",
            "price": 29.06,
            "partial_price": {
                "cores": {
                    "price": 12,
                    "pieces": 6,
                    "pricePerPiece": 2,
                    "newPrice": 12
                },
                "memory": {
                    "price": 10.8,
                    "pieces": 12,
                    "pricePerPiece": 0.9,
                    "newPrice": 10.8
                },
                "space": {
                    "price": 6.3,
                    "pieces": 150,
                    "pricePerPiece": 0.041999999999999996,
                    "newPrice": 6.257999999999999
                }
            }
        },
        {
            "id": 481,
            "specs": "6 Kerne / 12 GB RAM garantiert / 200 GB SSD Speicher",
            "input": {
                "cores": 7,
                "memory": 14,
                "space": 173
            },
            "cores": "6 Kerne",
            "memory": "12 GB RAM garantiert",
            "space": "200 GB SSD Speicher",
            "price": 33.87,
            "partial_price": {
                "cores": {
                    "price": 12,
                    "pieces": 6,
                    "pricePerPiece": 2,
                    "newPrice": 14
                },
                "memory": {
                    "price": 10.8,
                    "pieces": 12,
                    "pricePerPiece": 0.9,
                    "newPrice": 12.6
                },
                "space": {
                    "price": 8.4,
                    "pieces": 200,
                    "pricePerPiece": 0.042,
                    "newPrice": 7.266
                }
            }
        },
        {
            "id": 482,
            "specs": "8 Kerne / 16 GB RAM garantiert / 200 GB SSD Speicher",
            "input": {
                "cores": 8,
                "memory": 16,
                "space": 198
            },
            "cores": "8 Kerne",
            "memory": "16 GB RAM garantiert",
            "space": "200 GB SSD Speicher",
            "price": 38.72,
            "partial_price": {
                "cores": {
                    "price": 16,
                    "pieces": 8,
                    "pricePerPiece": 2,
                    "newPrice": 16
                },
                "memory": {
                    "price": 14.4,
                    "pieces": 16,
                    "pricePerPiece": 0.9,
                    "newPrice": 14.4
                },
                "space": {
                    "price": 8.4,
                    "pieces": 200,
                    "pricePerPiece": 0.042,
                    "newPrice": 8.316
                }
            }
        },
        {
            "id": 483,
            "specs": "8 Kerne / 16 GB RAM garantiert / 400GB SSD Speicher",
            "input": {
                "cores": 9,
                "memory": 18,
                "space": 223
            },
            "cores": "8 Kerne",
            "memory": "16 GB RAM garantiert",
            "space": "400GB SSD Speicher",
            "price": 43.57,
            "partial_price": {
                "cores": {
                    "price": 16,
                    "pieces": 8,
                    "pricePerPiece": 2,
                    "newPrice": 18
                },
                "memory": {
                    "price": 14.4,
                    "pieces": 16,
                    "pricePerPiece": 0.9,
                    "newPrice": 16.2
                },
                "space": {
                    "price": 16.8,
                    "pieces": 400,
                    "pricePerPiece": 0.042,
                    "newPrice": 9.366000000000001
                }
            }
        },
        {
            "id": 484,
            "specs": "12 Kerne / 24 GB RAM garantiert / 400GB SSD Speicher",
            "input": {
                "cores": 12,
                "memory": 24,
                "space": 248
            },
            "cores": "12 Kerne",
            "memory": "24 GB RAM garantiert",
            "space": "400GB SSD Speicher",
            "price": 56.02,
            "partial_price": {
                "cores": {
                    "price": 24,
                    "pieces": 12,
                    "pricePerPiece": 2,
                    "newPrice": 24
                },
                "memory": {
                    "price": 21.6,
                    "pieces": 24,
                    "pricePerPiece": 0.9,
                    "newPrice": 21.6
                },
                "space": {
                    "price": 16.8,
                    "pieces": 400,
                    "pricePerPiece": 0.042,
                    "newPrice": 10.416
                }
            }
        }
    ]
}
 

Request   

GET public/products/kvm-packages/compare

GET public/promocodes

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/promocodes" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/promocodes"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "288": "LASSKNACKEN30",
    "269": "WASISTMITHASILOS",
    "485": "WASISTMITHASILOS"
}
 

Request   

GET public/promocodes

POST client/pro/activate/free

Example request:
curl --request POST \
    "https://api.pph.sh/client/pro/activate/free" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/pro/activate/free"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST client/pro/activate/free

GET client/user-voices/categories

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/user-voices/categories" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/user-voices/categories"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "data": [
        "Vionity",
        "Vionity > Cloud Manager",
        "Vionity > Dedicated Server",
        "Vionity > Domain-Manager",
        "Vionity > Kundenbereich",
        "Vionity > Webhosting",
        "Vionity > PPH Pro",
        "Allgemein",
        "Support"
    ]
}
 

Request   

GET client/user-voices/categories

POST client/user-voices/create

Example request:
curl --request POST \
    "https://api.pph.sh/client/user-voices/create" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"title\": \"voluptate\",
    \"description\": \"minus\",
    \"category\": \"in\"
}"
const url = new URL(
    "https://api.pph.sh/client/user-voices/create"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "title": "voluptate",
    "description": "minus",
    "category": "in"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/user-voices/create

Body Parameters

title  string  

description  string  

category  string  

POST client/user-voices/{userVoice_id}/upvote

Example request:
curl --request POST \
    "https://api.pph.sh/client/user-voices/1/upvote" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5" \
    --data "{
    \"weight\": 18
}"
const url = new URL(
    "https://api.pph.sh/client/user-voices/1/upvote"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

let body = {
    "weight": 18
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request   

POST client/user-voices/{userVoice_id}/upvote

URL Parameters

userVoice_id  integer  

The ID of the userVoice.

Body Parameters

weight  integer optional  

GET public/nav.html

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/nav.html" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/nav.html"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
content-type: text/html; charset=UTF-8
cache-control: no-cache, private
access-control-allow-origin: *
 

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.tailwindcss.com/?plugins=forms"></script>
    <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
    <link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.15.4/css/all.css"
          integrity="sha384-rqn26AG5Pj86AF4SO72RK5fyefcQ/x32DNQfChxWvbXIyXFePlEktwD18fEz+kQU" crossorigin="anonymous">
    <style type="text/css">
        @import  url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;600;700;800&display=swap');

        [x-cloak] {
            display: none;
        }

        html, body {
            font-family: 'Roboto', sans-serif;
        }

        .text-royalblue-darkest {
            color: #0f1e3d;
        }

        .bg-royalblue-darkest {
            background-color: #0f1e3d;
        }

        .input {
            border-radius: 4px !important;
            border-color: #dadada !important;
            font-size: 14px !important;
        }

        .input[disabled] {
            background-color: #f5f5f5 !important;
            opacity: 0.5;
        }
    </style>
</head>
<body>
<script>
    function nav() {
        return {
            nav: [],
            originalNav: [],
            open: false,
            async init() {
                this.nav = await fetch("https://fsn-01.api.pph.sh/nav.json").then((res) => res.json());
                this.originalNav = JSON.parse(JSON.stringify(this.nav));
            },
            markChanged(item) {
                item.changed = true;
            },
            get hasChanges() {
                return this.nav.some((item) => item.changed);
            },
            save() {
                fetch("https://fsn-01.api.pph.sh/public/nav.json", {
                    method: "POST",
                    body: JSON.stringify({
                        navitems: this.nav
                    }),
                    headers: {
                        "Content-Type": "application/json"
                    }
                }).then((e) => {
                    console.log("save", e);
                    //this.originalNav = JSON.parse(JSON.stringify(this.nav));
                });
            }
        }
    }
</script>
<div class="bg-slate-200">
    <div x-data="nav()">
        <div class="container mx-auto">
            <div class="space-y-2">
                <template x-for="item in nav">
                    <div>
                        <div class="px-4 py-3 border rounded space-y-2 bg-white"
     :class="{'border-blue-900': item.changed}"
     x-data="{toggled: false}" @focus="toggled=true">
    <div class="flex flex-row gap-2">
        <div class="my-auto">
            <a href="#" @click.prevent="toggled=!toggled">
                <i class="fal fa-chevron-down"></i>
            </a>
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Typ
            </div>
            <select class="input"  x-model="item.type"  @change="markChanged(item);" @focus="toggled=true">
                <option value="extra_buttons">extra_buttons</option>
                <option value="link">link</option>
                <option value="nav_cat">nav_cat</option>
                <option value="secondary_menu_cat">secondary_menu_cat</option>
            </select>
        </div>
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Title
            </div>
            <input type="text" class="input w-full" x-model="item.title"  @change="markChanged(item); toggled=true" placeholder="Title">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Icon
            </div>
            <input type="text" class="input" x-model="item.props.icon"  @change="markChanged(item); toggled=true"
                   :disabled="item.type!=='link'">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Produkt-ID
            </div>
            <input type="text" class="input" x-model="item.props.product_id"  @change="markChanged(item); toggled=true"
                   :disabled="item.type!=='link'">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Produkt-Meta
            </div>
            <input type="text" class="input" x-model="item.props.product_meta"  @change="markChanged(item); toggled=true"
                   :disabled="item.type!=='link'">
        </div>
    </div>
    <div x-show="toggled" class="space-y-2">
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Target
            </div>
            <input type="text" class="input w-full" x-model="item.target"  @change="markChanged(item); toggled=true">
        </div>
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Description
            </div>
            <input type="text" class="input w-full" x-model="item.props.description"  @change="markChanged(item); toggled=true">
        </div>
        <div>
            <button class="bg-blue-900 py-2 px-3 font-bold text-center rounded text-white text-sm disabled:saturate-50"
                    @click="save()"
                    @click.prevent="toggled=false" :disabled="!item.changed">Speichern</button>
        </div>
    </div>
</div>
                            <template x-for="subitem in item.children">
                            <div class="ml-6 mt-2">
                                <div class="px-4 py-3 border rounded space-y-2 bg-white"
     :class="{'border-blue-900': subitem.changed}"
     x-data="{toggled: false}" @focus="toggled=true">
    <div class="flex flex-row gap-2">
        <div class="my-auto">
            <a href="#" @click.prevent="toggled=!toggled">
                <i class="fal fa-chevron-down"></i>
            </a>
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Typ
            </div>
            <select class="input"  x-model="subitem.type"  @change="markChanged(subitem);" @focus="toggled=true">
                <option value="extra_buttons">extra_buttons</option>
                <option value="link">link</option>
                <option value="nav_cat">nav_cat</option>
                <option value="secondary_menu_cat">secondary_menu_cat</option>
            </select>
        </div>
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Title
            </div>
            <input type="text" class="input w-full" x-model="subitem.title"  @change="markChanged(subitem); toggled=true" placeholder="Title">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Icon
            </div>
            <input type="text" class="input" x-model="subitem.props.icon"  @change="markChanged(subitem); toggled=true"
                   :disabled="subitem.type!=='link'">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Produkt-ID
            </div>
            <input type="text" class="input" x-model="subitem.props.product_id"  @change="markChanged(subitem); toggled=true"
                   :disabled="subitem.type!=='link'">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Produkt-Meta
            </div>
            <input type="text" class="input" x-model="subitem.props.product_meta"  @change="markChanged(subitem); toggled=true"
                   :disabled="subitem.type!=='link'">
        </div>
    </div>
    <div x-show="toggled" class="space-y-2">
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Target
            </div>
            <input type="text" class="input w-full" x-model="subitem.target"  @change="markChanged(subitem); toggled=true">
        </div>
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Description
            </div>
            <input type="text" class="input w-full" x-model="subitem.props.description"  @change="markChanged(subitem); toggled=true">
        </div>
        <div>
            <button class="bg-blue-900 py-2 px-3 font-bold text-center rounded text-white text-sm disabled:saturate-50"
                    @click="save()"
                    @click.prevent="toggled=false" :disabled="!subitem.changed">Speichern</button>
        </div>
    </div>
</div>
                                    <template x-for="subsubitem in subitem.children">
                                    <div class="ml-6 mt-2">
                                        <div class="px-4 py-3 border rounded space-y-2 bg-white"
     :class="{'border-blue-900': subsubitem.changed}"
     x-data="{toggled: false}" @focus="toggled=true">
    <div class="flex flex-row gap-2">
        <div class="my-auto">
            <a href="#" @click.prevent="toggled=!toggled">
                <i class="fal fa-chevron-down"></i>
            </a>
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Typ
            </div>
            <select class="input"  x-model="subsubitem.type"  @change="markChanged(subsubitem);" @focus="toggled=true">
                <option value="extra_buttons">extra_buttons</option>
                <option value="link">link</option>
                <option value="nav_cat">nav_cat</option>
                <option value="secondary_menu_cat">secondary_menu_cat</option>
            </select>
        </div>
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Title
            </div>
            <input type="text" class="input w-full" x-model="subsubitem.title"  @change="markChanged(subsubitem); toggled=true" placeholder="Title">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Icon
            </div>
            <input type="text" class="input" x-model="subsubitem.props.icon"  @change="markChanged(subsubitem); toggled=true"
                   :disabled="subsubitem.type!=='link'">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Produkt-ID
            </div>
            <input type="text" class="input" x-model="subsubitem.props.product_id"  @change="markChanged(subsubitem); toggled=true"
                   :disabled="subsubitem.type!=='link'">
        </div>
        <div>
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Produkt-Meta
            </div>
            <input type="text" class="input" x-model="subsubitem.props.product_meta"  @change="markChanged(subsubitem); toggled=true"
                   :disabled="subsubitem.type!=='link'">
        </div>
    </div>
    <div x-show="toggled" class="space-y-2">
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Target
            </div>
            <input type="text" class="input w-full" x-model="subsubitem.target"  @change="markChanged(subsubitem); toggled=true">
        </div>
        <div class="w-full">
            <div class="text-sm font-bold mb-0.5 text-slate-600">
                Description
            </div>
            <input type="text" class="input w-full" x-model="subsubitem.props.description"  @change="markChanged(subsubitem); toggled=true">
        </div>
        <div>
            <button class="bg-blue-900 py-2 px-3 font-bold text-center rounded text-white text-sm disabled:saturate-50"
                    @click="save()"
                    @click.prevent="toggled=false" :disabled="!subsubitem.changed">Speichern</button>
        </div>
    </div>
</div>
                                        </div>
                                </template>
                            </div>
                        </template>
                    </div>
                </template>
            </div>
        </div>
    </div>
</div>

</body>
</html>

 

Request   

GET public/nav.html

POST public/nav.json

Example request:
curl --request POST \
    "https://api.pph.sh/public/nav.json" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/nav.json"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request   

POST public/nav.json

GET public/nav.json

Example request:
curl --request GET \
    --get "https://api.pph.sh/public/nav.json" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/public/nav.json"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

[
    {
        "id": "extra-buttons",
        "title": "",
        "target": "",
        "type": "extra_buttons",
        "props": {
            "id": "extra-buttons",
            "props": {
                "id": "extra-buttons",
                "props": {
                    "order": 0
                }
            },
            "from_db": {
                "id": 1,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "vserver-nav-cat",
        "title": "vServer",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "vserver-nav-cat",
            "props": {
                "id": "vserver-nav-cat",
                "props": {
                    "promo": {
                        "id": "rabatt-promo",
                        "title": "Rabatt",
                        "target": null,
                        "type": "promo",
                        "props": {
                            "content": [
                                "-30%",
                                "Rabatt auf alle virtuellen Server",
                                "Gültig bis 31.10.2023"
                            ]
                        },
                        "children": []
                    },
                    "order": 1
                }
            },
            "from_db": {
                "id": 2,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "dedicated-nav-cat",
        "title": "Dedicated",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "dedicated-nav-cat",
            "props": {
                "id": "dedicated-nav-cat",
                "props": {
                    "promo": {
                        "id": "rabatt-promo",
                        "title": "Rabatt",
                        "target": null,
                        "type": "promo",
                        "props": {
                            "content": [
                                "0,00€",
                                "Setup für alle Dedicated Server",
                                "spare 10,00€ - Gültig bis 31.10.2023"
                            ]
                        },
                        "children": []
                    },
                    "order": 2
                }
            },
            "from_db": {
                "id": 3,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "addons-nav-cat",
        "title": "Addons",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "addons-nav-cat",
            "props": {
                "id": "addons-nav-cat",
                "props": {
                    "order": 3
                }
            },
            "from_db": {
                "id": 4,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "webhosting-nav-cat",
        "title": "Webhosting",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "webhosting-nav-cat",
            "props": {
                "id": "webhosting-nav-cat",
                "props": {
                    "order": 4
                }
            },
            "from_db": {
                "id": 5,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "domains-nav-cat",
        "title": "Domains",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "domains-nav-cat",
            "props": {
                "id": "domains-nav-cat",
                "props": {
                    "promo": {
                        "id": "rabatt-promo",
                        "title": "Rabatt",
                        "target": null,
                        "type": "promo",
                        "props": {
                            "content": [
                                "3,99€",
                                "jede .DE-Domain!",
                                "Gültig bis 31.10.2023"
                            ],
                            "countdown": "2023-10-31T00:00:00+02:00"
                        },
                        "children": []
                    },
                    "order": 5
                }
            },
            "from_db": {
                "id": 6,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "business-nav-cat",
        "title": "Business",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "business-nav-cat",
            "props": {
                "id": "business-nav-cat",
                "props": {
                    "promo": {
                        "id": "promo",
                        "title": null,
                        "target": null,
                        "type": "promo",
                        "props": {
                            "content": [
                                "www.",
                                "Unser Partner: Templado.de",
                                "Suchmaschinenoptimierung"
                            ]
                        },
                        "children": []
                    },
                    "order": 6
                }
            },
            "from_db": {
                "id": 7,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "kontakt-nav-cat",
        "title": "Kontakt",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "kontakt-nav-cat",
            "props": {
                "id": "kontakt-nav-cat",
                "props": {
                    "order": 7
                }
            },
            "from_db": {
                "id": 8,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    },
    {
        "id": "uber-uns-nav-cat",
        "title": "Über uns",
        "target": "",
        "type": "nav_cat",
        "props": {
            "id": "uber-uns-nav-cat",
            "props": {
                "id": "uber-uns-nav-cat",
                "props": {
                    "order": 8
                }
            },
            "from_db": {
                "id": 9,
                "website_nav_item_id": null
            },
            "external": true
        },
        "children": []
    }
]
 

Request   

GET public/nav.json

GET client/hostings/{hosting_id}/billingcycles

Example request:
curl --request GET \
    --get "https://api.pph.sh/client/hostings/52/billingcycles" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --header "Accept-Language: de; *;q=0.5"
const url = new URL(
    "https://api.pph.sh/client/hostings/52/billingcycles"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Accept-Language": "de; *;q=0.5",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "currentCycle": "Monthly",
    "recurringAmount": 20.38,
    "possibleChanges": {
        "monthly": {
            "name": "Monthly",
            "from": "18.05.2024",
            "to": "18.06.2024",
            "promocode": "KVM2024",
            "promocode_info": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "price": 21.85,
            "per_month": 21.85
        },
        "quarterly": {
            "name": "Quarterly",
            "from": "18.05.2024",
            "to": "18.08.2024",
            "promocode": "KVM2024",
            "promocode_info": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "price": 65.54,
            "per_month": 21.85
        },
        "semiannually": {
            "name": "Semi-Annually",
            "from": "18.05.2024",
            "to": "18.11.2024",
            "promocode": "KVM2024",
            "promocode_info": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            "price": 131.08,
            "per_month": 21.85
        },
        "annually": {
            "name": "Annually",
            "from": "18.05.2024",
            "to": "18.05.2025",
            "promocode": "KVM2024",
            "promocode_info": {
                "code": "KVM2024",
                "label": "KVM2024 = wiederkehrend 30%",
                "description": "30% Rabatt ges. Laufzeit",
                "recurring": true,
                "recurring_for": 0,
                "recurring_infinite": true,
                "value": 30,
                "type": "Percentage"
            },
            &qu