Bem-vindo à PingHost
Hospedamos bots do Discord e APIs HTTP (Node.js e Python) 24/7. Envie o código pelo /up e pronto — URL fixa e HTTPS automáticos incluídos.
# Hospedagem de APIs
A PingHost hospeda qualquer tipo de API HTTP (Node.js e Python):
- APIs REST — Express, Fastify, Koa, NestJS (Node)
- APIs Python — FastAPI, Flask, Django
- Webhooks & integrações — endpoints para receber chamadas externas
- Bots com API embutida — o mesmo projeto roda o bot e expõe endpoints
O que é o api.pinghost.2bd.net? É o domínio público da PingHost — o endereço único por onde todas as APIs hospedadas ficam acessíveis. Cada aplicação ganha o próprio caminho: https://api.pinghost.2bd.net/<sua-app>/. HTTPS automático e URL que nunca muda.
#Visão geral
Sua API fica pública no domínio da PingHost. O caminho da requisição:
Quem consome só precisa da URL pública:
- Clientes chamam https://api.pinghost.2bd.net/<sua-app>/... (ex.: /health)
- Você entrega essa URL para sites, webhooks e bots — endereço fixo e profissional
- A PingHost cuida de HTTPS, disponibilidade 24/7 e repasse da requisição
#Como funciona
Ao enviar seu projeto pelo /up, a PingHost detecta automaticamente se o código é uma API e configura tudo:
Cadeia da sua URL
#Começando
Sem token? APIs não pedem token do Discord — ele só é solicitado quando o código parece um bot.
#Limites por plano
Cada plano inclui uma cota de bots e uma cota de APIs. As APIs começam a partir do plano LITE:
| Plano | vCPU | Bots | APIs |
|---|---|---|---|
| FREE | 0,25 | 1 | 0 |
| STARTER | 1 | 5 | 0 |
| LITE | 1,5 | 7 | 3 |
| PRO | 2 | 10 | 5 |
| PREMIUM | 3 | 20 | 10 |
| ULTRA | 4 | 40 | 20 |
Como as vagas são contadas: cada aplicação ocupa 1 vaga de bot; se for uma API, 1 vaga de bot + 1 vaga de API. Bot + API juntos consomem as duas.
Bônus de bots: donos com bônus (via /add) ganham vagas extras de bots.
#Exemplos de código
Qualquer aplicação que abra um servidor HTTP vira API. Os exemplos abaixo funcionam direto — compacte e suba pelo /up.
Node.js — Express
Estrutura mínima do .zip:
minha-api/
├── server.js
└── package.jsonserver.js
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => res.json({ ok: true, name: 'Minha API' }));
app.get('/health', (req, res) => res.json({ status: 'online' }));
app.post('/echo', (req, res) => res.json(req.body));
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`API na porta ${port}`));
package.json (as dependências são instaladas automaticamente)
{
"name": "minha-api",
"main": "server.js",
"dependencies": { "express": "^4.19.2" }
}
Python — FastAPI
main.py
from fastapi import FastAPI
app = FastAPI(title='Minha API')
@app.get('/')
def root():
return {'ok': True}
@app.get('/health')
def health():
return {'status': 'online'}
requirements.txt
fastapi
uvicorn
Python — Flask
app.py
import os
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def root():
return jsonify(ok=True)
@app.route('/health')
def health():
return jsonify(status='online')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 3000)))
Sempre use process.env.PORT (ou os.environ['PORT']) — a PingHost injeta a porta correta automaticamente.
#Variáveis de ambiente
Inclua um .env no zip com suas variáveis (chaves de serviços, URLs de banco…). Elas são preservadas e injetadas na aplicação.
| Variável | Quem define | Descrição |
|---|---|---|
| PORT | PingHost | Porta onde sua API deve escutar — injetada automaticamente |
| TOKEN, DISCORD_TOKEN… | PingHost | Token do bot (só quando o projeto é um bot) |
| MONGO_URL, SUPABASE_URL… | Você | Credenciais próprias do seu .env — são mantidas |
O token do Discord (quando necessário) é mesclado ao seu .env — nada que você já configurou é sobrescrito.
#Bot + API juntos (híbrido)
Bot do Discord e API no mesmo projeto? Funciona:
- O sistema detecta o bot e pede o token.
- Detecta o servidor HTTP e abre a URL pública.
- O projeto recebe as duas coisas: token no .env e URL fixa.
Vagas: um híbrido ocupa 1 vaga de bot + 1 vaga de API. Ex.: PRO (10 bots / 5 APIs) → 9 bots e 4 APIs livres.
Detecção inteligente: bots que usam .listen() só para webhook (sem framework web) não contam como API — evita falsos positivos.
#URL fixa pública
Toda API hospedada recebe uma URL no formato:
Exemplo real:
- HTTPS automático — certificado SSL incluído, sem configuração.
- Nunca muda — reinícios, atualizações e quedas não alteram a URL.
- Pronta para produção — aponte webhooks, integrações e clientes para a URL com confiança.
#Como usar sua API
Consumir é simples: sua URL fixa é a base e cada rota do código vira um caminho. Todos os métodos HTTP funcionam; corpo e headers são repassados para a sua aplicação.
Montando a URL de um endpoint
Se sua URL fixa é https://api.pinghost.2bd.net/123456789012345678_minha_api/ e o código tem a rota /health:
Regras simples:
- Rota raiz → https://api.pinghost.2bd.net/<app>/ (a barra final opcional)
- Qualquer rota do seu código → https://api.pinghost.2bd.net/<app>/sua-rota
- Parâmetros de rota → https://api.pinghost.2bd.net/<app>/usuarios/42
- Query string → https://api.pinghost.2bd.net/<app>/busca?q=pinghost&limite=10
Testando com curl
O jeito mais rápido de verificar se a API responde:
# GET simples (health check)
curl https://api.pinghost.2bd.net/123456789012345678_minha_api/health
# POST com JSON (envie dados para sua API)
curl -X POST https://api.pinghost.2bd.net/123456789012345678_minha_api/usuarios \
-H 'Content-Type: application/json' \
-d '{"nome": "PingHost", "plano": "PRO"}'
# Com header de autenticação (se sua API exigir)
curl https://api.pinghost.2bd.net/123456789012345678_minha_api/dados \
-H 'Authorization: Bearer sua-chave-aqui'
Consumindo de um bot Discord (Node.js)
Use fetch (nativo do Node 18+) ou axios:
// fetch nativo (Node 18+)
const resp = await fetch('https://api.pinghost.2bd.net/123456789012345678_minha_api/health');
const data = await resp.json();
console.log(data); // { status: 'online' }
// POST com JSON
const criado = await fetch('https://api.pinghost.2bd.net/123456789012345678_minha_api/usuarios', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ nome: 'PingHost' }),
});
const resultado = await criado.json();
console.log(resultado);
// Com autenticação
const privado = await fetch('https://api.pinghost.2bd.net/123456789012345678_minha_api/dados', {
headers: { Authorization: 'Bearer sua-chave-aqui' },
});
console.log(await privado.json());
Consumindo de Python
import requests
# GET simples
resp = requests.get('https://api.pinghost.2bd.net/123456789012345678_minha_api/health')
print(resp.json()) # {'status': 'online'}
# POST com JSON
resp = requests.post(
'https://api.pinghost.2bd.net/123456789012345678_minha_api/usuarios',
json={'nome': 'PingHost'},
)
print(resp.json())
# Com autenticação
resp = requests.get(
'https://api.pinghost.2bd.net/123456789012345678_minha_api/dados',
headers={'Authorization': 'Bearer sua-chave-aqui'},
)
print(resp.json())
Limites e códigos de resposta
| Código | Significado | O que fazer |
|---|---|---|
| 200 / 201 | Sucesso | Sua API respondeu normalmente |
| 400 | URL inválida | Confira o formato do endereço (slug com letras, números, _ e -) |
| 404 | API não encontrada ou rota inexistente | Aguarde ~2 min se a app acabou de subir; ou confira a rota no seu código |
| 429 | Limite de requisições da API atingido | Cada API tem 600 requisições/minuto (compartilhadas entre todos os clientes). Aguarde e tente de novo |
| 502 | Falha ao acessar a API | Verifique se a app está online (logs em Minhas Aplicações) |
Limite por API: 600 requisições/minuto por aplicação (compartilhado entre os clientes dela). Uso normal fica longe disso; para APIs muito populares, fale sobre um plano maior.
Corpo e headers: o proxy repassa Content-Type e Authorization — autenticação e JSON funcionam sem configuração. Payload acima de 2 MB é rejeitado; timeout de 30s por requisição.
#Solução de problemas
A URL retorna "API não encontrada ou ainda sem URL pública"
- A URL leva ~30 segundos a 2 minutos para aparecer após a app subir — aguarde e tente de novo.
- Confirme que a app está online (veja o status em Minhas Aplicações).
- Confirme que seu plano inclui APIs (LITE ou superior) e que você não atingiu o limite.
Minha API não foi reconhecida como API
O sistema só detecta API quando o arquivo principal abre um servidor HTTP:
- O entrypoint se chama server.js, app.js, index.js, main.py, app.py…
- O código usa .listen(, createServer(, app.run(, uvicorn.run, ou frameworks como Express/Fastify/Flask/FastAPI.
- O entrypoint não é claramente um bot do Discord (sem discord.js/discord.py no arquivo principal).
A app cai ou reinicia sozinha (502 / erro de código)
- Abra os logs em Minhas Aplicações — a mensagem de erro aponta o problema e a linha.
- Confira se as dependências estão no package.json / requirements.txt.
- Não inclua node_modules no zip — ela é instalada automaticamente.
- Use process.env.PORT / os.environ['PORT'] para escutar a porta.
#Perguntas frequentes
Respostas rápidas para as dúvidas mais comuns.
Respostas rápidas para as dúvidas mais comuns. Clique em uma pergunta para ver a resposta.
Preciso pagar para ter uma URL fixa?
Não. A URL fixa com HTTPS já está incluída em todos os planos com APIs (LITE ou superior). Sem custo extra.
A URL muda quando a aplicação reinicia?
Não. A URL é permanente: reinícios, atualizações e até quedas não mudam o endereço. Seu público usa sempre o mesmo link.
Posso hospedar um bot do Discord com API no mesmo projeto?
Sim. É só enviar o projeto com o token e a URL pública. Ele consome 1 vaga de bot + 1 vaga de API no seu plano.
Quais linguagens são suportadas?
Node.js (Express, Fastify, Koa, NestJS…) e Python (FastAPI, Flask, Django…). Se a sua API roda em uma dessas, ela roda na PingHost.
Posso usar meu próprio banco de dados?
Pode. Coloque as credenciais (ex.: MONGO_URL, SUPABASE_URL) no arquivo .env dentro do zip — elas são preservadas e usadas pela sua aplicação.
E se eu quiser mais APIs do que o plano permite?
Você pode excluir aplicações que não usa mais ou fazer upgrade do plano. Cada plano tem uma cota de APIs — veja a tabela acima.
O que acontece se meu código tiver um erro?
A aplicação reinicia em loop e os logs mostram o erro com a linha exata. Corrija o código, recompacte e envie o novo .zip pela opção Atualizar.