Referencia para desarrolladores

Inteligencia y validación de números de teléfono

Consulta la documentación de la API de Inteligencia y validación de números de teléfono, con parámetros de solicitud, campos de respuesta, ejemplos de código y gestión de errores para integraciones con DomScan.

Inteligencia y validación de números de teléfono

Analiza, valida, clasifica y da formato a números de teléfono de todo el mundo, y añade datos sin conexión sobre ubicación, zona horaria, operador original del prefijo, marcación, números cortos y asignaciones del regulador cuando estén disponibles.

Campos de inteligencia sin conexión

El objeto intelligence puede incluir la ubicación y las zonas horarias inferidas del prefijo, el operador original, indicaciones de marcación, señales sobre números cortos y asignaciones coincidentes del regulador. Utiliza Google libphonenumber y copias públicas de datos de reguladores sin consultar a un operador ni a un proveedor de datos de telecomunicaciones.

Fuentes y atribución

Cada resultado enumera las fuentes sin conexión que utilizó, incluida la versión o fecha de la copia, la licencia o base para la reutilización, la URL de la fuente y la atribución, cuando se proporcionan. Las copias oficiales de asignaciones cubren actualmente España (CNMC), Francia (ARCEP), Alemania (Bundesnetzagentur), Japón (MIC), Austria (RTR), Noruega (Nkom), Polonia (UKE), Taiwán (MODA), Estados Unidos (NANPA) y Canadá (CNA/CNAC). Los datos de Estados Unidos y Canadá corresponden al estado de los códigos de central NPA-NXX, no a una consulta en tiempo real del operador ni de portabilidad numérica. Otros países reciben metadatos mundiales de numeración sin conexión, y coverage.level distingue los metadatos de los datos oficiales de asignación.

Privacidad desde el diseño: DomScan solo envía el número a su propio Edge Relay para procesarlo localmente. El relay no realiza solicitudes a terceros durante la consulta, no conserva el número y no devuelve la identidad del abonado.
Degradación controlada: Si el enriquecimiento sin conexión no está disponible, la validación se completa igualmente con el resultado local del plan de numeración. Comprueba intelligence.status e intelligence.sources antes de depender de un campo opcional.
Validación del plan de numeración, no verificación en tiempo real: DomScan comprueba el formato, los rangos documentados y los metadatos sin conexión. Una ubicación es un área del plan de numeración, no una posición física. Un operador o titular de una asignación es la asociación original del rango, no necesariamente el operador actual después de una portabilidad. El resultado no confirma la asignación, la actividad, la accesibilidad, la entrega de SMS ni la identidad del abonado.
POST /v1/phone/validate

Campos de respuesta

