{% extends 'layout.twig' %} {% block title %}{{ detail.ip }} — IRDB{% endblock %} {% macro flag(country) %} {%- set emoji = flag_emoji(country) -%} {%- if emoji -%} {{- emoji -}} {%- else -%} ?? {%- endif -%} {% endmacro %} {% macro status_pill(status) %} {%- set classes = { 'allowlisted': 'bg-emerald-100 text-emerald-900 dark:bg-emerald-900 dark:text-emerald-100', 'manually_blocked': 'bg-amber-100 text-amber-900 dark:bg-amber-900 dark:text-amber-100', 'scored': 'bg-red-100 text-red-900 dark:bg-red-900 dark:text-red-100', 'clean': 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300', } -%} {{ status }} {% endmacro %} {% block content %} {% import _self as h %}
← Back to IPs

{{ detail.ip }}

{{ h.status_pill(detail.status) }}

{{ detail.isIpv4 ? 'IPv4' : 'IPv6' }}

{% if can_write|default(false) %}
{% if detail.allowlist %}
{% else %}

Add {{ detail.ip }} to allowlist

{% endif %} {% if detail.manualBlock %}
{% else %}

Manually block {{ detail.ip }}

{% endif %}
{% endif %}

Enrichment

{% if detail.enrichment.country_code or detail.enrichment.asn %}
Country
{{ h.flag(detail.enrichment.country_code) }} {{ detail.enrichment.country_code|default('—') }}
ASN
{% if detail.enrichment.asn %} AS{{ detail.enrichment.asn }} {% else %}—{% endif %}
AS org
{{ detail.enrichment.as_org|default('—') }}
{% if detail.enrichment.enriched_at %}

Enriched

{% endif %} {% else %}

Unknown not yet enriched.

{% endif %} {% if geoip_provider == 'dbip' %}

IP Geolocation by DB-IP (CC BY 4.0)

{% elseif geoip_provider == 'ipinfo' %}

IP data powered by IPinfo

{% endif %}

Override status

{% if detail.allowlist %}

Allowlisted since . {% if detail.allowlist.reason %}
Reason: {{ detail.allowlist.reason }}{% endif %}

{% elseif detail.manualBlock %}

Manually blocked since . {% if detail.manualBlock.reason %}
Reason: {{ detail.manualBlock.reason }}{% endif %}

{% else %}

No manual override on this IP.

{% endif %}

Score per category

{% if detail.scores|length > 0 %} {% set max_score = detail.maxScore() %} {% else %}

No scored categories.

{% endif %}

Score over time

History

{% if detail.history|length > 0 %}
    {% for ev in detail.history %}
  1. {{ ev.type }}
    {% if ev.type == 'report' %}

    {% if ev.category %}{{ ev.category }}{% endif %} {% if ev.reporter %} via {{ ev.reporter }}{% endif %} {% if ev.weight %} · w={{ ev.weight }}{% endif %}

    {% if ev.metadata %}
    {{ ev.metadata|json_encode(constant('JSON_PRETTY_PRINT')) }}
    {% endif %} {% elseif ev.type == 'manual_block_added' %}

    Manual block added{% if ev.reason %}: {{ ev.reason }}{% endif %}

    {% elseif ev.type == 'allowlist_added' %}

    Allowlist entry added{% if ev.reason %}: {{ ev.reason }}{% endif %}

    {% endif %}
  2. {% endfor %}
{% if detail.hasMore %}

Showing the most recent 200 events. Older events are available via the API directly until the in-app pagination lands in a future milestone.

{% endif %} {% else %}

No history yet.

{% endif %}
{% endblock %}