{"id":772,"date":"2026-09-02T08:28:51","date_gmt":"2026-09-02T08:28:51","guid":{"rendered":"https:\/\/junglelabs.uk\/"},"modified":"2026-09-02T08:53:59","modified_gmt":"2026-09-02T08:53:59","slug":"ip-resource-readiness-checker","status":"publish","type":"page","link":"https:\/\/junglelabs.uk\/fr\/ip-resource-readiness-checker\/","title":{"rendered":"V\u00e9rificateur de disponibilit\u00e9 des ressources IP"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"772\" class=\"elementor elementor-772\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ac5cd3b e-con-full e-flex e-con e-parent\" data-id=\"ac5cd3b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e95419b elementor-widget elementor-widget-html\" data-id=\"e95419b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!doctype html>\r\n<html lang=\"en\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n  <title>IPv4 &amp; IPv6 Transfer Readiness Checker | Registry, BGP, IRR and RPKI<\/title>\r\n  <meta name=\"description\" content=\"Check an IPv4 or IPv6 prefix for its RIR, registration object, origin ASN, IRR route object, RPKI ROA, BGP visibility, routing consistency and public abuse contact.\">\r\n  <meta name=\"robots\" content=\"index,follow,max-image-preview:large\">\r\n  <script type=\"application\/ld+json\">\r\n  {\r\n    \"@context\": \"https:\/\/schema.org\",\r\n    \"@type\": \"WebApplication\",\r\n    \"name\": \"IPv4 and IPv6 Transfer Readiness Checker\",\r\n    \"applicationCategory\": \"NetworkApplication\",\r\n    \"operatingSystem\": \"Any\",\r\n    \"description\": \"A technical pre-check for IPv4 and IPv6 registry, BGP, IRR, RPKI and operational contact data.\"\r\n  }\r\n  <\/script>\r\n  <style>\r\n    :root {\r\n      --rtc-navy: #061f39;\r\n      --rtc-navy-2: #0b365f;\r\n      --rtc-blue: #0e6dce;\r\n      --rtc-cyan: #45b9ed;\r\n      --rtc-ink: #263c50;\r\n      --rtc-muted: #64798c;\r\n      --rtc-line: #d7e4ef;\r\n      --rtc-soft: #f4f8fc;\r\n      --rtc-white: #fff;\r\n      --rtc-green: #0a7a55;\r\n      --rtc-green-soft: #e9f8f2;\r\n      --rtc-amber: #9a5b08;\r\n      --rtc-amber-soft: #fff6e7;\r\n      --rtc-red: #b33a42;\r\n      --rtc-red-soft: #fff0f1;\r\n      --rtc-shadow: 0 18px 50px rgba(12, 44, 73, .12);\r\n    }\r\n\r\n    * { box-sizing: border-box; }\r\n    html { scroll-behavior: smooth; }\r\n    body {\r\n      margin: 0;\r\n      background: #eef4f8;\r\n      color: var(--rtc-ink);\r\n      font-family: Arial, Helvetica, sans-serif;\r\n      font-size: 16px;\r\n      font-weight: 400;\r\n      line-height: 1.7;\r\n    }\r\n    button, input { font: inherit; }\r\n    a { color: var(--rtc-blue); }\r\n    code { font-family: Consolas, \"Liberation Mono\", monospace; }\r\n    [hidden] { display: none !important; }\r\n\r\n    .rtc-page { width: min(1180px, calc(100% - 32px)); margin: 30px auto 70px; }\r\n    .rtc-shell { overflow: hidden; border: 1px solid var(--rtc-line); border-radius: 22px; background: var(--rtc-white); box-shadow: var(--rtc-shadow); }\r\n\r\n    .rtc-hero {\r\n      position: relative;\r\n      overflow: hidden;\r\n      padding: 52px 54px 48px;\r\n      background: linear-gradient(125deg, #051c34 0%, #0a3f73 58%, #0d75d2 135%);\r\n      color: var(--rtc-white);\r\n    }\r\n    .rtc-hero::before {\r\n      position: absolute;\r\n      top: -165px;\r\n      right: -65px;\r\n      width: 420px;\r\n      height: 420px;\r\n      border: 1px solid rgba(195, 232, 255, .27);\r\n      border-radius: 50%;\r\n      box-shadow: 0 0 0 42px rgba(195, 232, 255, .055), 0 0 0 84px rgba(195, 232, 255, .035);\r\n      content: \"\";\r\n    }\r\n    .rtc-hero-inner { position: relative; z-index: 1; max-width: 900px; }\r\n    .rtc-eyebrow { display: block; margin-bottom: 12px; color: #a9ddff; font-size: 12px; font-weight: 700; letter-spacing: .15em; }\r\n    .rtc-hero h1 { margin: 0 0 15px; color: #fff; font-size: clamp(34px, 5.2vw, 58px); font-weight: 700; letter-spacing: -.025em; line-height: 1.08; }\r\n    .rtc-hero p { max-width: 810px; margin: 0; color: #e3f3ff; font-size: 18px; font-weight: 400; line-height: 1.65; }\r\n    .rtc-source-chips { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 23px; }\r\n    .rtc-source-chips span { padding: 6px 10px; border: 1px solid rgba(194, 230, 255, .3); border-radius: 999px; background: rgba(3, 27, 51, .28); color: #dff2ff; font-size: 12px; font-weight: 600; }\r\n\r\n    .rtc-tool { padding: 38px 44px 46px; }\r\n    .rtc-form-label { display: block; margin: 0 0 9px; color: var(--rtc-navy); font-size: 16px; font-weight: 700; }\r\n    .rtc-input-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 11px; }\r\n    .rtc-prefix-input {\r\n      width: 100%;\r\n      min-height: 54px;\r\n      padding: 13px 16px;\r\n      border: 1px solid #b8ccdd;\r\n      border-radius: 10px;\r\n      outline: 0;\r\n      background: #fff;\r\n      color: #12283c;\r\n      font-family: Consolas, \"Liberation Mono\", monospace;\r\n      font-size: 16px;\r\n      transition: border-color .18s ease, box-shadow .18s ease;\r\n    }\r\n    .rtc-prefix-input:focus { border-color: var(--rtc-blue); box-shadow: 0 0 0 4px rgba(14, 109, 206, .12); }\r\n    .rtc-submit {\r\n      min-height: 54px;\r\n      padding: 13px 23px;\r\n      border: 0;\r\n      border-radius: 10px;\r\n      background: linear-gradient(135deg, #0b5db4, #1078dc);\r\n      box-shadow: 0 8px 18px rgba(14, 109, 206, .22);\r\n      color: #fff;\r\n      cursor: pointer;\r\n      font-size: 15px;\r\n      font-weight: 700;\r\n    }\r\n    .rtc-submit:hover { background: linear-gradient(135deg, #094f99, #0c68bf); }\r\n    .rtc-submit:disabled { cursor: wait; opacity: .68; }\r\n    .rtc-examples { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; color: var(--rtc-muted); font-size: 13px; }\r\n    .rtc-example { padding: 4px 8px; border: 1px solid var(--rtc-line); border-radius: 6px; background: #fff; color: #31506b; cursor: pointer; font-family: Consolas, \"Liberation Mono\", monospace; font-size: 12px; }\r\n    .rtc-example:hover { border-color: #8ebde7; background: #f3f9ff; }\r\n    .rtc-privacy { margin: 15px 0 0; color: var(--rtc-muted); font-size: 13px; line-height: 1.55; }\r\n\r\n    .rtc-notice { margin-top: 21px; padding: 15px 17px; border-left: 4px solid var(--rtc-blue); border-radius: 0 8px 8px 0; background: #edf6ff; color: #39556e; font-size: 14px; }\r\n    .rtc-error { margin-top: 18px; padding: 14px 16px; border: 1px solid #efb9be; border-radius: 9px; background: var(--rtc-red-soft); color: #8f2731; }\r\n\r\n    .rtc-loading { margin-top: 27px; padding: 21px; border: 1px solid var(--rtc-line); border-radius: 12px; background: var(--rtc-soft); }\r\n    .rtc-loading-head { display: flex; justify-content: space-between; gap: 16px; margin-bottom: 11px; color: var(--rtc-navy); font-size: 14px; font-weight: 700; }\r\n    .rtc-progress { height: 8px; overflow: hidden; border-radius: 999px; background: #dce8f2; }\r\n    .rtc-progress > span { display: block; width: 0; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--rtc-blue), var(--rtc-cyan)); transition: width .28s ease; }\r\n\r\n    .rtc-results { margin-top: 31px; }\r\n    .rtc-result-head { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 25px; align-items: center; padding: 24px; border: 1px solid var(--rtc-line); border-radius: 15px; background: #fbfdff; }\r\n    .rtc-score {\r\n      --rtc-score-value: 0;\r\n      display: grid;\r\n      width: 132px;\r\n      height: 132px;\r\n      place-items: center;\r\n      border-radius: 50%;\r\n      background: conic-gradient(var(--rtc-blue) calc(var(--rtc-score-value) * 1%), #dde8f1 0);\r\n    }\r\n    .rtc-score-inner { display: grid; width: 100px; height: 100px; place-items: center; border-radius: 50%; background: #fff; box-shadow: inset 0 0 0 1px var(--rtc-line); text-align: center; }\r\n    .rtc-score-number { display: block; color: var(--rtc-navy); font-size: 31px; font-weight: 700; line-height: 1; }\r\n    .rtc-score-label { display: block; margin-top: 4px; color: var(--rtc-muted); font-size: 11px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; }\r\n    .rtc-result-summary h2 { margin: 0 0 7px; color: var(--rtc-navy); font-size: 27px; line-height: 1.25; }\r\n    .rtc-result-summary p { margin: 0; color: var(--rtc-muted); font-size: 15px; }\r\n    .rtc-query { display: inline-block; margin-top: 10px; padding: 4px 8px; border-radius: 5px; background: #eaf3fb; color: #1e4d74; font-family: Consolas, \"Liberation Mono\", monospace; font-size: 13px; }\r\n    .rtc-completeness { margin-top: 10px; color: var(--rtc-muted); font-size: 13px; }\r\n\r\n    .rtc-issues { margin-top: 18px; padding: 18px 20px; border: 1px solid #f0c58c; border-radius: 11px; background: var(--rtc-amber-soft); }\r\n    .rtc-issues h3 { margin: 0 0 8px; color: #7e4805; font-size: 17px; }\r\n    .rtc-issues ul { margin: 0; padding-left: 20px; color: #805417; }\r\n    .rtc-issues li { margin: 4px 0; }\r\n\r\n    .rtc-card-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-top: 18px; }\r\n    .rtc-card { min-width: 0; padding: 19px; border: 1px solid var(--rtc-line); border-radius: 12px; background: #fff; }\r\n    .rtc-card-top { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; }\r\n    .rtc-card h3 { margin: 0; color: var(--rtc-navy); font-size: 17px; line-height: 1.35; }\r\n    .rtc-badge { flex: 0 0 auto; padding: 4px 8px; border-radius: 999px; font-size: 11px; font-weight: 700; line-height: 1.4; }\r\n    .rtc-badge--good { background: var(--rtc-green-soft); color: var(--rtc-green); }\r\n    .rtc-badge--warn { background: var(--rtc-amber-soft); color: var(--rtc-amber); }\r\n    .rtc-badge--bad { background: var(--rtc-red-soft); color: var(--rtc-red); }\r\n    .rtc-badge--neutral { background: #edf3f8; color: #536b80; }\r\n    .rtc-card-value { margin: 13px 0 6px; color: #17324a; font-size: 18px; font-weight: 600; overflow-wrap: anywhere; }\r\n    .rtc-card-detail { margin: 0; color: var(--rtc-muted); font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; }\r\n\r\n    .rtc-evidence { margin-top: 18px; border: 1px solid var(--rtc-line); border-radius: 12px; background: #fff; }\r\n    .rtc-evidence summary { padding: 16px 18px; color: var(--rtc-navy); cursor: pointer; font-weight: 700; }\r\n    .rtc-evidence-body { padding: 0 18px 18px; }\r\n    .rtc-evidence-links { display: flex; flex-wrap: wrap; gap: 9px; margin-bottom: 14px; }\r\n    .rtc-evidence-links a { padding: 7px 10px; border: 1px solid var(--rtc-line); border-radius: 7px; background: #f8fbfd; font-size: 13px; text-decoration: none; }\r\n    .rtc-raw { max-height: 420px; overflow: auto; margin: 0; padding: 16px; border-radius: 8px; background: #061e36; color: #dff2ff; font-size: 12px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }\r\n\r\n    .rtc-content { margin-top: 28px; padding: 42px 46px 48px; border: 1px solid var(--rtc-line); border-radius: 18px; background: #fff; box-shadow: 0 12px 34px rgba(12, 44, 73, .08); }\r\n    .rtc-content h2 { margin: 0 0 14px; color: var(--rtc-navy); font-size: 30px; line-height: 1.3; }\r\n    .rtc-content h3 { margin: 34px 0 10px; color: var(--rtc-navy); font-size: 22px; line-height: 1.4; }\r\n    .rtc-content p { margin: 0 0 19px; color: #30485c; font-size: 16px; font-weight: 400; line-height: 1.82; }\r\n    .rtc-content .rtc-faq { padding-top: 7px; }\r\n    .rtc-content details { margin: 10px 0; border: 1px solid var(--rtc-line); border-radius: 10px; background: #fbfdff; }\r\n    .rtc-content details summary { padding: 15px 17px; color: var(--rtc-navy); cursor: pointer; font-weight: 700; }\r\n    .rtc-content details p { margin: 0; padding: 0 17px 17px; font-size: 15px; }\r\n\r\n    .rtc-footer { margin-top: 22px; color: #768899; font-size: 12px; text-align: center; }\r\n\r\n    @media (max-width: 760px) {\r\n      .rtc-page { width: min(100% - 20px, 1180px); margin-top: 10px; }\r\n      .rtc-shell, .rtc-content { border-radius: 14px; }\r\n      .rtc-hero { padding: 35px 23px 33px; }\r\n      .rtc-hero p { font-size: 16px; }\r\n      .rtc-tool { padding: 27px 20px 31px; }\r\n      .rtc-input-row { grid-template-columns: 1fr; }\r\n      .rtc-submit { width: 100%; }\r\n      .rtc-result-head { grid-template-columns: 1fr; text-align: center; }\r\n      .rtc-score { margin: 0 auto; }\r\n      .rtc-card-grid { grid-template-columns: 1fr; }\r\n      .rtc-content { padding: 31px 21px 34px; }\r\n      .rtc-content h2 { font-size: 26px; }\r\n    }\r\n\r\n    \/* Editorial \/ technical-report visual treatment. *\/\r\n    body { background: #ffffff; }\r\n    .rtc-page { width: min(1080px, calc(100% - 40px)); margin: 46px auto 70px; }\r\n    .rtc-shell { overflow: visible; border: 0; border-radius: 0; box-shadow: none; }\r\n    .rtc-hero {\r\n      padding: 0 0 31px;\r\n      border-bottom: 3px solid var(--rtc-navy);\r\n      background: #ffffff;\r\n      color: var(--rtc-ink);\r\n    }\r\n    .rtc-hero::before { display: none; }\r\n    .rtc-hero-inner { max-width: 930px; }\r\n    .rtc-eyebrow { margin-bottom: 15px; color: var(--rtc-blue); font-size: 11px; letter-spacing: .16em; }\r\n    .rtc-hero h1 { max-width: 900px; margin-bottom: 14px; color: #101820; font-size: clamp(34px, 5vw, 50px); font-weight: 700; line-height: 1.1; }\r\n    .rtc-hero p { max-width: 860px; color: #4e5f6e; font-size: 17px; line-height: 1.65; }\r\n    .rtc-source-chips { gap: 0; margin-top: 19px; color: #667786; }\r\n    .rtc-source-chips::before { margin-right: 8px; color: #293e50; content: \"Data sources:\"; font-size: 12px; font-weight: 700; }\r\n    .rtc-source-chips span { padding: 0; border: 0; border-radius: 0; background: transparent; color: #667786; font-size: 12px; font-weight: 400; }\r\n    .rtc-source-chips span:not(:last-child)::after { margin: 0 7px; content: \"\u00b7\"; }\r\n\r\n    .rtc-tool { padding: 31px 0 0; }\r\n    .rtc-form-label { font-size: 15px; }\r\n    .rtc-input-row { grid-template-columns: minmax(0, 1fr) 210px; gap: 8px; max-width: 820px; }\r\n    .rtc-prefix-input { min-height: 50px; border-color: #aebdca; border-radius: 3px; box-shadow: none; }\r\n    .rtc-prefix-input:focus { box-shadow: 0 0 0 2px rgba(14, 109, 206, .12); }\r\n    .rtc-submit { min-height: 50px; padding: 12px 18px; border-radius: 3px; background: var(--rtc-navy); box-shadow: none; }\r\n    .rtc-submit:hover { background: #123f67; }\r\n    .rtc-example { border-radius: 2px; background: #fff; }\r\n    .rtc-notice { max-width: 900px; margin-top: 24px; padding: 13px 15px; border-left-width: 3px; border-radius: 0; background: #f5f8fa; color: #4c6071; }\r\n    .rtc-error { max-width: 900px; border-radius: 2px; }\r\n    .rtc-loading { max-width: 900px; border-radius: 2px; background: #f7f9fb; }\r\n\r\n    .rtc-results { margin-top: 36px; padding-top: 27px; border-top: 1px solid var(--rtc-line); }\r\n    .rtc-result-head { grid-template-columns: 125px minmax(0, 1fr); gap: 28px; padding: 0 0 26px; border: 0; border-radius: 0; background: transparent; }\r\n    .rtc-score { display: block; width: auto; height: auto; padding-right: 25px; border-right: 1px solid var(--rtc-line); border-radius: 0; background: none; }\r\n    .rtc-score-inner { display: block; width: auto; height: auto; border-radius: 0; background: transparent; box-shadow: none; text-align: left; }\r\n    .rtc-score-number { font-size: 43px; font-weight: 700; line-height: .95; }\r\n    .rtc-score-label { max-width: 85px; margin-top: 9px; font-size: 10px; line-height: 1.4; }\r\n    .rtc-result-summary h2 { font-size: 25px; }\r\n    .rtc-query { border-radius: 2px; }\r\n\r\n    .rtc-issues { margin-top: 5px; padding: 15px 18px; border: 0; border-left: 3px solid #c27b1c; border-radius: 0; background: #fff9ef; }\r\n    .rtc-card-grid { display: block; margin-top: 25px; border-top: 1px solid #cbd8e3; }\r\n    .rtc-card {\r\n      display: grid;\r\n      grid-template-columns: minmax(190px, .8fr) minmax(190px, .9fr) minmax(260px, 1.35fr);\r\n      gap: 24px;\r\n      align-items: start;\r\n      padding: 19px 4px;\r\n      border: 0;\r\n      border-bottom: 1px solid var(--rtc-line);\r\n      border-radius: 0;\r\n      background: transparent;\r\n    }\r\n    .rtc-card-top { display: block; }\r\n    .rtc-card h3 { font-size: 15px; }\r\n    .rtc-badge { display: inline-block; margin-top: 8px; padding: 0; border-radius: 0; background: transparent; font-size: 10px; letter-spacing: .05em; text-transform: uppercase; }\r\n    .rtc-badge--good { color: var(--rtc-green); }\r\n    .rtc-badge--warn { color: var(--rtc-amber); }\r\n    .rtc-badge--bad { color: var(--rtc-red); }\r\n    .rtc-badge--neutral { color: #63798c; }\r\n    .rtc-card-value { margin: 0; font-size: 16px; font-weight: 600; }\r\n    .rtc-card-detail { font-size: 13px; line-height: 1.55; }\r\n    .rtc-evidence { border-radius: 2px; }\r\n    .rtc-evidence-links a { border-radius: 2px; }\r\n    .rtc-raw { border-radius: 2px; }\r\n\r\n    .rtc-content { margin-top: 64px; padding: 39px 0 0; border: 0; border-top: 1px solid var(--rtc-line); border-radius: 0; box-shadow: none; }\r\n    .rtc-content h2 { max-width: 760px; font-size: 29px; }\r\n    .rtc-content h3 { max-width: 760px; margin-top: 32px; font-size: 21px; }\r\n    .rtc-content p { max-width: 860px; color: #374d60; line-height: 1.78; }\r\n    .rtc-content details { max-width: 860px; border: 0; border-top: 1px solid var(--rtc-line); border-radius: 0; background: transparent; }\r\n    .rtc-content details:last-child { border-bottom: 1px solid var(--rtc-line); }\r\n    .rtc-content details summary { padding: 15px 0; }\r\n    .rtc-content details p { padding: 0 0 17px; }\r\n\r\n    @media (max-width: 760px) {\r\n      .rtc-page { width: min(100% - 28px, 1080px); margin: 28px auto 55px; }\r\n      .rtc-hero { padding: 0 0 25px; }\r\n      .rtc-hero h1 { font-size: 35px; }\r\n      .rtc-source-chips::before { width: 100%; margin-bottom: 3px; }\r\n      .rtc-source-chips { display: flex; }\r\n      .rtc-input-row { grid-template-columns: 1fr; }\r\n      .rtc-result-head { grid-template-columns: 1fr; gap: 17px; text-align: left; }\r\n      .rtc-score { padding: 0 0 15px; border-right: 0; border-bottom: 1px solid var(--rtc-line); }\r\n      .rtc-score-inner { text-align: left; }\r\n      .rtc-card { grid-template-columns: 1fr; gap: 7px; padding: 17px 2px; }\r\n      .rtc-card-value { margin-top: 2px; }\r\n      .rtc-content { margin-top: 48px; padding: 31px 0 0; }\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <main class=\"rtc-page\">\r\n    <section class=\"rtc-shell\" aria-labelledby=\"rtc-page-title\">\r\n      <header class=\"rtc-hero\">\r\n        <div class=\"rtc-hero-inner\">\r\n          <span class=\"rtc-eyebrow\">INTERNET NUMBER RESOURCE TOOL<\/span>\r\n          <h1 id=\"rtc-page-title\">IPv4 &amp; IPv6 Transfer Readiness Checker<\/h1>\r\n          <p>Review registry, origin ASN, IRR route objects, RPKI authorization, live BGP visibility, routing consistency, and basic operational reputation signals for a public IPv4 or IPv6 prefix.<\/p>\r\n          <div class=\"rtc-source-chips\" aria-label=\"Public data sources\">\r\n            <span>RIPEstat Data API<\/span><span>RIR Registration<\/span><span>RIS BGP Data<\/span><span>IRR Records<\/span><span>RPKI Validator<\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/header>\r\n\r\n      <div class=\"rtc-tool\">\r\n        <form id=\"rtc-form\" novalidate>\r\n          <label class=\"rtc-form-label\" for=\"rtc-prefix\">Enter a public IPv4 or IPv6 prefix in CIDR notation<\/label>\r\n          <div class=\"rtc-input-row\">\r\n            <input id=\"rtc-prefix\" class=\"rtc-prefix-input\" name=\"prefix\" type=\"text\" inputmode=\"text\" autocomplete=\"off\" spellcheck=\"false\" placeholder=\"193.0.0.0\/21 or 2001:67c:2e8::\/48\" aria-describedby=\"rtc-input-help\">\r\n            <button id=\"rtc-submit\" class=\"rtc-submit\" type=\"submit\">Run Readiness Check<\/button>\r\n          <\/div>\r\n          <div id=\"rtc-input-help\" class=\"rtc-examples\">\r\n            <span>Try an example:<\/span>\r\n            <button class=\"rtc-example\" type=\"button\" data-prefix=\"193.0.0.0\/21\">IPv4: 193.0.0.0\/21<\/button>\r\n            <button class=\"rtc-example\" type=\"button\" data-prefix=\"2001:67c:2e8::\/48\">IPv6: 2001:67c:2e8::\/48<\/button>\r\n          <\/div>\r\n          <p class=\"rtc-privacy\">The entered public prefix is sent to RIPEstat over HTTPS. This page does not require an API key and does not perform any registry or routing update.<\/p>\r\n        <\/form>\r\n\r\n        <div class=\"rtc-notice\"><strong>Scope:<\/strong> This is a technical pre-check, not proof of ownership, transfer eligibility, clean reputation, or registry approval. IPv6 transfer and assignment rules differ by RIR and resource type. Confirm current policy with the authoritative RIR or sponsoring LIR.<\/div>\r\n        <div id=\"rtc-error\" class=\"rtc-error\" role=\"alert\" hidden><\/div>\r\n\r\n        <div id=\"rtc-loading\" class=\"rtc-loading\" aria-live=\"polite\" hidden>\r\n          <div class=\"rtc-loading-head\"><span id=\"rtc-loading-text\">Checking public data sources\u2026<\/span><span id=\"rtc-loading-count\">0 \/ 6<\/span><\/div>\r\n          <div class=\"rtc-progress\" aria-hidden=\"true\"><span id=\"rtc-progress-bar\"><\/span><\/div>\r\n        <\/div>\r\n\r\n        <section id=\"rtc-results\" class=\"rtc-results\" aria-labelledby=\"rtc-result-title\" hidden>\r\n          <div class=\"rtc-result-head\">\r\n            <div id=\"rtc-score\" class=\"rtc-score\">\r\n              <div class=\"rtc-score-inner\"><div><span id=\"rtc-score-number\" class=\"rtc-score-number\">0<\/span><span class=\"rtc-score-label\">Technical score<\/span><\/div><\/div>\r\n            <\/div>\r\n            <div class=\"rtc-result-summary\">\r\n              <h2 id=\"rtc-result-title\">Readiness result<\/h2>\r\n              <p id=\"rtc-result-text\">Public records have been reviewed.<\/p>\r\n              <span id=\"rtc-query\" class=\"rtc-query\"><\/span>\r\n              <div id=\"rtc-completeness\" class=\"rtc-completeness\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div id=\"rtc-issues\" class=\"rtc-issues\" hidden>\r\n            <h3>Items requiring review<\/h3>\r\n            <ul id=\"rtc-issue-list\"><\/ul>\r\n          <\/div>\r\n\r\n          <div id=\"rtc-card-grid\" class=\"rtc-card-grid\"><\/div>\r\n\r\n          <details class=\"rtc-evidence\">\r\n            <summary>View source links and raw evidence<\/summary>\r\n            <div class=\"rtc-evidence-body\">\r\n              <div id=\"rtc-evidence-links\" class=\"rtc-evidence-links\"><\/div>\r\n              <pre id=\"rtc-raw\" class=\"rtc-raw\"><\/pre>\r\n            <\/div>\r\n          <\/details>\r\n        <\/section>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <article class=\"rtc-content\">\r\n      <h2>What the IPv4 and IPv6 Readiness Checker Reviews<\/h2>\r\n      <p>This checker brings several public technical signals into one report. It identifies the Regional Internet Registry associated with the prefix, reads available registration records, finds current BGP origin ASNs, looks for matching IRR route or route6 objects, validates each visible origin against RPKI, and measures whether the prefix is visible to RIPE RIS peers. It also highlights obvious inconsistencies, such as a route appearing in BGP without a matching IRR object, an RPKI-invalid origin, multiple current origins, or a missing public abuse contact.<\/p>\r\n      <p>The result is designed for early due diligence before an IPv4 transfer, IPv6 resource review, network migration, BGP onboarding, or sponsoring-LIR discussion. A high score means that the public technical data appears comparatively complete and consistent at the time of the query. It does not guarantee that a Regional Internet Registry will approve a transfer, that a resource is legally available, or that the address space has no historical reputation problem.<\/p>\r\n\r\n      <h3>Registry and Registration Objects<\/h3>\r\n      <p>The authoritative RIR is an important first step because policies, transfer procedures, documentation requirements, and resource statuses differ between RIPE NCC, ARIN, APNIC, LACNIC, and AFRINIC. The registration section displays available fields such as inetnum or inet6num, netname, organisation reference, country, status, source, and last-modified date. Registration data should be reviewed together with contracts and current RIR records; it is not, by itself, a legal ownership certificate.<\/p>\r\n\r\n      <h3>Origin ASN, Route Objects and BGP Visibility<\/h3>\r\n      <p>The origin ASN is the Autonomous System currently originating the prefix in BGP. An IRR route object for IPv4 or route6 object for IPv6 documents routing intent and is often used by transit providers when building prefix filters. Live BGP visibility is a different signal: it shows whether the route is actually observed by RIPE RIS peers. A route object does not prove live visibility, and live visibility does not prove that the announcement is authorized. The strongest operational position is normally a consistent relationship between registration, IRR, BGP and RPKI data.<\/p>\r\n\r\n      <h3>RPKI ROA Validation<\/h3>\r\n      <p>RPKI provides cryptographic route-origin authorization. For each current origin ASN found in public BGP data, the checker asks a validator whether the prefix and origin are valid, invalid, or not found. A valid result means an applicable ROA authorizes the origin and prefix length. An invalid result requires urgent review because networks performing route-origin validation may reject or de-prioritize the announcement. A not-found result means no applicable ROA was found; it is not the same as invalid, but creating an appropriate ROA is a widely recommended routing-security practice.<\/p>\r\n\r\n      <h3>What \u201cReputation\u201d Means in This Report<\/h3>\r\n      <p>The reputation section evaluates only basic public operational hygiene, such as whether an authoritative abuse contact is available and whether registry and routing records are consistent. It does not query commercial fraud databases, email blocklists, residential-proxy classifications, or every third-party threat-intelligence source. Before purchasing, leasing, or accepting an IPv4 block, conduct separate spam, malware, geolocation, prior-use, and platform-specific reputation checks. IPv6 reputation should also be assessed according to the intended workload and announcement history.<\/p>\r\n\r\n      <div class=\"rtc-faq\">\r\n        <h2>Frequently Asked Questions<\/h2>\r\n        <details>\r\n          <summary>Can this checker confirm that an IPv4 block is transferable?<\/summary>\r\n          <p>No. It reviews public technical data only. Transfer eligibility depends on the authoritative RIR, resource status, policy, contractual rights, documentation, and approval process.<\/p>\r\n        <\/details>\r\n        <details>\r\n          <summary>Does the checker support IPv6 prefixes?<\/summary>\r\n          <p>Yes. Enter an IPv6 prefix in CIDR notation, such as 2001:67c:2e8::\/48. The tool reviews registration, origin ASN, route6, RPKI and BGP visibility where public data is available.<\/p>\r\n        <\/details>\r\n        <details>\r\n          <summary>Is an RPKI not-found result the same as invalid?<\/summary>\r\n          <p>No. Not found means no applicable ROA was located. Invalid means a ROA exists but does not authorize the observed origin or prefix length.<\/p>\r\n        <\/details>\r\n        <details>\r\n          <summary>Why can public data sources disagree?<\/summary>\r\n          <p>Registry, IRR, BGP and RPKI systems serve different purposes and update at different times. A mismatch may indicate a transition, stale object, configuration error, unauthorized announcement, or temporary data delay and should be investigated.<\/p>\r\n        <\/details>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <p class=\"rtc-footer\">Public data is provided by RIPEstat and related registry, IRR, RIS and RPKI systems. Results can change over time and should be independently verified.<\/p>\r\n  <\/main>\r\n\r\n  <script>\r\n    (function () {\r\n      'use strict';\r\n\r\n      var API_BASE = 'https:\/\/stat.ripe.net\/data\/';\r\n      var form = document.getElementById('rtc-form');\r\n      var input = document.getElementById('rtc-prefix');\r\n      var submit = document.getElementById('rtc-submit');\r\n      var errorBox = document.getElementById('rtc-error');\r\n      var loading = document.getElementById('rtc-loading');\r\n      var loadingText = document.getElementById('rtc-loading-text');\r\n      var loadingCount = document.getElementById('rtc-loading-count');\r\n      var progressBar = document.getElementById('rtc-progress-bar');\r\n      var results = document.getElementById('rtc-results');\r\n      var cardGrid = document.getElementById('rtc-card-grid');\r\n      var issueBox = document.getElementById('rtc-issues');\r\n      var issueList = document.getElementById('rtc-issue-list');\r\n      var rawOutput = document.getElementById('rtc-raw');\r\n      var evidenceLinks = document.getElementById('rtc-evidence-links');\r\n      var currentRun = 0;\r\n\r\n      function normalisePrefix(value) {\r\n        var prefix = String(value || '').trim();\r\n        if (!prefix || prefix.indexOf('\/') === -1 || \/\\s\/.test(prefix)) {\r\n          throw new Error('Enter a public IPv4 or IPv6 prefix with a CIDR length, for example 193.0.0.0\/21 or 2001:67c:2e8::\/48.');\r\n        }\r\n        var parts = prefix.split('\/');\r\n        if (parts.length !== 2 || !\/^\\d+$\/.test(parts[1])) {\r\n          throw new Error('The prefix length is invalid. Use CIDR notation such as \/24 for IPv4 or \/48 for IPv6.');\r\n        }\r\n        var address = parts[0];\r\n        var length = Number(parts[1]);\r\n        var version;\r\n\r\n        if (address.indexOf(':') !== -1) {\r\n          version = 6;\r\n          if (!\/^[0-9a-fA-F:]+$\/.test(address) || address.indexOf(':::') !== -1 || length < 0 || length > 128) {\r\n            throw new Error('The IPv6 prefix is not valid. Check the hexadecimal address and use a prefix length from \/0 to \/128.');\r\n          }\r\n        } else {\r\n          version = 4;\r\n          var octets = address.split('.');\r\n          if (octets.length !== 4 || octets.some(function (octet) { return !\/^\\d+$\/.test(octet) || Number(octet) > 255; }) || length < 0 || length > 32) {\r\n            throw new Error('The IPv4 prefix is not valid. Check the address and use a prefix length from \/0 to \/32.');\r\n          }\r\n        }\r\n        return { prefix: prefix, version: version };\r\n      }\r\n\r\n      function fetchApi(callName, params) {\r\n        var query = new URLSearchParams(params);\r\n        var url = API_BASE + callName + '\/data.json?' + query.toString();\r\n        return fetch(url, { method: 'GET', headers: { 'Accept': 'application\/json' } }).then(function (response) {\r\n          if (!response.ok) throw new Error(callName + ' returned HTTP ' + response.status);\r\n          return response.json();\r\n        }).then(function (json) {\r\n          if (json.status !== 'ok' || !json.data) throw new Error(callName + ' did not return usable data');\r\n          return { name: callName, url: url, data: json.data };\r\n        });\r\n      }\r\n\r\n      function settle(name, promise) {\r\n        return promise.then(function (value) { return { name: name, ok: true, value: value }; })\r\n          .catch(function (error) { return { name: name, ok: false, error: error.message }; });\r\n      }\r\n\r\n      function recordMap(record) {\r\n        var map = {};\r\n        (record || []).forEach(function (item) {\r\n          if (!map[item.key]) map[item.key] = [];\r\n          map[item.key].push(item.value);\r\n        });\r\n        return map;\r\n      }\r\n\r\n      function first(map, key, fallback) {\r\n        return map[key] && map[key].length ? map[key][0] : fallback;\r\n      }\r\n\r\n      function formatDate(value) {\r\n        if (!value) return 'Not available';\r\n        var date = new Date(value);\r\n        return isNaN(date.getTime()) ? String(value) : date.toLocaleString(undefined, { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }) + ' UTC';\r\n      }\r\n\r\n      function unique(values) {\r\n        return values.filter(function (value, index, array) { return value !== null && value !== undefined && value !== '' && array.indexOf(value) === index; });\r\n      }\r\n\r\n      function text(element, value) { element.textContent = value; }\r\n\r\n      function badgeClass(state) {\r\n        return state === 'good' ? 'rtc-badge--good' : state === 'bad' ? 'rtc-badge--bad' : state === 'warn' ? 'rtc-badge--warn' : 'rtc-badge--neutral';\r\n      }\r\n\r\n      function addCard(title, badge, state, value, detail) {\r\n        var card = document.createElement('article');\r\n        card.className = 'rtc-card';\r\n        var top = document.createElement('div');\r\n        top.className = 'rtc-card-top';\r\n        var heading = document.createElement('h3');\r\n        heading.textContent = title;\r\n        var status = document.createElement('span');\r\n        status.className = 'rtc-badge ' + badgeClass(state);\r\n        status.textContent = badge;\r\n        var main = document.createElement('p');\r\n        main.className = 'rtc-card-value';\r\n        main.textContent = value;\r\n        var description = document.createElement('p');\r\n        description.className = 'rtc-card-detail';\r\n        description.textContent = detail;\r\n        top.appendChild(heading);\r\n        top.appendChild(status);\r\n        card.appendChild(top);\r\n        card.appendChild(main);\r\n        card.appendChild(description);\r\n        cardGrid.appendChild(card);\r\n      }\r\n\r\n      function addEvidenceLink(label, url) {\r\n        var link = document.createElement('a');\r\n        link.href = url;\r\n        link.target = '_blank';\r\n        link.rel = 'noopener noreferrer';\r\n        link.textContent = label;\r\n        evidenceLinks.appendChild(link);\r\n      }\r\n\r\n      function updateProgress(done, total, label) {\r\n        text(loadingCount, done + ' \/ ' + total);\r\n        text(loadingText, label);\r\n        progressBar.style.width = Math.round((done \/ total) * 100) + '%';\r\n      }\r\n\r\n      function getResultMap(settled) {\r\n        var map = {};\r\n        settled.forEach(function (result) { map[result.name] = result; });\r\n        return map;\r\n      }\r\n\r\n      function buildReport(resource, baseResults, rpkiResults) {\r\n        var map = getResultMap(baseResults);\r\n        var overview = map['prefix-overview'] && map['prefix-overview'].ok ? map['prefix-overview'].value.data : null;\r\n        var rir = map.rir && map.rir.ok ? map.rir.value.data : null;\r\n        var routing = map['routing-status'] && map['routing-status'].ok ? map['routing-status'].value.data : null;\r\n        var consistency = map['prefix-routing-consistency'] && map['prefix-routing-consistency'].ok ? map['prefix-routing-consistency'].value.data : null;\r\n        var whois = map.whois && map.whois.ok ? map.whois.value.data : null;\r\n        var abuse = map['abuse-contact-finder'] && map['abuse-contact-finder'].ok ? map['abuse-contact-finder'].value.data : null;\r\n\r\n        var originAsns = [];\r\n        if (routing && Array.isArray(routing.origins)) originAsns = originAsns.concat(routing.origins.map(function (item) { return Number(item.origin); }));\r\n        if (overview && Array.isArray(overview.asns)) originAsns = originAsns.concat(overview.asns.map(function (item) { return Number(item.asn); }));\r\n        originAsns = unique(originAsns.filter(function (asn) { return Number.isFinite(asn); }));\r\n\r\n        var registrationRecords = whois && Array.isArray(whois.records) ? whois.records : [];\r\n        var reg = registrationRecords.length ? recordMap(registrationRecords[0]) : {};\r\n        var irrRecords = whois && Array.isArray(whois.irr_records) ? whois.irr_records.map(recordMap) : [];\r\n        var consistencyRoutes = consistency && Array.isArray(consistency.routes) ? consistency.routes : [];\r\n        var exactRoutes = consistencyRoutes.filter(function (route) { return String(route.prefix).toLowerCase() === resource.prefix.toLowerCase(); });\r\n        var bgpOrigins = unique(exactRoutes.filter(function (route) { return route.in_bgp; }).map(function (route) { return Number(route.origin); }));\r\n        var irrOrigins = unique(exactRoutes.filter(function (route) { return route.in_whois; }).map(function (route) { return Number(route.origin); }));\r\n        var hasIrr = exactRoutes.some(function (route) { return route.in_whois; }) || irrRecords.length > 0;\r\n        var announced = Boolean((overview && overview.announced) || (routing && routing.last_seen) || bgpOrigins.length);\r\n        var visibility = routing && routing.visibility ? (resource.version === 4 ? routing.visibility.v4 : routing.visibility.v6) : null;\r\n        var visibilityPercent = visibility && visibility.total_ris_peers ? Math.round((visibility.ris_peers_seeing \/ visibility.total_ris_peers) * 100) : 0;\r\n        var rirs = rir && Array.isArray(rir.rirs) ? unique(rir.rirs.map(function (item) { return item.rir; })) : [];\r\n        var abuseContacts = abuse && Array.isArray(abuse.abuse_contacts) ? abuse.abuse_contacts : [];\r\n\r\n        var rpkiStatuses = rpkiResults.filter(function (item) { return item.ok; }).map(function (item) { return { asn: item.asn, status: String(item.value.data.status || 'unknown').toLowerCase(), roas: item.value.data.validating_roas || [] }; });\r\n        var rpkiInvalid = rpkiStatuses.filter(function (item) { return item.status === 'invalid'; });\r\n        var rpkiValid = rpkiStatuses.filter(function (item) { return item.status === 'valid'; });\r\n        var rpkiNotFound = rpkiStatuses.filter(function (item) { return item.status !== 'valid' && item.status !== 'invalid'; });\r\n\r\n        var issues = [];\r\n        var score = 0;\r\n        var possible = 0;\r\n\r\n        possible += 15;\r\n        if (rirs.length) score += 15; else issues.push('No authoritative RIR result was available from the public data source.');\r\n        possible += 15;\r\n        if (registrationRecords.length) score += 15; else issues.push('No registration object was returned for the queried prefix.');\r\n        possible += 15;\r\n        if (originAsns.length) score += 15; else issues.push('No current origin ASN was identified.');\r\n        possible += 15;\r\n        if (hasIrr) score += 15; else issues.push('No matching IRR route or route6 object was found in the returned data.');\r\n        possible += 20;\r\n        if (rpkiStatuses.length && rpkiValid.length === rpkiStatuses.length) score += 20;\r\n        else if (rpkiValid.length && !rpkiInvalid.length) score += 10;\r\n        else if (rpkiNotFound.length && !rpkiInvalid.length) score += 6;\r\n        if (rpkiInvalid.length) issues.push('At least one visible origin is RPKI invalid and requires urgent review.');\r\n        if (originAsns.length && !rpkiStatuses.length) issues.push('RPKI status could not be confirmed for the visible origin ASN.');\r\n        possible += 15;\r\n        if (announced) score += 10; else issues.push('The exact prefix does not appear to be currently announced in the returned BGP data.');\r\n        if (visibilityPercent >= 75) score += 5; else if (announced) issues.push('The prefix has limited RIS peer visibility (' + visibilityPercent + '% in the returned sample).');\r\n        possible += 5;\r\n        if (abuseContacts.length) score += 5; else issues.push('No public abuse contact was returned.');\r\n\r\n        if (originAsns.length > 1) issues.push('Multiple current origin ASNs were observed; confirm whether this is intentional.');\r\n        var missingIrrOrigins = bgpOrigins.filter(function (asn) { return irrOrigins.indexOf(asn) === -1; });\r\n        if (missingIrrOrigins.length) issues.push('BGP origin AS' + missingIrrOrigins.join(', AS') + ' does not have a matching exact-prefix IRR route in the consistency response.');\r\n        var staleIrrOrigins = irrOrigins.filter(function (asn) { return bgpOrigins.indexOf(asn) === -1; });\r\n        if (staleIrrOrigins.length) issues.push('IRR origin AS' + staleIrrOrigins.join(', AS') + ' was not observed as an exact-prefix BGP origin.');\r\n\r\n        var finalScore = possible ? Math.round((score \/ possible) * 100) : 0;\r\n        var criticalFailures = baseResults.filter(function (item) { return !item.ok; });\r\n        var resultTitle = finalScore >= 85 && !rpkiInvalid.length ? 'Strong technical readiness' : finalScore >= 65 && !rpkiInvalid.length ? 'Generally ready, with items to review' : 'Technical review required';\r\n        var resultText = finalScore >= 85 && !rpkiInvalid.length\r\n          ? 'The available registry, routing and security signals are comparatively complete and consistent.'\r\n          : finalScore >= 65 && !rpkiInvalid.length\r\n            ? 'Most core signals are present, but the highlighted items should be resolved before relying on the prefix.'\r\n            : 'Important public records are missing, inconsistent, invalid, or unavailable. Perform additional due diligence.';\r\n\r\n        cardGrid.replaceChildren();\r\n        addCard('Regional Internet Registry', rirs.length ? 'Found' : 'Unavailable', rirs.length ? 'good' : 'warn', rirs.join(', ') || 'Not available', rir && rir.latest ? 'Latest RIR dataset date: ' + formatDate(rir.latest) : 'The authoritative registry could not be confirmed from this response.');\r\n\r\n        var addressObject = first(reg, resource.version === 4 ? 'inetnum' : 'inet6num', 'Not available');\r\n        var registrationValue = first(reg, 'netname', first(reg, 'org', addressObject));\r\n        var registrationDetail = [first(reg, resource.version === 4 ? 'inetnum' : 'inet6num', ''), first(reg, 'status', ''), first(reg, 'source', ''), first(reg, 'country', '')].filter(Boolean).join(' \u00b7 ');\r\n        addCard('Registration Object', registrationRecords.length ? 'Present' : 'Missing', registrationRecords.length ? 'good' : 'bad', registrationValue, registrationDetail || 'No inetnum or inet6num record was returned.');\r\n\r\n        addCard('Current Origin ASN', originAsns.length ? (originAsns.length === 1 ? 'Observed' : 'Multiple') : 'Not found', originAsns.length === 1 ? 'good' : originAsns.length > 1 ? 'warn' : 'bad', originAsns.length ? originAsns.map(function (asn) { return 'AS' + asn; }).join(', ') : 'No origin ASN', routing && routing.first_seen ? 'First seen: ' + formatDate(routing.first_seen.time) + '. Last seen: ' + formatDate(routing.last_seen && routing.last_seen.time) + '.' : 'No exact-prefix routing timeline was available.');\r\n\r\n        var irrSources = unique(exactRoutes.reduce(function (all, route) { return all.concat(route.irr_sources || []); }, []));\r\n        addCard('IRR Route Object', hasIrr ? 'Present' : 'Missing', hasIrr ? 'good' : 'warn', hasIrr ? (resource.version === 4 ? 'route object found' : 'route6 object found') : 'No route object found', hasIrr ? 'IRR source(s): ' + (irrSources.join(', ') || unique(irrRecords.map(function (record) { return first(record, 'source', 'Unknown'); })).join(', ')) + '.' : 'A transit provider may reject the route if required routing authorization data is missing.');\r\n\r\n        var rpkiValue = !originAsns.length ? 'No origin to validate' : rpkiInvalid.length ? 'Invalid' : rpkiStatuses.length && rpkiValid.length === rpkiStatuses.length ? 'Valid' : rpkiNotFound.length ? 'Not found \/ unknown' : 'Unavailable';\r\n        var rpkiState = rpkiValue === 'Valid' ? 'good' : rpkiValue === 'Invalid' ? 'bad' : 'warn';\r\n        addCard('RPKI ROA', rpkiValue, rpkiState, rpkiStatuses.length ? rpkiStatuses.map(function (item) { return 'AS' + item.asn + ': ' + item.status; }).join(' \u00b7 ') : rpkiValue, rpkiValid.length ? 'At least one validating ROA was returned. Verify maximum length and origin before deployment.' : 'No confirmed valid ROA was available for the observed origin data.');\r\n\r\n        addCard('BGP Visibility', announced ? 'Announced' : 'Not visible', announced ? (visibilityPercent >= 75 ? 'good' : 'warn') : 'bad', announced ? visibilityPercent + '% of relevant RIS peers' : 'No exact-prefix announcement', visibility ? visibility.ris_peers_seeing + ' of ' + visibility.total_ris_peers + ' relevant RIS peers were seeing the route.' : 'Visibility data was unavailable for this address family.');\r\n\r\n        var mismatchCount = missingIrrOrigins.length + staleIrrOrigins.length + rpkiInvalid.length + (originAsns.length > 1 ? 1 : 0);\r\n        addCard('Registry & Routing Consistency', mismatchCount ? 'Review' : 'Consistent', mismatchCount ? 'warn' : 'good', mismatchCount ? mismatchCount + ' notable mismatch signal(s)' : 'No obvious mismatch detected', mismatchCount ? 'Compare the origin ASN, exact-prefix IRR objects, RPKI ROAs and current BGP announcements.' : 'The public exact-prefix signals returned by the APIs are broadly aligned.');\r\n\r\n        var reputationGood = abuseContacts.length && !mismatchCount;\r\n        addCard('Operational Reputation Signals', reputationGood ? 'Basic hygiene present' : 'Needs review', reputationGood ? 'good' : 'warn', abuseContacts.length ? abuseContacts.join(', ') : 'No abuse contact returned', 'This is not a blacklist or spam-reputation result. Run separate commercial and platform-specific reputation checks before a transfer or lease.');\r\n\r\n        text(document.getElementById('rtc-score-number'), finalScore);\r\n        document.getElementById('rtc-score').style.setProperty('--rtc-score-value', finalScore);\r\n        text(document.getElementById('rtc-result-title'), resultTitle);\r\n        text(document.getElementById('rtc-result-text'), resultText);\r\n        text(document.getElementById('rtc-query'), resource.prefix + ' \u00b7 IPv' + resource.version);\r\n        text(document.getElementById('rtc-completeness'), (6 - criticalFailures.length) + ' of 6 base data calls completed' + (criticalFailures.length ? '; this is a partial report.' : '.'));\r\n\r\n        issueList.replaceChildren();\r\n        if (criticalFailures.length) issues.push('Some public API calls failed: ' + criticalFailures.map(function (item) { return item.name; }).join(', ') + '.');\r\n        issues.forEach(function (issue) { var li = document.createElement('li'); li.textContent = issue; issueList.appendChild(li); });\r\n        issueBox.hidden = !issues.length;\r\n\r\n        evidenceLinks.replaceChildren();\r\n        addEvidenceLink('Open in RIPEstat', 'https:\/\/stat.ripe.net\/app\/launchpad\/' + encodeURIComponent(resource.prefix));\r\n        baseResults.filter(function (item) { return item.ok; }).forEach(function (item) { addEvidenceLink(item.name, item.value.url); });\r\n        rpkiResults.filter(function (item) { return item.ok; }).forEach(function (item) { addEvidenceLink('RPKI AS' + item.asn, item.value.url); });\r\n\r\n        var evidence = {\r\n          query: resource,\r\n          base_calls: baseResults.map(function (item) { return item.ok ? { name: item.name, data: item.value.data } : { name: item.name, error: item.error }; }),\r\n          rpki_calls: rpkiResults.map(function (item) { return item.ok ? { asn: item.asn, data: item.value.data } : { asn: item.asn, error: item.error }; })\r\n        };\r\n        rawOutput.textContent = JSON.stringify(evidence, null, 2);\r\n        results.hidden = false;\r\n        results.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      }\r\n\r\n      function runCheck(value) {\r\n        var resource;\r\n        try {\r\n          resource = normalisePrefix(value);\r\n        } catch (error) {\r\n          text(errorBox, error.message);\r\n          errorBox.hidden = false;\r\n          return;\r\n        }\r\n\r\n        var runId = ++currentRun;\r\n        errorBox.hidden = true;\r\n        results.hidden = true;\r\n        loading.hidden = false;\r\n        submit.disabled = true;\r\n        updateProgress(0, 6, 'Checking registry and routing data\u2026');\r\n\r\n        var calls = [\r\n          ['prefix-overview', fetchApi('prefix-overview', { resource: resource.prefix })],\r\n          ['rir', fetchApi('rir', { resource: resource.prefix })],\r\n          ['routing-status', fetchApi('routing-status', { resource: resource.prefix })],\r\n          ['prefix-routing-consistency', fetchApi('prefix-routing-consistency', { resource: resource.prefix })],\r\n          ['whois', fetchApi('whois', { resource: resource.prefix })],\r\n          ['abuse-contact-finder', fetchApi('abuse-contact-finder', { resource: resource.prefix })]\r\n        ];\r\n\r\n        var completed = 0;\r\n        var settledCalls = calls.map(function (call) {\r\n          return settle(call[0], call[1]).then(function (result) {\r\n            completed += 1;\r\n            if (runId === currentRun) updateProgress(completed, 6, completed < 6 ? 'Checking public data sources\u2026' : 'Validating RPKI origins\u2026');\r\n            return result;\r\n          });\r\n        });\r\n\r\n        Promise.all(settledCalls).then(function (baseResults) {\r\n          if (runId !== currentRun) return null;\r\n          var map = getResultMap(baseResults);\r\n          var routing = map['routing-status'] && map['routing-status'].ok ? map['routing-status'].value.data : null;\r\n          var overview = map['prefix-overview'] && map['prefix-overview'].ok ? map['prefix-overview'].value.data : null;\r\n          var origins = [];\r\n          if (routing && Array.isArray(routing.origins)) origins = origins.concat(routing.origins.map(function (item) { return Number(item.origin); }));\r\n          if (overview && Array.isArray(overview.asns)) origins = origins.concat(overview.asns.map(function (item) { return Number(item.asn); }));\r\n          origins = unique(origins.filter(function (asn) { return Number.isFinite(asn); }));\r\n\r\n          var rpkiCalls = origins.map(function (asn) {\r\n            return settle('rpki-validation', fetchApi('rpki-validation', { resource: 'AS' + asn, prefix: resource.prefix })).then(function (result) {\r\n              result.asn = asn;\r\n              return result;\r\n            });\r\n          });\r\n          return Promise.all(rpkiCalls).then(function (rpkiResults) { return { baseResults: baseResults, rpkiResults: rpkiResults }; });\r\n        }).then(function (bundle) {\r\n          if (!bundle || runId !== currentRun) return;\r\n          buildReport(resource, bundle.baseResults, bundle.rpkiResults);\r\n        }).catch(function (error) {\r\n          if (runId !== currentRun) return;\r\n          text(errorBox, 'The readiness check could not be completed: ' + error.message);\r\n          errorBox.hidden = false;\r\n        }).finally(function () {\r\n          if (runId !== currentRun) return;\r\n          loading.hidden = true;\r\n          submit.disabled = false;\r\n        });\r\n      }\r\n\r\n      form.addEventListener('submit', function (event) {\r\n        event.preventDefault();\r\n        runCheck(input.value);\r\n      });\r\n\r\n      document.querySelectorAll('.rtc-example').forEach(function (button) {\r\n        button.addEventListener('click', function () {\r\n          input.value = button.getAttribute('data-prefix');\r\n          runCheck(input.value);\r\n        });\r\n      });\r\n    }());\r\n  <\/script>\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>IPv4 &amp; IPv6 Transfer Readiness Checker | Registry, BGP, IRR and RPKI INTERNET NUMBER RESOURCE TOOL IPv4 &amp; IPv6 Transfer Readiness Checker Review registry, origin ASN, IRR route objects, RPKI authorization, live BGP visibility, routing consistency, and basic operational reputation signals for a public IPv4 or IPv6 prefix. RIPEstat Data APIRIR RegistrationRIS BGP DataIRR RecordsRPKI [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","footnotes":""},"class_list":["post-772","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/pages\/772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/comments?post=772"}],"version-history":[{"count":8,"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/pages\/772\/revisions"}],"predecessor-version":[{"id":783,"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/pages\/772\/revisions\/783"}],"wp:attachment":[{"href":"https:\/\/junglelabs.uk\/fr\/wp-json\/wp\/v2\/media?parent=772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}