Campo Tipo
input string
normalized_input string
kind string
valid boolean
possible boolean
status string
recommendation string
validation_level string
reason string | null
warnings[] string[]
number object
number.e164 string
number.international string
number.national string
number.rfc3966 string
number.national_number string
number.extension string | null
number.country string | null
number.country_name string | null
number.country_calling_code string
number.possible_countries[] string[]
number.country_match boolean | null
number.type string
number.non_geographic boolean
live_checks object
live_checks.assignment string
live_checks.reachability string
live_checks.current_carrier string
live_checks.subscriber_identity string
live_checks.porting string
privacy object
privacy.upstream_requests integer
privacy.telecom_provider_queried boolean
privacy.persisted boolean
privacy.domscan_edge_relay_used boolean
privacy.third_party_requests integer
intelligence object
intelligence.status string
intelligence.kind string | null
intelligence.reason string | null
intelligence.coverage object
intelligence.coverage.country string | null
intelligence.coverage.level string
intelligence.coverage.global_numbering_metadata boolean
intelligence.coverage.official_snapshot_available boolean
intelligence.coverage.official_allocation_match boolean
intelligence.coverage.official_source_ids[] string[]
intelligence.coverage.matching_source_ids[] string[]
intelligence.coverage.current_carrier_lookup boolean
intelligence.location object
intelligence.location.label string | null
intelligence.location.country_name string | null
intelligence.location.country string | null
intelligence.location.language string
intelligence.location.granularity string
intelligence.location.current_physical_location boolean
intelligence.possible_time_zones object
intelligence.possible_time_zones.values[] string[]
intelligence.possible_time_zones.current_location boolean
intelligence.possible_time_zones.inference string
intelligence.original_prefix_carrier object
intelligence.original_prefix_carrier.name string | null
intelligence.original_prefix_carrier.source_id string | null
intelligence.original_prefix_carrier.evidence string
intelligence.original_prefix_carrier.current_carrier boolean
intelligence.original_prefix_carrier.portability_may_change_carrier boolean
intelligence.portability object
intelligence.portability.region_supported boolean
intelligence.portability.current_port_checked boolean
intelligence.dialing object
intelligence.dialing.from_country string | null
intelligence.dialing.international string | null
intelligence.dialing.mobile string | null
intelligence.dialing.internationally_diallable boolean
intelligence.number_details object
intelligence.number_details.geographical boolean
intelligence.number_details.geographical_area_code string | null
intelligence.number_details.geographical_area_code_length integer
intelligence.number_details.national_destination_code string | null
intelligence.number_details.national_destination_code_length integer
intelligence.number_details.subscriber_number_length integer
intelligence.number_details.mobile_token string | null
intelligence.service_signals object
intelligence.service_signals.number_type string
intelligence.service_signals.geographical boolean
intelligence.service_signals.toll_free boolean
intelligence.service_signals.premium_rate boolean
intelligence.service_signals.shared_cost boolean
intelligence.service_signals.voip boolean
intelligence.service_signals.personal_number boolean
intelligence.service_signals.likely_sms_capable boolean | null
intelligence.short_number object
intelligence.short_number.region string
intelligence.short_number.possible boolean
intelligence.short_number.valid boolean
intelligence.short_number.emergency boolean
intelligence.short_number.connects_to_emergency boolean
intelligence.short_number.sms_service boolean
intelligence.short_number.carrier_specific boolean
intelligence.short_number.expected_cost string
intelligence.regulator_allocations[] object[]
intelligence.regulator_allocations[] object
intelligence.regulator_allocations[].authority string
intelligence.regulator_allocations[].country string
intelligence.regulator_allocations[].matched_prefix string
intelligence.regulator_allocations[].matched_range_end string | null
intelligence.regulator_allocations[].match_kind string
intelligence.regulator_allocations[].category string
intelligence.regulator_allocations[].status string
intelligence.regulator_allocations[].original_assignee string | null
intelligence.regulator_allocations[].operator_code string | null
intelligence.regulator_allocations[].region string | null
intelligence.regulator_allocations[].service_description string | null
intelligence.regulator_allocations[].assigned_on string | null
intelligence.regulator_allocations[].effective_on string | null
intelligence.regulator_allocations[].expires_on string | null
intelligence.regulator_allocations[].current_operator boolean
intelligence.regulator_allocations[].portability_included boolean
intelligence.regulator_allocations[].individual_number_assignment_checked boolean
intelligence.regulator_allocations[].source_id string
intelligence.regulator_allocations[].source_file string | null
intelligence.regulator_allocations[].details object
intelligence.sources[] object[]
intelligence.sources[] object
intelligence.sources[].id string
intelligence.sources[].name string
intelligence.sources[].type string
intelligence.sources[].version string | null
intelligence.sources[].updated_at string | null
intelligence.sources[].retrieved_at string | null
intelligence.sources[].age_days integer | null
intelligence.sources[].record_count integer | null
intelligence.sources[].license string | null
intelligence.sources[].license_url string | null
intelligence.sources[].url string
intelligence.sources[].attribution string | null
intelligence.warnings[] string[]
intelligence.relay object
intelligence.relay.configured boolean
intelligence.relay.used boolean
intelligence.relay.persisted boolean
limitations[] string[]
metadata object
metadata.engine string
metadata.metadata_basis string
credits_used integer

Solicitud de ejemplo

curl -X POST "https://domscan.net/v1/phone/validate" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "phone": "+34 612 345 678",
  "default_country": "ES",
  "expected_country": "ES",
  "dialing_from_country": "ES",
  "language": "es"
}'

Respuesta de ejemplo

