Ir al contenido
NovoDIDNovoDIDdocumentación
API públicaReferencia por operaciónComprar números

Crear un pago de un DID

Catálogo, cotización, pago y seguimiento de pedidos.

POST /api/v1/orders

Permiso: orders:create

Permiso: orders:create. Configure Idempotency-Key. Envíe un solo didId y quantity=1, con el ciclo y medio de pago cotizados. Incluya las confirmaciones de SMS únicamente con el consentimiento del cliente. Devuelve HTTP 201 con order. Para Pix, escanee qrCodeDataUrl o copie copyPaste; para tarjeta, abra checkoutUrl. Esta solicitud no cobra una tarjeta guardada. Tras un timeout, conserve la clave y consulte el pedido. 400: datos, clave o confirmación inválidos; 403: permiso o token restringido; 409: reserva pendiente del mismo DID o conflicto de clave. La reserva pendiente se aplica solo al DID elegido y dura como máximo 15 minutos desde la creación del pedido. Durante ese período se pueden comprar otros DIDs, respetando los límites de la cuenta. La reserva pendiente vence en un máximo de 15 minutos, incluso si falla la creación o el pedido requiere revisión. Esto no confirma una cancelación externa inmediata ni un reembolso. No pague instrucciones vencidas; un pago confirmado después del vencimiento se revisa sin sustituir otra reserva o asignación. Los pagos ya confirmados y los números activos siguen protegidos. En review_required, contacte a soporte con el ID. 503: resultado del pago no disponible. No repita automáticamente con una clave nueva.

Durante las ofertas temporales de números móviles, los ciclos disponibles y la inclusión de SMS pueden variar. Consulta siempre una cotización: did.smsEnabled indica si el plan incluye SMS, y acknowledgements.mobileMonthlySms.required indica si debes enviar mobileMonthlySmsAcknowledged=true después del consentimiento del cliente. A pesar del nombre, estos campos se aplican a cualquier ciclo móvil sin SMS. La cotización no garantiza la oferta; las condiciones se validan de nuevo al crear el pago. Los pagos emitidos durante la oferta conservan sus condiciones hasta el vencimiento del propio pago. Al finalizar la oferta, las nuevas compras siguen las condiciones vigentes; las suscripciones completadas conservan su ciclo y la condición de SMS en las renovaciones mientras sigan vigentes. Esto no garantiza el precio. Se mantienen los requisitos de cuenta, verificación, límites, disponibilidad y un número por pedido.

409 checkout_initializing indica que otra compra de la cuenta todavía se está preparando. Espere unos instantes y repita con la misma Idempotency-Key y el mismo cuerpo. Esta espera solo aplica a la creación, no al plazo de 15 minutos para pagar.

409 order_expired indica que la respuesta de creación llegó después del plazo del pedido. No se devuelve un código QR ni un enlace vencido. Consulte details.orderId antes de iniciar otra compra y no pague instrucciones anteriores.

Cuando una cuenta está en revisión de seguridad, las consultas y operaciones se bloquean con HTTP 403 y código account_security_review, incluso con tokens emitidos previamente. No intente eludir la restricción ni repetir automáticamente. El acceso se restablece después de la liberación administrativa; se mantienen los demás límites y restricciones. Los webhooks pendientes y los eventos del período se suprimen sin reenvío automático. La facturación y los vencimientos siguen las reglas existentes. Siga la revisión en https://novodid.com/seguranca/atendimento. Solo el ticket vinculado a la revisión permite lectura, respuestas y archivos adjuntos en el sitio autenticado. Los demás tickets y la API pública continúan bloqueados. El cliente debe esperar el primer mensaje del equipo y puede enviar una sola respuesta por cada nuevo mensaje del soporte, incluidos los archivos solicitados.

HTTP 409 did_number_unavailable: no fue posible confirmar el teléfono seleccionado antes de crear el pago. Consulte el pedido indicado en error.details.orderId y actualice el catálogo antes de reintentar; no cree otro pago sin revisar el pedido anterior.

Cuerpo de la solicitud

{
  "didId": 1234,
  "quantity": 1,
  "cycle": "monthly",
  "paymentMethod": "pix",
  "fixedDidSmsAcknowledged": true
}

Respuesta exitosa (201)

{
  "order": {
    "id": "11111111-1111-4111-8111-111111111111",
    "didId": 1234,
    "quantity": 1,
    "status": "awaiting_payment",
    "paymentMethod": "pix",
    "currency": "BRL",
    "amount": 1499,
    "createdAt": "2026-09-23T15:00:00.000Z",
    "expiresAt": "2026-09-23T15:15:00.000Z",
    "checkoutUrl": null,
    "pix": {
      "copyPaste": "PIX_COPY_AND_PASTE_EXAMPLE",
      "qrCodeDataUrl": "data:image/png;base64,EXAMPLE"
    }
  }
}

Ejemplo de error

{
  "error": {
    "code": "checkout_in_progress",
    "message": "Este número já tem um pedido pendente. A reserva dura até 15 minutos. Você pode escolher outro número."
  }
}

