
A API lê as facturas, o saldo, as encomendas e as cotações, paga facturas com o saldo da conta, muda o ciclo da próxima renovação e regista pedidos de cancelamento. Só cobra do saldo: para pagar de outra forma, use o My MozOut ou o endereço url de cada factura.
O que precisa
| Para | Permissão |
|---|---|
| Ler facturas, encomendas e cotações, ver ciclos e obter a ligação de upgrade | billing:read |
| Mudar o ciclo da próxima renovação | billing:write |
| Pagar com saldo | billing:pay, permissão perigosa |
| Pedir o cancelamento de um serviço | services:cancel, permissão perigosa |
Com uma chave sandbox_, ou enquanto a API está em preparação, as alterações são simuladas e nada é cobrado. Veja Sandbox e Produção. Os serviços estão em Hospedagem.
A lista de facturas
GET /v1/invoices devolve as facturas da conta, primeiro as mais recentes. Pode filtrar com status, por exemplo ?status=unpaid. A lista vem em páginas.
curl
curl "https://api.mozout.com/v1/invoices" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/invoices", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/invoices", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Os valores de uma factura
| Campo | O que é |
|---|---|
total | O total da factura, incluindo o que foi pago com saldo. |
credit_applied | O que foi pago com saldo. |
balance_due | O que ainda falta pagar. |
GET /v1/invoices/{id} devolve também as linhas da factura.
Descarregar o PDF
GET /v1/invoices/{id}/pdf devolve o PDF em content, em base64. Às vezes o PDF não sai pela API: pdf_available vem a false, reason diz porquê e url leva à factura no portal, onde a pode ver e guardar.
Pagamento com saldo
POST /v1/invoices/{id}/pay paga o que falta de uma factura por pagar, só com o saldo da conta. Se o saldo não chegar, responde 402 e nada é cobrado.
curl
curl -X POST "https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt" \
-H "Idempotency-Key: 9f1c2d3e-example"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
'Idempotency-Key: 9f1c2d3e-example',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
}
r = requests.post("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
},
});
console.log(response.status);
console.log(await response.text());- Precisa do cabeçalho
Idempotency-Key: repetir o pedido com a mesma chave não cobra outra vez. Veja Repetições. - O total da factura conta para o limite de gastos da chave. Se o passar, responde
403comspending_limit_exceeded, antes de cobrar. - Confira
statuseamount_chargedna resposta. Se a factura já tiver sido paga entretanto,amount_chargedvem a 0. - Com uma chave
sandbox_,credit_sufficientewithin_spending_limitdizem se o pagamento passaria. Nada é cobrado.
Saldo e transacções
GET /v1/billing/credit: o saldo disponível.GET /v1/billing/transactions: os pagamentos e devoluções.
Encomendas e cotações
GET /v1/orderslista as encomendas da conta, eGET /v1/orders/{id}mostra o que veio em cada uma.GET /v1/quoteslista as cotações que lhe foram entregues, eGET /v1/quotes/{id}mostra a proposta e as linhas.
Mudar o ciclo de renovação
A mudança vale para a próxima renovação: nada se cobra agora e a data de vencimento não muda.
- Veja os ciclos à venda e o preço de cada um com
GET /v1/services/{id}/billing-cycles. Aqui nada muda. - Peça a mudança com
PUT /v1/services/{id}/billing-cycle, com o preço que viu emexpected_amount. Se o preço tiver mudado, responde409comprice_changede nada é alterado.
curl
curl -X PUT "https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt" \
-H "Content-Type: application/json" \
-d '{"cycle": "annually", "expected_amount": 3500.0}'PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => '{"cycle": "annually", "expected_amount": 3500.0}',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
'Content-Type: application/json',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
payload = {"cycle": "annually", "expected_amount": 3500.0}
r = requests.put("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle", headers=headers, json=payload, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
"Content-Type": "application/json",
},
body: JSON.stringify({"cycle": "annually", "expected_amount": 3500.0}),
});
console.log(response.status);
console.log(await response.text());Se já houver uma factura por pagar deste serviço, pague-a primeiro: a API responde 409 com invoice_open e o invoice_id em details.
Em dois casos o ciclo não muda pela API, e nada é alterado:
- VPS ou servidor: responde
409comvps_not_supported, porque o valor pode incluir extras, como IP ou disco. - Preço próprio: se o valor do serviço não bater com o preço de lista do ciclo actual, responde
409comcustom_price, para não se perder o preço que tem.
Trate estes casos no portal ou com o suporte. A consulta já o mostra: can_change vem a false, blocked_reason diz porquê e cycles vem vazio. Um ciclo em que uma opção paga do serviço não tenha preço não está à venda e não aparece na lista.
Fazer um upgrade
GET /v1/services/{id}/upgrade-link devolve a ligação para o portal, onde escolhe o plano novo e vê o valor antes de pagar.
Cancelamentos
POST /v1/services/{id}/cancellation regista o pedido para o fim do período pago, nunca de imediato. O serviço continua activo até à data de service_ends_at.
curl
curl -X POST "https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt" \
-H "Idempotency-Key: 9f1c2d3e-example" \
-H "Content-Type: application/json" \
-d '{"reason": "I no longer need this plan", "confirm": "example.co.mz"}'PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"reason": "I no longer need this plan", "confirm": "example.co.mz"}',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
'Idempotency-Key: 9f1c2d3e-example',
'Content-Type: application/json',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
}
payload = {"reason": "I no longer need this plan", "confirm": "example.co.mz"}
r = requests.post("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation", headers=headers, json=payload, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
"Content-Type": "application/json",
},
body: JSON.stringify({"reason": "I no longer need this plan", "confirm": "example.co.mz"}),
});
console.log(response.status);
console.log(await response.text());- Em
reason, escreva o motivo. - Em
confirm, escreva o domínio do serviço ou, se não tiver, o nome do plano. - As facturas por pagar do serviço podem ser canceladas.
- Um serviço sem período pago em curso, como um gratuito ou um em atraso, responde
409comno_period_end. Nesse caso, fale com o suporte.
O que está previsto
- Encomendar outros produtos com saldo, com permissão própria, desligada por omissão, e dentro do limite de gastos.
Operações
14 operações nesta área. Clique numa operação para ver os parâmetros, os exemplos e as respostas, ou para a experimentar no Playground, sem sair da página.
GETListar as facturas
/v1/invoices
https://api.mozout.com/v1/invoicesPrecisa de billing:read. Primeiro as mais recentes. total inclui o que foi pago com saldo; balance_due é o que falta pagar.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
status | consulta | string: unpaid, paid, cancelled, refunded, collections, payment_pending | não | Só os resultados neste estado. |
page | consulta | integer | não | O número da página. A primeira é a 1. |
per_page | consulta | integer | não | Resultados por página, de 1 a 100. Por omissão, 10. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/invoices" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/invoices", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/invoices", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Listar as facturas.
{
"data": [
{
"id": 1042,
"number": "0542/2026",
"status": "unpaid",
"date": "2026-11-01",
"due_date": "2026-11-15",
"paid_at": null,
"subtotal": 3600.0,
"tax": 0.0,
"credit_applied": 100.0,
"total": 3600.0,
"balance_due": 3500.0,
"currency": "USD",
"payment_method": "M-Pesa",
"url": "https://my.example.com/viewinvoice.php?id=1042&language=portuguese¤cy=1"
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 1,
"total_pages": 1
}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}422
Alguns dados não são válidos.
{
"error": {
"code": "validation_failed",
"message": "Alguns dados não são válidos.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 422 | validation_failed | Alguns dados não são válidos. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETVer uma factura
/v1/invoices/{id}
https://api.mozout.com/v1/invoices/{id}Precisa de billing:read. Com as linhas da factura.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id da factura. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Ver uma factura.
{
"data": {
"id": 1042,
"number": "0542/2026",
"status": "unpaid",
"date": "2026-11-01",
"due_date": "2026-11-15",
"paid_at": null,
"subtotal": 3600.0,
"tax": 0.0,
"credit_applied": 100.0,
"total": 3600.0,
"balance_due": 3500.0,
"currency": "USD",
"payment_method": "M-Pesa",
"url": "https://my.example.com/viewinvoice.php?id=1042&language=portuguese¤cy=1",
"items": [
{
"id": 5,
"type": "Hosting",
"related_id": 88,
"description": "Plano Empresas (01/11/2026 - 31/10/2027)",
"amount": 3600.0,
"taxed": false
}
],
"notes": ""
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETVer o saldo
/v1/billing/credit
https://api.mozout.com/v1/billing/creditPrecisa de billing:read. O saldo disponível na conta.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/billing/credit" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/billing/credit');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/billing/credit", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/billing/credit", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Ver o saldo.
{
"data": {
"balance": 250.0,
"currency": "USD"
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETListar as transacções
/v1/billing/transactions
https://api.mozout.com/v1/billing/transactionsPrecisa de billing:read. Os pagamentos e devoluções da conta, primeiro os mais recentes.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
page | consulta | integer | não | O número da página. A primeira é a 1. |
per_page | consulta | integer | não | Resultados por página, de 1 a 100. Por omissão, 10. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/billing/transactions" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/billing/transactions');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/billing/transactions", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/billing/transactions", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Listar as transacções.
{
"data": [
{
"id": 300,
"date": "2026-11-02T10:15:00+02:00",
"description": "Pagamento da factura 0542/2026",
"amount_in": 3500.0,
"amount_out": 0.0,
"currency": "USD",
"invoice_id": 1042,
"payment_method": "M-Pesa",
"transaction_id": "ABC123"
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 1,
"total_pages": 1
}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}422
Alguns dados não são válidos.
{
"error": {
"code": "validation_failed",
"message": "Alguns dados não são válidos.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 422 | validation_failed | Alguns dados não são válidos. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETObter o PDF de uma factura
/v1/invoices/{id}/pdf
https://api.mozout.com/v1/invoices/{id}/pdfPrecisa de billing:read. O PDF vem em content, em base64. Quando pdf_available é false, use url; reason diz porquê: internal_text, temporary_address, not_generated ou too_large. Limite de 20 por minuto.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id da factura. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pdf" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pdf');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pdf", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pdf", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Obter o PDF de uma factura.
{
"data": {
"pdf_available": true,
"filename": "invoice-0669-2026.pdf",
"content_type": "application/pdf",
"encoding": "base64",
"size_bytes": 29556,
"content": "JVBERi0xLjcK",
"invoice_id": 3127,
"number": "0669/2026",
"url": "https://my.example.co.mz/viewinvoice.php?id=3127&language=portuguese-mz¤cy=1",
"reason": null
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
POSTPagar uma factura com saldo
/v1/invoices/{id}/pay
https://api.mozout.com/v1/invoices/{id}/payPrecisa de billing:pay. Paga o que falta, só com o saldo da conta. Precisa do cabeçalho Idempotency-Key. O total da factura conta para o limite de gastos da chave. Limite de 5 por minuto, junto com as compras de domínios e de extras. Em conflict, details.reason pode ser invoice_not_unpaid, credit_not_allowed, nothing_to_pay ou profile_incomplete.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:pay.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id da factura. |
Idempotency-Key | cabeçalho | string | não | Um valor único qualquer, até 255 caracteres visíveis. Vale 24 horas por chave. Repetir o mesmo pedido devolve a resposta guardada; outro corpo, ou um primeiro pedido ainda em curso, devolve 409. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl -X POST "https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt" \
-H "Idempotency-Key: 9f1c2d3e-example"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
'Idempotency-Key: 9f1c2d3e-example',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
}
r = requests.post("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/invoices/00000000-0000-4000-8000-000000000000/pay", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Pagar uma factura com saldo.
{
"data": {
"status": "paid",
"amount_charged": 229.68,
"balance_due": 0.0,
"credit_balance": 770.32,
"simulated": false,
"invoice_id": 3127,
"invoice_total": 229.68,
"currency": "USD",
"url": "https://my.example.co.mz/viewinvoice.php?id=3127&language=portuguese-mz¤cy=1"
},
"meta": {}
}| Campo | Tipo | Descrição |
|---|---|---|
data.credit_sufficient | boolean | Só em Sandbox: o saldo chegaria. |
data.within_spending_limit | boolean | Só em Sandbox: o pagamento caberia no limite de gastos da chave. |
| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
400
O pedido não é válido, por exemplo o corpo não é JSON ou a ligação não é HTTPS.
{
"error": {
"code": "invalid_request",
"message": "O pedido não é válido.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}402
Saldo insuficiente. Nada foi cobrado.
{
"error": {
"code": "insufficient_credit",
"message": "The account does not have enough credit. Nothing was charged.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"amount": 1900.0,
"currency": "USD"
}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}409
A operação não se pode fazer no estado actual. Veja details.reason.
{
"error": {
"code": "conflict",
"message": "This operation only works on an active domain.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"reason": "domain_not_active"
}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}502
O serviço por trás da API não respondeu como esperado.
{
"error": {
"code": "upstream_error",
"message": "The service did not respond as expected. Please try again later.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_request | O pedido não é válido, por exemplo o corpo não é JSON ou a ligação não é HTTPS. |
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 402 | insufficient_credit | Saldo insuficiente. Nada foi cobrado. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 409 | conflict | A operação não se pode fazer no estado actual. Veja details.reason. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 502 | upstream_error | O serviço por trás da API não respondeu como esperado. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETListar as encomendas
/v1/orders
https://api.mozout.com/v1/ordersPrecisa de billing:read. Primeiro as mais recentes.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
status | consulta | string | não | Filtra pelo estado: pending, active, cancelled ou fraud. |
page | consulta | integer | não | O número da página. A primeira é a 1. |
per_page | consulta | integer | não | Resultados por página, de 1 a 100. Por omissão, 10. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/orders" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/orders');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/orders", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/orders", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Listar as encomendas.
{
"data": [
{
"id": 961,
"number": "7794007796",
"status": "active",
"date": "2026-10-31T14:20:18+02:00",
"amount": 2900.93,
"currency": "USD",
"payment_method": "M-Pesa",
"invoice_id": 3100,
"promo_code": null
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 1,
"total_pages": 1
}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}422
Alguns dados não são válidos.
{
"error": {
"code": "validation_failed",
"message": "Alguns dados não são válidos.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 422 | validation_failed | Alguns dados não são válidos. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETVer uma encomenda
/v1/orders/{id}
https://api.mozout.com/v1/orders/{id}Precisa de billing:read. Com o que veio na encomenda: serviços, domínios, adicionais e upgrades. O endereço temporário só aparece com o serviço activo.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id da encomenda. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/orders/00000000-0000-4000-8000-000000000000" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/orders/00000000-0000-4000-8000-000000000000');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/orders/00000000-0000-4000-8000-000000000000", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/orders/00000000-0000-4000-8000-000000000000", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Ver uma encomenda.
{
"data": {
"id": 961,
"number": "7794007796",
"status": "active",
"date": "2026-10-31T14:20:18+02:00",
"amount": 2900.93,
"currency": "USD",
"payment_method": "M-Pesa",
"invoice_id": 3100,
"promo_code": null,
"items": [
{
"type": "service",
"id": 695,
"name": "Plano Pro",
"domain": "example.co.mz",
"status": "active",
"billing_cycle": "annually",
"first_payment": 2900.93,
"recurring_amount": 2900.93
}
]
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETListar as cotações
/v1/quotes
https://api.mozout.com/v1/quotesPrecisa de billing:read. Só as cotações entregues à conta.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
status | consulta | string | não | Filtra pelo estado: delivered, accepted, lost ou dead. |
page | consulta | integer | não | O número da página. A primeira é a 1. |
per_page | consulta | integer | não | Resultados por página, de 1 a 100. Por omissão, 10. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/quotes" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/quotes');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/quotes", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/quotes", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Listar as cotações.
{
"data": [
{
"id": 15,
"subject": "Website",
"status": "delivered",
"created_at": "2026-10-01",
"sent_at": "2026-10-01",
"valid_until": "2026-11-01",
"accepted_at": null,
"subtotal": 28000.0,
"tax": 4559.0,
"total": 32559.0,
"currency": "USD",
"url": "https://my.example.co.mz/viewquote.php?id=15&language=portuguese-mz¤cy=1"
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 1,
"total_pages": 1
}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}422
Alguns dados não são válidos.
{
"error": {
"code": "validation_failed",
"message": "Alguns dados não são válidos.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 422 | validation_failed | Alguns dados não são válidos. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETVer uma cotação
/v1/quotes/{id}
https://api.mozout.com/v1/quotes/{id}Precisa de billing:read. Com a proposta, as notas para si e as linhas.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id da cotação. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/quotes/00000000-0000-4000-8000-000000000000" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/quotes/00000000-0000-4000-8000-000000000000');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/quotes/00000000-0000-4000-8000-000000000000", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/quotes/00000000-0000-4000-8000-000000000000", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Ver uma cotação.
{
"data": {
"id": 15,
"subject": "Website",
"status": "delivered",
"created_at": "2026-10-01",
"sent_at": "2026-10-01",
"valid_until": "2026-11-01",
"accepted_at": null,
"subtotal": 28000.0,
"tax": 4559.0,
"total": 32559.0,
"currency": "USD",
"url": "https://my.example.co.mz/viewquote.php?id=15&language=portuguese-mz¤cy=1",
"proposal": "Proposal text",
"notes": "Notes for you",
"items": [
{
"id": 1,
"description": "Website",
"quantity": 1.0,
"unit_price": 28000.0,
"discount_percent": 0.0,
"taxed": true
}
]
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETVer os ciclos de renovação de um serviço
/v1/services/{id}/billing-cycles
https://api.mozout.com/v1/services/{id}/billing-cyclesPrecisa de billing:read. Só os ciclos à venda, com o preço de cada renovação. Um ciclo em que uma opção paga do serviço não tem preço não está à venda. Nada muda. blocked_reason diz porque não se pode mudar agora: service_not_active, vps_not_supported, no_cycles, custom_price ou invoice_open. Com vps_not_supported ou custom_price, cycles vem vazio: trate a mudança no portal ou com o suporte.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id do serviço. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycles" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycles');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycles", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycles", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Ver os ciclos de renovação de um serviço.
{
"data": {
"service_id": 695,
"current_cycle": "monthly",
"current_amount": 350.0,
"currency": "USD",
"next_due_date": "2026-12-20",
"can_change": true,
"blocked_reason": null,
"invoice_id": null,
"cycles": [
{
"cycle": "annually",
"amount": 3500.0,
"current": false
}
]
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
PUTMudar o ciclo da próxima renovação
/v1/services/{id}/billing-cycle
https://api.mozout.com/v1/services/{id}/billing-cyclePrecisa de billing:write. Nada se cobra agora e a próxima data de vencimento não muda. Indique em expected_amount o preço da consulta: se tiver mudado, responde 409 com price_changed. Um VPS ou servidor responde 409 com vps_not_supported, e um serviço cujo valor não bate com o preço de lista do ciclo actual responde 409 com custom_price: trate-os no portal ou com o suporte. Limite de 20 por minuto.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:write.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id do serviço. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Corpo do pedido
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cycle | string: monthly, quarterly, semi_annually, annually, biennially, triennially | sim | |
expected_amount | number | sim | O preço da consulta. |
Exemplos
curl
curl -X PUT "https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt" \
-H "Content-Type: application/json" \
-d '{"cycle": "annually", "expected_amount": 3500.0}'PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => '{"cycle": "annually", "expected_amount": 3500.0}',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
'Content-Type: application/json',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
payload = {"cycle": "annually", "expected_amount": 3500.0}
r = requests.put("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle", headers=headers, json=payload, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/billing-cycle", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
"Content-Type": "application/json",
},
body: JSON.stringify({"cycle": "annually", "expected_amount": 3500.0}),
});
console.log(response.status);
console.log(await response.text());Respostas
200
Mudar o ciclo da próxima renovação.
{
"data": {
"service_id": 695,
"previous_cycle": "monthly",
"cycle": "annually",
"amount": 3500.0,
"currency": "USD",
"applies_from": "2026-12-20",
"simulated": true
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}409
A operação não se pode fazer no estado actual. Veja details.reason.
{
"error": {
"code": "conflict",
"message": "This operation only works on an active domain.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"reason": "domain_not_active"
}
}
}422
Alguns dados não são válidos.
{
"error": {
"code": "validation_failed",
"message": "Alguns dados não são válidos.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}502
O serviço por trás da API não respondeu como esperado.
{
"error": {
"code": "upstream_error",
"message": "The service did not respond as expected. Please try again later.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 409 | conflict | A operação não se pode fazer no estado actual. Veja details.reason. |
| 422 | validation_failed | Alguns dados não são válidos. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 502 | upstream_error | O serviço por trás da API não respondeu como esperado. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
GETObter a ligação de upgrade de um serviço
/v1/services/{id}/upgrade-link
https://api.mozout.com/v1/services/{id}/upgrade-linkPrecisa de billing:read. Nessa página escolhe o plano novo e vê o valor antes de pagar. Aqui nada muda.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: billing:read.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id do serviço. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Exemplos
curl
curl "https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/upgrade-link" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt"PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/upgrade-link');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
}
r = requests.get("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/upgrade-link", headers=headers, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/upgrade-link", {
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
},
});
console.log(response.status);
console.log(await response.text());Respostas
200
Obter a ligação de upgrade de um serviço.
{
"data": {
"service_id": 695,
"url": "https://my.example.co.mz/onestep/upgrade/695?language=portuguese-mz¤cy=1"
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}409
A operação não se pode fazer no estado actual. Veja details.reason.
{
"error": {
"code": "conflict",
"message": "This operation only works on an active domain.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"reason": "domain_not_active"
}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 409 | conflict | A operação não se pode fazer no estado actual. Veja details.reason. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
POSTPedir o cancelamento de um serviço
/v1/services/{id}/cancellation
https://api.mozout.com/v1/services/{id}/cancellationPrecisa de services:cancel. Sempre no fim do período pago, nunca de imediato. O serviço continua activo até service_ends_at. Um serviço sem período pago em curso responde 409 com no_period_end: fale com o suporte. As facturas por pagar do serviço podem ser canceladas. Limite de 5 por hora.
Autenticação
Precisa de uma chave válida no cabeçalho Authorization: Bearer. Permissão necessária: services:cancel.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | caminho | string | sim | O id do serviço. |
X-API-Mode | cabeçalho | string: sandbox, production | não | Opcional. Se não coincidir com o modo da chave, o pedido é recusado com invalid_request e a razão mode_mismatch. Serve para garantir que um programa nunca corre com a chave errada. |
Idempotency-Key | cabeçalho | string | não | Identificador único deste pedido, para o repetir sem o duplicar. |
Corpo do pedido
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
reason | string | sim | O motivo do cancelamento. |
confirm | string | sim | O domínio do serviço ou, se não tiver, o nome do plano. |
type | string: end_of_billing_period | não |
Exemplos
curl
curl -X POST "https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation" \
-H "Authorization: Bearer $RLX_API_KEY" \
-H "Accept-Language: pt" \
-H "Idempotency-Key: 9f1c2d3e-example" \
-H "Content-Type: application/json" \
-d '{"reason": "I no longer need this plan", "confirm": "example.co.mz"}'PHP
<?php
$ch = curl_init('https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"reason": "I no longer need this plan", "confirm": "example.co.mz"}',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('RLX_API_KEY'),
'Accept-Language: pt',
'Idempotency-Key: 9f1c2d3e-example',
'Content-Type: application/json',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;Python
import os
import requests
headers = {
"Authorization": "Bearer " + os.environ["RLX_API_KEY"],
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
}
payload = {"reason": "I no longer need this plan", "confirm": "example.co.mz"}
r = requests.post("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation", headers=headers, json=payload, timeout=30)
print(r.status_code)
print(r.text)JavaScript
const response = await fetch("https://api.mozout.com/v1/services/00000000-0000-4000-8000-000000000000/cancellation", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RLX_API_KEY}`,
"Accept-Language": "pt",
"Idempotency-Key": "9f1c2d3e-example",
"Content-Type": "application/json",
},
body: JSON.stringify({"reason": "I no longer need this plan", "confirm": "example.co.mz"}),
});
console.log(response.status);
console.log(await response.text());Respostas
201
Pedir o cancelamento de um serviço.
{
"data": {
"status": "requested",
"service_id": 695,
"type": "end_of_billing_period",
"service_ends_at": "2026-12-20",
"simulated": false
},
"meta": {}
}| Cabeçalho | Descrição |
|---|---|
X-Correlation-ID | Identificador deste pedido. Indique-o ao suporte se comunicar um problema. |
X-RateLimit-Limit | Pedidos permitidos por minuto. |
X-RateLimit-Remaining | Pedidos que restam no minuto actual. |
X-RateLimit-Reset | Quando acaba o minuto, em segundos Unix. |
X-API-Mode | O modo da chave que fez o pedido: sandbox ou production. |
401
A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta.
{
"error": {
"code": "unauthorized",
"message": "Chave da API em falta ou inválida.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}403
A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed).
{
"error": {
"code": "insufficient_scope",
"message": "Esta chave não tem a permissão necessária.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"required": "dns:read"
}
}
}404
Não encontrado.
{
"error": {
"code": "not_found",
"message": "Não encontrado.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}409
A operação não se pode fazer no estado actual. Veja details.reason.
{
"error": {
"code": "conflict",
"message": "This operation only works on an active domain.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"reason": "domain_not_active"
}
}
}422
Alguns dados não são válidos.
{
"error": {
"code": "validation_failed",
"message": "Alguns dados não são válidos.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}429
Demasiados pedidos. Espere o tempo indicado em Retry-After.
{
"error": {
"code": "rate_limited",
"message": "Demasiados pedidos. Tente de novo daqui a pouco.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {
"retry_after": 42
}
}
}| Cabeçalho | Descrição |
|---|---|
Retry-After | Segundos a esperar antes de tentar de novo. |
500
Ocorreu um erro interno. Indique o correlation_id ao suporte.
{
"error": {
"code": "internal_error",
"message": "Ocorreu um erro interno. Indique o correlation_id ao suporte.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}502
O serviço por trás da API não respondeu como esperado.
{
"error": {
"code": "upstream_error",
"message": "The service did not respond as expected. Please try again later.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}503
A API está desligada.
{
"error": {
"code": "disabled",
"message": "A API está desligada de momento.",
"correlation_id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"details": {}
}
}Erros
| Estado | Código | Significado |
|---|---|---|
| 401 | unauthorized | A chave está em falta, não é válida, foi revogada ou passou da validade, ou quem a criou já não tem acesso à conta. |
| 403 | forbidden, insufficient_scope, ip_not_allowed | A conta não pode usar a API (forbidden), a chave não tem a permissão necessária (insufficient_scope), ou o endereço IP não está na lista da chave (ip_not_allowed). |
| 404 | not_found | Não encontrado. |
| 409 | conflict | A operação não se pode fazer no estado actual. Veja details.reason. |
| 422 | validation_failed | Alguns dados não são válidos. |
| 429 | rate_limited | Demasiados pedidos. Espere o tempo indicado em Retry-After. |
| 500 | internal_error | Ocorreu um erro interno. Indique o correlation_id ao suporte. |
| 502 | upstream_error | O serviço por trás da API não respondeu como esperado. |
| 503 | disabled | A API está desligada. |
O formato dos erros está explicado em Erros.
Nenhuma operação encontrada.