{
  "input": "string",
  "normalized_input": "string",
  "kind": "phone_number",
  "valid": true,
  "possible": true,
  "status": "valid",
  "recommendation": "accept",
  "validation_level": "numbering_plan",
  "reason": "DEFAULT_COUNTRY_REQUIRED",
  "warnings": [
    "COUNTRY_MISMATCH"
  ],
  "number": {
    "e164": "+34612345678",
    "international": "+34 612 34 56 78",
    "national": "612 34 56 78",
    "rfc3966": "tel:+34612345678",
    "national_number": "612345678",
    "extension": null,
    "country": "ES",
    "country_name": "Spain",
    "country_calling_code": "34",
    "possible_countries": [
      "ES"
    ],
    "country_match": true,
    "type": "fixed_line",
    "non_geographic": true
  },
  "live_checks": {
    "assignment": "not_checked",
    "reachability": "not_checked",
    "current_carrier": "not_checked",
    "subscriber_identity": "not_checked",
    "porting": "not_checked"
  },
  "privacy": {
    "upstream_requests": 0,
    "telecom_provider_queried": false,
    "persisted": false,
    "domscan_edge_relay_used": true,
    "third_party_requests": 0
  },
  "intelligence": {
    "status": "available",
    "kind": "phone_number",
    "reason": "string",
    "coverage": {
      "country": "US",
      "level": "global_numbering_metadata",
      "global_numbering_metadata": true,
      "official_snapshot_available": true,
      "official_allocation_match": true,
      "official_source_ids": [
        "string"
      ],
      "matching_source_ids": [
        "string"
      ],
      "current_carrier_lookup": false
    },
    "location": {
      "label": "Madrid",
      "country_name": "Spain",
      "country": "ES",
      "language": "es",
      "granularity": "numbering_plan_area",
      "current_physical_location": false
    },
    "possible_time_zones": {
      "values": [
        "Europe/Madrid"
      ],
      "current_location": false,
      "inference": "number_prefix"
    },
    "original_prefix_carrier": {
      "name": "Vodafone",
      "source_id": "nanpa_us",
      "evidence": "offline_prefix_metadata",
      "current_carrier": false,
      "portability_may_change_carrier": true
    },
    "portability": {
      "region_supported": true,
      "current_port_checked": false
    },
    "dialing": {
      "from_country": "US",
      "international": "011 34 612 34 56 78",
      "mobile": "+34 612 34 56 78",
      "internationally_diallable": true
    },
    "number_details": {
      "geographical": true,
      "geographical_area_code": "string",
      "geographical_area_code_length": 1,
      "national_destination_code": "string",
      "national_destination_code_length": 1,
      "subscriber_number_length": 1,
      "mobile_token": "string"
    },
    "service_signals": {
      "number_type": "fixed_line",
      "geographical": true,
      "toll_free": true,
      "premium_rate": true,
      "shared_cost": true,
      "voip": "198.51.100.10",
      "personal_number": true,
      "likely_sms_capable": true
    },
    "short_number": {
      "region": "ES",
      "possible": true,
      "valid": true,
      "emergency": true,
      "connects_to_emergency": true,
      "sms_service": true,
      "carrier_specific": true,
      "expected_cost": "toll_free"
    },
    "regulator_allocations": [
      {
        "authority": "CNMC",
        "country": "ES",
        "matched_prefix": "912",
        "matched_range_end": "string",
        "match_kind": "prefix",
        "category": "geographic",
        "status": "assigned",
        "original_assignee": "Example Telecom",
        "operator_code": "string",
        "region": "Madrid",
        "service_description": "198.51.100.10",
        "assigned_on": "2026-04-15",
        "effective_on": "2026-04-15",
        "expires_on": "2026-04-15",
        "current_operator": false,
        "portability_included": false,
        "individual_number_assignment_checked": false,
        "source_id": "cnmc",
        "source_file": "string",
        "details": {}
      }
    ],
    "sources": [
      {
        "id": "google_libphonenumber",
        "name": "Google libphonenumber metadata",
        "type": "offline_metadata",
        "version": "9.0.34",
        "updated_at": "2026-04-15",
        "retrieved_at": "2026-04-15T12:00:00Z",
        "age_days": 1,
        "record_count": 1,
        "license": "Apache-2.0",
        "license_url": "https://example.com",
        "url": "https://example.com",
        "attribution": "string"
      }
    ],
    "warnings": [
      "string"
    ],
    "relay": {
      "configured": true,
      "used": true,
      "persisted": false
    }
  },
  "limitations": [
    "string"
  ],
  "metadata": {
    "engine": "libphonenumber-js/max",
    "metadata_basis": "Google libphonenumber numbering plans"
  },
  "credits_used": 1
}
POST /v1/phone/validate/bulk