curl

curl -X POST \
  -H "Idempotency-Key: order_example_20260923_01" \
  -H "Authorization: Bearer $NOVODID_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"didId":1234,"quantity":1,"cycle":"monthly","paymentMethod":"pix","fixedDidSmsAcknowledged":true}' \
  "https://novodid.com/api/v1/orders"

Node

const response = await fetch("https://novodid.com/api/v1/orders", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.NOVODID_API_TOKEN}`,
    "Idempotency-Key": "order_example_20260923_01",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
  "didId": 1234,
  "quantity": 1,
  "cycle": "monthly",
  "paymentMethod": "pix",
  "fixedDidSmsAcknowledged": true
})
});
const payload = await response.json();

if (!response.ok) {
  throw new Error(payload.error?.message || "Erro na API NovoDID");
}

console.log({ status: response.status });

Python

import os
import requests

response = requests.post(
    "https://novodid.com/api/v1/orders",
    headers={"Idempotency-Key": "order_example_20260923_01", "Authorization": f"Bearer {os.environ['NOVODID_API_TOKEN']}"},
    json={
  "didId": 1234,
  "quantity": 1,
  "cycle": "monthly",
  "paymentMethod": "pix",
  "fixedDidSmsAcknowledged": True
},
    timeout=30,
)

payload = response.json()
response.raise_for_status()
print({"status": response.status_code})

Go

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
    "strings"
)

func main() {
    req, err := http.NewRequest("POST", "https://novodid.com/api/v1/orders", strings.NewReader(`{"didId":1234,"quantity":1,"cycle":"monthly","paymentMethod":"pix","fixedDidSmsAcknowledged":true}`))
    if err != nil {
        panic(err)
    }

    req.Header.Set("Idempotency-Key", "order_example_20260923_01")
    req.Header.Set("Authorization", "Bearer "+os.Getenv("NOVODID_API_TOKEN"))
    req.Header.Set("Content-Type", "application/json")

    res, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    _, _ = io.Copy(io.Discard, res.Body)
    if res.StatusCode >= 300 {
        panic(fmt.Sprintf("NovoDID API HTTP %d", res.StatusCode))
    }

    fmt.Println(res.StatusCode)
}

Rust

use serde_json::json;
use reqwest::blocking::Client;
use std::env;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let response = client
        .post("https://novodid.com/api/v1/orders")
        .header("Idempotency-Key", "order_example_20260923_01")
        .bearer_auth(env::var("NOVODID_API_TOKEN")?)
        .json(&json!({
  "didId": 1234,
  "quantity": 1,
  "cycle": "monthly",
  "paymentMethod": "pix",
  "fixedDidSmsAcknowledged": true
}))
        .send()?;

    let status = response.status();
    let _payload = response.text()?;
    if !status.is_success() {
        return Err(format!("NovoDID API HTTP {}", status).into());
    }

    println!("HTTP {}", status);
    Ok(())
}

PHP

<?php

$ch = curl_init("https://novodid.com/api/v1/orders");

curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => [
    "Idempotency-Key: order_example_20260923_01",
    "Authorization: Bearer " . getenv("NOVODID_API_TOKEN"),
    "Content-Type: application/json"
  ],
  CURLOPT_POSTFIELDS => '{"didId":1234,"quantity":1,"cycle":"monthly","paymentMethod":"pix","fixedDidSmsAcknowledged":true}',
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($response === false || $status >= 300) {
  throw new RuntimeException("NovoDID API HTTP " . $status);
}

echo $status . PHP_EOL;

Ruby

require "net/http"

uri = URI("https://novodid.com/api/v1/orders")
request = Net::HTTP::Post.new(uri)
request["Idempotency-Key"] = "order_example_20260923_01"
request["Authorization"] = "Bearer #{ENV.fetch("NOVODID_API_TOKEN")}"
request["Content-Type"] = "application/json"
request.body = %q({"didId":1234,"quantity":1,"cycle":"monthly","paymentMethod":"pix","fixedDidSmsAcknowledged":true})

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end

raise "NovoDID API HTTP #{response.code}" unless response.is_a?(Net::HTTPSuccess)

puts response.code

C#

using System.Net.Http.Headers;
using System.Text;

using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://novodid.com/api/v1/orders");

request.Headers.Add("Idempotency-Key", "order_example_20260923_01");
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Bearer",
    Environment.GetEnvironmentVariable("NOVODID_API_TOKEN")
);

request.Content = new StringContent(
    """
{
  "didId": 1234,
  "quantity": 1,
  "cycle": "monthly",
  "paymentMethod": "pix",
  "fixedDidSmsAcknowledged": true
}
""",
    Encoding.UTF8,
    "application/json"
);

using var response = await client.SendAsync(request);
var payload = await response.Content.ReadAsStringAsync();

response.EnsureSuccessStatusCode();
Console.WriteLine(response.StatusCode);

En esta página