Campos de respuesta

Campo Tipo
total integer
valid_count integer
possible_only_count integer
invalid_count integer
validation_level string
results[] object[]
results[] object
results[].input string
results[].normalized_input string
results[].kind string
results[].valid boolean
results[].possible boolean
results[].status string
results[].recommendation string
results[].validation_level string
results[].reason string | null
results[].warnings[] string[]
results[].number object
results[].number.e164 string
results[].number.international string
results[].number.national string
results[].number.rfc3966 string
results[].number.national_number string
results[].number.extension string | null
results[].number.country string | null
results[].number.country_name string | null
results[].number.country_calling_code string
results[].number.possible_countries[] string[]
results[].number.country_match boolean | null
results[].number.type string
results[].number.non_geographic boolean
results[].live_checks object
results[].live_checks.assignment string
results[].live_checks.reachability string
results[].live_checks.current_carrier string
results[].live_checks.subscriber_identity string
results[].live_checks.porting string
results[].privacy object
results[].privacy.upstream_requests integer
results[].privacy.telecom_provider_queried boolean
results[].privacy.persisted boolean
results[].privacy.domscan_edge_relay_used boolean
results[].privacy.third_party_requests integer
results[].intelligence object
results[].intelligence.status string
results[].intelligence.kind string | null
results[].intelligence.reason string | null
results[].intelligence.coverage object
results[].intelligence.coverage.country string | null
results[].intelligence.coverage.level string
results[].intelligence.coverage.global_numbering_metadata boolean
results[].intelligence.coverage.official_snapshot_available boolean
results[].intelligence.coverage.official_allocation_match boolean
results[].intelligence.coverage.official_source_ids[] string[]
results[].intelligence.coverage.matching_source_ids[] string[]
results[].intelligence.coverage.current_carrier_lookup boolean
results[].intelligence.location object
results[].intelligence.location.label string | null
results[].intelligence.location.country_name string | null
results[].intelligence.location.country string | null
results[].intelligence.location.language string
results[].intelligence.location.granularity string
results[].intelligence.location.current_physical_location boolean
results[].intelligence.possible_time_zones object
results[].intelligence.possible_time_zones.values[] string[]
results[].intelligence.possible_time_zones.current_location boolean
results[].intelligence.possible_time_zones.inference string
results[].intelligence.original_prefix_carrier object
results[].intelligence.original_prefix_carrier.name string | null
results[].intelligence.original_prefix_carrier.source_id string | null
results[].intelligence.original_prefix_carrier.evidence string
results[].intelligence.original_prefix_carrier.current_carrier boolean
results[].intelligence.original_prefix_carrier.portability_may_change_carrier boolean
results[].intelligence.portability object
results[].intelligence.portability.region_supported boolean
results[].intelligence.portability.current_port_checked boolean
results[].intelligence.dialing object
results[].intelligence.dialing.from_country string | null
results[].intelligence.dialing.international string | null
results[].intelligence.dialing.mobile string | null
results[].intelligence.dialing.internationally_diallable boolean
results[].intelligence.number_details object
results[].intelligence.number_details.geographical boolean
results[].intelligence.number_details.geographical_area_code string | null
results[].intelligence.number_details.geographical_area_code_length integer
results[].intelligence.number_details.national_destination_code string | null
results[].intelligence.number_details.national_destination_code_length integer
results[].intelligence.number_details.subscriber_number_length integer
results[].intelligence.number_details.mobile_token string | null
results[].intelligence.service_signals object
results[].intelligence.service_signals.number_type string
results[].intelligence.service_signals.geographical boolean
results[].intelligence.service_signals.toll_free boolean
results[].intelligence.service_signals.premium_rate boolean
results[].intelligence.service_signals.shared_cost boolean
results[].intelligence.service_signals.voip boolean
results[].intelligence.service_signals.personal_number boolean
results[].intelligence.service_signals.likely_sms_capable boolean | null
results[].intelligence.short_number object
results[].intelligence.short_number.region string
results[].intelligence.short_number.possible boolean
results[].intelligence.short_number.valid boolean
results[].intelligence.short_number.emergency boolean
results[].intelligence.short_number.connects_to_emergency boolean
results[].intelligence.short_number.sms_service boolean
results[].intelligence.short_number.carrier_specific boolean
results[].intelligence.short_number.expected_cost string
results[].intelligence.regulator_allocations[] object[]
results[].intelligence.regulator_allocations[] object
results[].intelligence.regulator_allocations[].authority string
results[].intelligence.regulator_allocations[].country string
results[].intelligence.regulator_allocations[].matched_prefix string
results[].intelligence.regulator_allocations[].matched_range_end string | null
results[].intelligence.regulator_allocations[].match_kind string
results[].intelligence.regulator_allocations[].category string
results[].intelligence.regulator_allocations[].status string
results[].intelligence.regulator_allocations[].original_assignee string | null
results[].intelligence.regulator_allocations[].operator_code string | null
results[].intelligence.regulator_allocations[].region string | null
results[].intelligence.regulator_allocations[].service_description string | null
results[].intelligence.regulator_allocations[].assigned_on string | null
results[].intelligence.regulator_allocations[].effective_on string | null
results[].intelligence.regulator_allocations[].expires_on string | null
results[].intelligence.regulator_allocations[].current_operator boolean
results[].intelligence.regulator_allocations[].portability_included boolean
results[].intelligence.regulator_allocations[].individual_number_assignment_checked boolean
results[].intelligence.regulator_allocations[].source_id string
results[].intelligence.regulator_allocations[].source_file string | null
results[].intelligence.regulator_allocations[].details object
results[].intelligence.sources[] object[]
results[].intelligence.sources[] object
results[].intelligence.sources[].id string
results[].intelligence.sources[].name string
results[].intelligence.sources[].type string
results[].intelligence.sources[].version string | null
results[].intelligence.sources[].updated_at string | null
results[].intelligence.sources[].retrieved_at string | null
results[].intelligence.sources[].age_days integer | null
results[].intelligence.sources[].record_count integer | null
results[].intelligence.sources[].license string | null
results[].intelligence.sources[].license_url string | null
results[].intelligence.sources[].url string
results[].intelligence.sources[].attribution string | null
results[].intelligence.warnings[] string[]
results[].intelligence.relay object
results[].intelligence.relay.configured boolean
results[].intelligence.relay.used boolean
results[].intelligence.relay.persisted boolean
results[].limitations[] string[]
results[].metadata object
results[].metadata.engine string
results[].metadata.metadata_basis string
credits_used integer

Solicitud de ejemplo

curl -X POST "https://domscan.net/v1/phone/validate/bulk" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "expected_country": "ES",
  "dialing_from_country": "US",
  "language": "en",
  "phones": [
    "+34 612 345 678",
    {
      "phone": "0491 570 006",
      "default_country": "AU",
      "expected_country": "AU",
      "dialing_from_country": "GB",
      "language": "en"
    },
    "+800 1234 5678"
  ]
}'

Respuesta de ejemplo

{
  "total": 1,
  "valid_count": 1,
  "possible_only_count": 1,
  "invalid_count": 1,
  "validation_level": "numbering_plan",
  "results": [
    {
      "input": "string",
      "normalized_input": "string",
      "kind": "phone_number",
      "valid": true,
      "possible": true,
      "status": "valid",
      "recommendation": "accept",
      "validation_level": "numbering_plan",
      "reason": "DEFAULT_COUNTRY_REQUIRED",
      "warnings": [
        "COUNTRY_MISMATCH"
      ],
      "number": {
        "e164": "+34612345678",
        "international": "+34 612 34 56 78",
        "national": "612 34 56 78",
        "rfc3966": "tel:+34612345678",
        "national_number": "612345678",
        "extension": null,
        "country": "ES",
        "country_name": "Spain",
        "country_calling_code": "34",
        "possible_countries": [
          "ES"
        ],
        "country_match": true,
        "type": "fixed_line",
        "non_geographic": true
      },
      "live_checks": {
        "assignment": "not_checked",
        "reachability": "not_checked",
        "current_carrier": "not_checked",
        "subscriber_identity": "not_checked",
        "porting": "not_checked"
      },
      "privacy": {
        "upstream_requests": 0,
        "telecom_provider_queried": false,
        "persisted": false,
        "domscan_edge_relay_used": true,
        "third_party_requests": 0
      },
      "intelligence": {
        "status": "available",
        "kind": "phone_number",
        "reason": "string",
        "coverage": {
          "country": "US",
          "level": "global_numbering_metadata",
          "global_numbering_metadata": true,
          "official_snapshot_available": true,
          "official_allocation_match": true,
          "official_source_ids": [
            "string"
          ],
          "matching_source_ids": [
            "string"
          ],
          "current_carrier_lookup": false
        },
        "location": {
          "label": "Madrid",
          "country_name": "Spain",
          "country": "ES",
          "language": "es",
          "granularity": "numbering_plan_area",
          "current_physical_location": false
        },
        "possible_time_zones": {
          "values": [
            "Europe/Madrid"
          ],
          "current_location": false,
          "inference": "number_prefix"
        },
        "original_prefix_carrier": {
          "name": "Vodafone",
          "source_id": "nanpa_us",
          "evidence": "offline_prefix_metadata",
          "current_carrier": false,
          "portability_may_change_carrier": true
        },
        "portability": {
          "region_supported": true,
          "current_port_checked": false
        },
        "dialing": {
          "from_country": "US",
          "international": "011 34 612 34 56 78",
          "mobile": "+34 612 34 56 78",
          "internationally_diallable": true
        },
        "number_details": {
          "geographical": true,
          "geographical_area_code": "string",
          "geographical_area_code_length": 1,
          "national_destination_code": "string",
          "national_destination_code_length": 1,
          "subscriber_number_length": 1,
          "mobile_token": "string"
        },
        "service_signals": {
          "number_type": "fixed_line",
          "geographical": true,
          "toll_free": true,
          "premium_rate": true,
          "shared_cost": true,
          "voip": "198.51.100.10",
          "personal_number": true,
          "likely_sms_capable": true
        },
        "short_number": {
          "region": "ES",
          "possible": true,
          "valid": true,
          "emergency": true,
          "connects_to_emergency": true,
          "sms_service": true,
          "carrier_specific": true,
          "expected_cost": "toll_free"
        },
        "regulator_allocations": [
          {
            "authority": "CNMC",
            "country": "ES",
            "matched_prefix": "912",
            "matched_range_end": "string",
            "match_kind": "prefix",
            "category": "geographic",
            "status": "assigned",
            "original_assignee": "Example Telecom",
            "operator_code": "string",
            "region": "Madrid",
            "service_description": "198.51.100.10",
            "assigned_on": "2026-04-15",
            "effective_on": "2026-04-15",
            "expires_on": "2026-04-15",
            "current_operator": false,
            "portability_included": false,
            "individual_number_assignment_checked": false,
            "source_id": "cnmc",
            "source_file": "string",
            "details": {}
          }
        ],
        "sources": [
          {
            "id": "google_libphonenumber",
            "name": "Google libphonenumber metadata",
            "type": "offline_metadata",
            "version": "9.0.34",
            "updated_at": "2026-04-15",
            "retrieved_at": "2026-04-15T12:00:00Z",
            "age_days": 1,
            "record_count": 1,
            "license": "Apache-2.0",
            "license_url": "https://example.com",
            "url": "https://example.com",
            "attribution": "string"
          }
        ],
        "warnings": [
          "string"
        ],
        "relay": {
          "configured": true,
          "used": true,
          "persisted": false
        }
      },
      "limitations": [
        "string"
      ],
      "metadata": {
        "engine": "libphonenumber-js/max",
        "metadata_basis": "Google libphonenumber numbering plans"
      }
    }
  ],
  "credits_used": 1
}