CINXE.COM
Webhook.site - Test, transform and automate Web requests and emails
<!DOCTYPE html> <html ng-app="app" ng-controller="AppController"> <head> <title>Webhook.site - Test, transform and automate Web requests and emails</title> <script> window.AppConfig = { Debug: false, Title: "Webhook.site - Test, transform and automate Web requests and emails", Broadcaster: "socket.io", EchoHostMode: "url", EchoUrl: "ws.webhook.site", PusherToken: "", MaxRequests: 100, CdnUrl: "https://cdn.webhook.site", EmailDomain: "emailhook.site", }; </script> <link href="https://cdn.webhook.site/css/app.css?1732787057" rel="stylesheet"> <script src="https://cdn.webhook.site/js/libs.js?1730982504"></script> <script src="https://cdn.webhook.site/js/bundle.js?1732717578"></script> <script async defer src="https://buttons.github.io/buttons.js"></script> <meta name="description" content="Instantly generate a free, unique URL and email address to test, inspect, and automate (with a visual workflow editor and scripts) incoming HTTP requests and emails"> <meta charset="utf8"> <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.webhook.site/assets/icons/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="https://cdn.webhook.site/assets/icons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="https://cdn.webhook.site/assets/icons/favicon-16x16.png"> <link rel="manifest" href="/assets/icons/site.webmanifest"> <link rel="preload" as="font" href="https://cdn.webhook.site/fonts/bootstrap/bootstrap-icons.woff2?24e3eb84d0bcaf83d77f904c78ac1f47" crossorigin="anonymous"> <link rel="preload" as="font" href="https://cdn.webhook.site/fonts/bootstrap/glyphicons-halflings-regular.woff2" crossorigin="anonymous"> <link rel="canonical" href="https://webhook.site"/> <meta name="msapplication-TileColor" content="#bbbbbb"> <meta name="theme-color" content="#ffffff"> </head> <body ng-cloak> <a href="?nocdn=1" class="hidden">Webhook.site not loading properly? Click here to disable CDN</a> <div class="mainView" ui-view> <nav class="navbar navbar-inverse navbar-fixed-top navbar-primary" ng-hide="share"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/" ui-sref="home()"> <img src="https://cdn.webhook.site/icon.png" style="display:inline; width: 22px; height: 22px" alt="Icon"> <span class="hidden-sm">Webhook.site</span></a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-left small"> <li><a ga-event-category="NavLink" ga-event-action="docs-api" href="http://docs.webhook.site" target="_blank">Docs & API</a></li> <li class="hidden-sm hidden-md"><a ga-event-category="NavLink" ga-event-action="custom-actions" href="http://docs.webhook.site/custom-actions.html" target="_blank">Custom Actions</a></li> <li><a class="hidden-sm hidden-md" ga-event-category="NavLink" ga-event-action="webhookscript" href="http://docs.webhook.site/webhookscript.html" target="_blank">WebhookScript</a></li> <li><a ga-event-category="NavLink" ga-event-action="terms-privacy" href="/terms" target="_blank">Terms & Privacy</a></li> <li><a ga-event-category="NavLink" ga-event-action="support" href="https://support.webhook.site" target="_blank">Support</a></li> </ul> <div class="nav navbar-right navbar-form"> <div class="btn-group hidden-md hidden-sm"> <button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="bi-clipboard-check"></span> Copy <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a ng-click="copy(getUrl())" ga-event-category="URLCopy" ga-event-action="copy-nav"> URL<br> <span class="small text-muted">{{ getUrl() }}</span> </a></li> <li class="divider"></li> <li><a ng-click="copy(getUrlSubdomain())" ga-event-category="URLCopy" ga-event-action="copy-nav"> URL (Subdomain)<br> <span class="small text-muted">{{ getUrlSubdomain() }}</span> </a></li> <li class="divider"></li> <li><a ng-click="copy(getEmail())" ga-event-category="EmailCopy" ga-event-action="copy-nav"> Email Address<br> <span class="small text-muted">{{ getEmail() }}</span> </a></li> <li class="divider"></li> <li><a ng-click="copy(getDnshook())" ga-event-category="DNSCopy" ga-event-action="copy-nav"> DNSHook<br> <span class="small text-muted">{{ getDnshook() }}</span> </a></li> <li class="divider"></li> <li><a ng-click="copy(token.uuid)" ga-event-category="EmailCopy" ga-event-action="copy-nav"> ID<br> <span class="small text-muted">{{ token.uuid }}</span> </a></li> </ul> </div> <button type="button" class="btn btn-link openModal" data-modal="#editUrlModal" ga-event-category="Request" ga-event-action="click-newurl"> <span class="bi-pencil-square"></span> Edit </button> <button type="button" class="btn btn-link openModal" data-modal="#newUrlModal" ga-event-category="Request" ga-event-action="click-editurl"> <span class="bi-plus-lg"></span> New </button> <span class="vertSpacer"> </span> <a type="button" class="btn btn-link" ga-event-category="LogIn" ga-event-action="click-nav" href="https://webhook.site/login?token_id={{ token.uuid }}"> <span class="bi-person-fill"></span> Login </a> <a class="btn btn-primary strong" ng-hide="token.premium" href="/register?token_id={{ token.uuid }}" ng-click="upgrade()" ga-event-category="Premium" ga-event-action="upgrade-header"> <span class="bi-arrow-up-square-fill"></span> Sign Up Now </a> </div> </div> </div> </nav> <nav class="navbar controls navbar-fixed-top navbar-secondary" ng-hide="share"> <div class="controlsActions"> <span class="dropdown"> <a href data-toggle="dropdown" aria-haspopup="true" id="tokenHistoryDropdown" class="btn btn-xs dropdown-toggle" title="Request History"> <span class="small label label-primary" data-placement="bottom" data-toggle="tooltip" title="Upgraded features unlocked for this URL" ng-show="token.premium"><i class="bi-check-circle-fill"></i></span> <span class="small label label-default" data-placement="bottom" data-toggle="tooltip" title="This URL will expire {{ relativeDate(token.expires_at) }} on {{ localDate(token.expires_at) }}. Upgrade to a Webhook.site account to make it permanent" ng-show="token.expires_at"><i class="bi-clock-fill"></i></span> <span data-placement="right" data-container="body" data-toggle="tooltip" title="{{ token.description }}"> {{ token.alias ? token.alias : token.uuid.substring(0, 8) }} </span> <span class="caret"></span> </a> <ul class="dropdown-menu" aria-labelledby="optionsDropdown"> <li ng-repeat="tokenHistoryItem in tokenHistory track by tokenHistoryItem.uuid"> <a ng-href="#!/view/{{ tokenHistoryItem.uuid }}"> {{ tokenHistoryItem.alias ? tokenHistoryItem.alias : tokenHistoryItem.uuid }} <span ng-if="tokenHistoryItem.description" class="muted small"> <br> {{ tokenHistoryItem.description }} </span> </a> </li> <li role="separator" class="divider"></li> <li><a href="/control-panel">All URLs...</a></li> <li><a ng-click="clearTokenHistory()">Clear History</a></li> </ul> </span> <span class="vertSpacer" ng-show="token.premium || token.expires_at"> </span> <!-- Share --> <a class="openModal btn btn-xs" data-modal="#shareModal" ng-click="getShareLink()" title="[Signup Required] Create a link to share this URL with others" data-toggle="{{ !token.premium ? 'tooltip' : '' }}" data-placement="bottom"> <i class="bi-share"></i> Share</a> <span class="vertSpacer"> </span> <!-- Schedule --> <a class="btn btn-xs" ga-event-category="Schedule" ga-event-action="create" href="/control-panel/schedules/create?url={{ getUrl() }}" title="{{ !token.premium ? '[Signup Required]' : ''}} Create a Schedule with this URL" data-toggle="{{ !token.premium ? 'tooltip' : '' }}" data-placement="bottom"> <i class="bi-clock"></i> Schedule</a> <span class="vertSpacer"> </span> <!-- Form --> <a class="btn btn-xs" ga-event-category="FormBuilder" ga-event-action="create" href="/form-builder?url={{ getUrl() }}" target="_blank" title="Create a form that sends data to this URL" data-toggle="{{ !token.premium ? 'tooltip' : '' }}" data-placement="bottom"> <i class="bi-input-cursor-text"></i> Form Builder</a> <span class="vertSpacer"> </span> <!-- Export --> <a href class="btn btn-xs" ga-event-category="Export" ga-event-action="set" ng-click="csvExport()" title="{{ !token.premium ? '[Signup Required]' : ''}} Export all requests to a CSV file" data-toggle="{{ !token.premium ? 'tooltip' : '' }}" data-placement="bottom"> <i class="bi-file-earmark"></i> CSV Export</a> <span class="vertSpacer"> </span> <!-- Actions --> <a href class="openModal btn btn-xs" data-modal="#actionsModal" ng-click="getActions(token)" ga-event-category="CustomActions" ga-event-action="settings" title="{{ !token.premium ? '[Signup Required]' : ''}} Run custom actions on each request" data-toggle="{{ !token.premium ? 'tooltip' : '' }}" data-placement="bottom"> <i class="bi-gear-fill"></i> Custom Actions</a> <a id="btnExecuteActions" data-modal="#actionReplayModal" class="openModal btn btn-xs" ga-event-category="CustomActions" ga-event-action="replay" title="{{ !token.premium ? '[Signup Required]' : ''}} Execute all Custom Actions" data-toggle="{{ !token.premium ? 'tooltip' : '' }}" data-placement="bottom"> <i class="bi-play-fill"></i> Replay</a> <span class="vertSpacer"> </span> <!-- Redirection --> <a href class="openModal btn btn-xs" data-modal="#redirectModal" ga-event-category="AutoRedirect" ga-event-action="settings"> <i class="bi bi-arrow-up-right-square-fill"></i> XHR Redirect</a> <a ng-click="xhrRedirectExecute(currentRequest)" class="btn btn-xs" ga-event-category="AutoRedirect" ga-event-action="redir-now">Redirect Now</a> <span class="vertSpacer"> </span> <span class="dropdown"> <a href data-toggle="dropdown" aria-haspopup="true" id="optionsDropdown" class="btn btn-xs dropdown-toggle" title="Toggle ordering"><i class="bi-three-dots"></i> More <span class="caret"></span> </a> <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="optionsDropdown"> <li><a ng-click="resetUnread()">Mark all as read</a></li> <li role="separator" class="divider"></li> <li> <a ng-click="hideDetails = !hideDetails"> <i class="glyphicon glyphicon-ok" ng-if="hideDetails"></i> Hide Details</a></li> <li> <a ng-click="autoNavEnable = !autoNavEnable"> <i class="glyphicon glyphicon-ok" ng-if="autoNavEnable"></i> Auto Navigate</a></li> <li> <a ng-click="hideDontSave = !hideDontSave"> <i class="glyphicon glyphicon-ok" ng-if="hideDontSave"></i> Hide "Don't Save" Requests</a></li> <li role="separator" class="divider"></li> <li><a style="color:#bc1233" ng-click="deleteAllRequests(token.uuid)">Delete all requests...</a></li> <li><a style="color:#bc1233" ng-click="deleteToken(token.uuid)">Delete URL...</a></li> <li><a style="color:#bc1233" ng-click="deleteSendRequestResponses(token.uuid, currentRequest.uuid)"> Delete HTTP Request responses</a></li> </ul> </span> <a class="btn btn-xs pull-right" style="margin-right: 10px" ng-show="hasRequests" ng-click="forceTutorial = !forceTutorial">{{forceTutorial ? 'Hide' : 'Show'}} Intro</a> </div> </nav> <div class="container-fluid" id="app" ng-if="token.uuid"> <div class="row"> <div class="col-sm-3 col-md-2 sidebar sidebar-top"> <div class="sidebar-header"> <span id="request-count"> Requests ({{ requests.total || 0 }}{{ !token.premium ? '/' + appConfig.MaxRequests : '' }}) </span> <button type="button" id="sorting-toggle" class="btn btn-default btn-xxs dropdown-toggle" ng-click="toggleSorting()" title="Toggle ordering">{{ sorting === 'oldest' ? 'Oldest First' : 'Newest First' }} </button> </div> <div class="sidebar-search"> <div class="search-container"> <input type="text" id="search-input" placeholder="Search Query" ng-model="search" ng-change="updateSearch(search)" ng-model-options="{debounce: 1000}"> </div> <div class="search-help-container"> <a ng-click="search = ''; updateSearch('')" ng-hide="search == ''" class="search-clear" data-toggle="tooltip" title="Clear search"> <i class="bi-x-circle-fill"></i></a> <a href="https://docs.webhook.site/api/requests.html#search-query-examples" target="_blank"> <i class="bi-question-circle-fill"></i></a> </div> </div> <p ng-show="!hasRequests && !search" class="small muted" id="waiting-for-request"> <img src="/assets/images/pulse.svg" width="25" height="25"/> Waiting for first request </p> <p ng-show="!hasRequests && search" class="small"> No results </p> <div> <ul class="nav nav-sidebar"> <li ng-show="hasRequests && currentPage > 1 && requests.total > requests.data.length && requests.current_page != 1 && requests.to != requests.data.length"> <a ng-click="getPreviousPage(token.uuid)" class="prevent-default">Previous Page</a> </li> <li ng-repeat="(key, request) in requests.data" ng-class="{ 'active': currentRequestIndex === request.uuid, 'unread': unread.indexOf(request.uuid) !== -1, 'muted': request.dont_save === true, 'hidden': request.dont_save === true && hideDontSave }"> <a ng-click="setCurrentRequest(request)" class="select"> <span ng-if="request.user_agent && request.user_agent.indexOf('Webhook.site/') != -1" class="label label-primary">Webhook.site</span> <span ng-if="request.type === 'web'" class="label label-{{ getLabel(request.method) }}">{{ request.method }}</span> <span ng-if="request.type === 'email'" class="label label-mail label-default">Mail</span> <span ng-if="request.type === 'dns'" class="label label-mail label-orange">DNS {{ request.method }}</span> #{{ request.uuid.substring(0, 5) }} <span ng-if="request.type === 'web' && (!request.user_agent || request.user_agent.indexOf('Webhook.site/') == -1)">{{ request.ip }}</span> <span ng-if="request.type === 'email'">{{ request.sender }}</span> <span ng-if="request.type === 'dns'">{{ request.ip }}</span> <br/> <small>{{ localDate(request.created_at) }}</small> </a> <a ng-click="deleteRequest(request, key)" ng-hide="share" class="btn btn-danger delete hidden-sm" title="Delete request"> <i class="glyphicon glyphicon-remove"></i> </a> </li> <li ng-show="hasRequests && !requests.is_last_page"> <a ng-click="getNextPage(token.uuid)" class="prevent-default">Next page</a> </li> </ul> </div> </div> <div class="col-sm-3 col-md-2 sidebar" style="margin-top: 10px; height: 40px; bottom: 0px; top: auto; padding: 10px 0 0 0"> <div class="text-center" ng-show="hasRequests"> <a class="btn btn-xs btn-link" id="controlsFirst" ng-click="goToFirstPage()" ng-class="{'disabled': requests.from <= requests.per_page || total <= requests.per_page}" title="Go to first page"> First</a> <a class="btn btn-xs btn-link" id="controlsPrev" ng-class="hasRequests && requests.data.indexOf(currentRequest) <= requests.data.length && requests.data.indexOf(currentRequest) !== 0 ? '' : 'disabled'" ng-click="goToPreviousRequest()" title="Go to previous page"> ← Prev</a> <a class="btn btn-xs btn-link" id="controlsNext" ng-class="requests.data.indexOf(currentRequest) !== requests.data.length-1 ? '' : 'disabled'" ng-click="goToNextRequest()" title="Go to next page"> Next →</a> <a class="btn btn-xs btn-link" id="controlsLast" ng-class="{'disabled': requests.is_last_page || requests.total <= requests.to }" ng-click="goToLastPage()" title="Go to last page"> Last</a> </div> </div> <div id="request" class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> <div id="rate-limit-warning" class="alert alert-warning" ng-show="!token.premium && hasRequests && requests.total >= appConfig.MaxRequests"> <p><strong>Upgrade to a Webhook.site account to unlock unlimited requests</strong></p> <p>This URL received the maximum of {{ appConfig.MaxRequests }} requests and can't accept more requests, emails or DNSHooks. New requests sent to this URL will return HTTP status code 410 Gone or 429 Too Many Requests and won't be logged. Also note that it is against our terms of service to use Webhook.site for any kind of load testing or benchmarking. <br> <button style="margin-top:10px" class="btn btn-primary" ng-click="upgrade()"> <i class="bi-arrow-up-square-fill"></i> Upgrade Now</button> </p> </div> <div class="alert alert-warning" ng-show="!token.premium && user.team.subscribed"> <i class="bi-info-circle"></i> This URL is not associated with your account and doesn't have upgraded features enabled.  <a ng-click="upgrade()" class="pull-right"> <i class="bi-plus-circle-fill"></i> Add to account</a> </div> <div> <div class="container-fluid"> <div class="row tutorial-container" ng-show="!hasRequests || forceTutorial" ng-hide="share"> <div class="col-md-6"> <div class="tutorial"> <h4>Your unique URL</h4> <p> <code ng-click="copy(getUrl());" onclick="$(this).fadeOut(100).fadeIn(100);" title="Copy to clipboard" data-toggle="tooltip" ga-event-category="WebhookCopy" ga-event-action="copy-url">{{ getUrl() }}</code> <a class="btn btn-xs btn-link" href="{{ getUrl() }}" target="_blank" ga-event-category="WebhookCopy" ga-event-action="new-tab"> <i class="bi-box-arrow-up-right"></i> Open in new tab</a> <a class="btn btn-xs btn-link" href="https://docs.webhook.site/api/examples.html" target="_blank" ga-event-category="WebhookCopy" ga-event-action="examples"> <i class="bi-box-arrow-up-right"></i> Examples</a> </p> </div> <div class="tutorial"> <h4> Your unique email address </h4> <p> <code ng-click="copy(getEmail())" onclick="$(this).fadeOut(100).fadeIn(100);" title="Copy to clipboard" data-toggle="tooltip" ga-event-category="EmailCopy" ga-event-action="copy-emailhook">{{ getEmail() }}</code> <a class="btn btn-xs btn-link" href="mailto:{{ getEmail() }}" target="_blank" ga-event-category="EmailCopy" ga-event-action="mail-client"> <span class="bi-envelope"></span> Open in mail client</a> </p> </div> <div class="tutorial" style="zoom: 80%"> <h4> Your unique DNS name </h4> <p> <code ng-click="copy(getDnshook())" onclick="$(this).fadeOut(100).fadeIn(100);" title="Copy to clipboard" data-toggle="tooltip" ga-event-category="DNSCopy" ga-event-action="copy-dnshook">*.{{ getDnshook() }}</code> <a class="btn btn-xs btn-link" href="https://docs.webhook.site/dnshook.html" target="_blank" ga-event-category="DNSCopy" ga-event-action="about"> <i class="bi-box-arrow-up-right"></i> About DNSHook</a> </p> </div> <div class="tutorial" style="zoom: 80%"> <h4> Proxy bidirectionally with Webhook.site CLI </h4> <p> <code ng-click="copy('whcli forward --token=' + token.uuid + ' --target=https://localhost');" onclick="$(this).fadeOut(100).fadeIn(100);" ga-event-category="CliCopy" ga-event-action="copy-cli" title="Copy to clipboard" class="console-command" data-toggle="tooltip">whcli forward --token={{ token.uuid }} --target=https://localhost</code> <a class="btn btn-xs btn-link" href="https://docs.webhook.site/cli.html" ga-event-category="CliCopy" ga-event-action="copy-installation"> <span class="bi-box-arrow-up-right"></span> Info & installation</a> </p> </div> <p class="github-button-container"> <a class="github-button" href="https://github.com/webhooksite/webhook.site" data-icon="octicon-star" data-show-count="true" aria-label="Star fredsted/webhook.site on GitHub">Star on GitHub</a> </p> </div> <div class="col-md-6"> <div style="float: right; display: inline-block; width: 30%; max-width: 25vh"> <a href="https://www.youtube.com/watch?v=wg08ny5bh9w"><img style="width:100%; border: 11px solid transparent" src="https://cdn.webhook.site/assets/images/register/youtube-video.png" alt="Youtube Demo Video"></a> <a href="assets/images/register/Z0S3vEJbW21l03111ovgJlPx.png"><img style="width:100%" src="https://cdn.webhook.site/assets/images/register/Z0S3vEJbW21l03111ovgJlPx%20Medium.png" alt="Screenshot"></a> <a href="assets/images/register/GeJUlMAJl7XJcayiCVQNUraL.png"><img style="width:100%" src="https://cdn.webhook.site/assets/images/register/GeJUlMAJl7XJcayiCVQNUraL.png" alt="Screenshot"></a> </div> <h4>What is Webhook.site?</h4> <p><strong>Webhook.site</strong> generates free, unique URLs and e-mail addresses and lets you see everything that’s sent there instantly.</p> <p>When you <a ng-click="upgrade()" ga-event-category="Tutorial" ga-event-action="upgrade1">upgrade to a Webhook.site account</a>, limitations are removed and more features are included:</p> <ul class="tutorial-list"> <li>Create advanced workflows that run on incoming requests, emails and DNSHooks with <a href="https://docs.webhook.site/custom-actions.html" ga-event-category="Tutorial" ga-event-action="customActions1">Custom Actions</a> <ul> <li>Transform and extract data with JSONPath, Regex, XPath</li> <li>Forward data to other endpoints and APIs</li> <li>Run scripts with JavaScript and WebhookScript</li> <li>Built-in integrations: Google Sheets, Excel, Slack, HubSpot, Dropbox, SFTP, HTTP, Email, push notifications, <a href="https://docs.webhook.site/custom-actions/action-types.html" ga-event-category="Tutorial" ga-event-action="andMore">and more</a></li> <li>Support for databases: MySQL/MariaDB, Postgres, MSSQL</li> </ul> </li> <li>URLs never expire and can be managed in Control Panel or via API</li> <li>Custom Names and domains: <code>webhook.site/<b>yourname</b></code></li> <li>History of up to 10.000 requests and emails per URL</li> <li>Data is protected in your account</li> <li>Create Web cronjobs and uptime monitors using <a href="https://docs.webhook.site/schedules.html" ga-event-category="Tutorial" ga-event-action="schedules">Schedules</a></li> </ul> <p><a class="btn btn-primary" ng-click="upgrade()" ga-event-category="Tutorial" ga-event-action="upgradeButton"> <span class="bi-arrow-up-square-fill"></span> Sign Up Now – from $7.5/month</a> </p> <p class="tutorial-links"> <a href="/register?token_id={{ token.uuid }}#features" ng-click="upgrade()" ga-event-category="Tutorial" ga-event-action="upgrade2">Read more about benefits</a> <a href="https://docs.webhook.site" ga-event-category="Tutorial" ga-event-action="about1">About Us</a> <a href="https://docs.webhook.site" ga-event-category="Tutorial" ga-event-action="docs1">Documentation</a> <a href="https://docs.webhook.site/faq.html" ga-event-category="Tutorial" ga-event-action="faq1">FAQ</a> </p> </div> </div> <div class="row" id="requestDetails" ng-show="!hideDetails" ng-class="{'muted': !hasRequests}"> <div class="col-md-6"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2"> Request Details <span class="pull-right"> <a class="btn btn-link btn-xxs" ng-hide="share" href="{{ protocol }}//{{ domain }}/#!/view/{{ token.uuid }}?query=uuid:{{ currentRequest.uuid }}" ga-event-category="Permalink" ga-event-action="{{ type }}"> Permalink</a> <a class="btn btn-link btn-xxs" target="_blank" ng-hide="share" href="{{ protocol }}//{{ domain }}/token/{{ token.uuid }}/request/{{ currentRequest.uuid }}/raw" ga-event-category="RawContent" ga-event-action="click"> Raw content</a> <div class="btn-group btn-group-xxs form-inline dropdown" ng-if="currentRequest.type === 'web'"> <button type="button" class="btn btn-link" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" ga-event-category="CopyAs" ga-event-action="button" ga-on="click"> Copy as <span class="caret"></span> </button> <ul class="dropdown-menu scrollable-menu"> <li ng-repeat="type in convertTypes"> <a ng-click="copyRequestAs(currentRequest, type)" ga-event-category="CopyAs" ga-event-action="{{ type }}" ga-on="click"> {{ type }}</a> </li> </ul> </div> <a class="btn btn-link btn-xxs btn-link-danger hidden-lg" ng-click="deleteRequest(currentRequest, requests.data.indexOf(currentRequest))" ga-event-category="HeadersBar" ga-event-action="deleteRequest" ga-on="click">Delete</a> </span> </th> </tr> </thead> <tbody> <tr ng-if="currentRequest.type === 'web'"> <td> <span class="label label-{{ getLabel(currentRequest.method) }}">{{ currentRequest.method }}</span> </td> <td id="req-url" class="break long"> <a href="{{ currentRequest.url }}">{{ currentRequest.url }}</a> </td> </tr> <tr ng-if="currentRequest.type === 'dns' || (currentRequest.type === 'web' && (!currentRequest.user_agent || currentRequest.user_agent.indexOf('Webhook.site/') == -1))"> <td>Host</td> <td id="req-ip"> <code class="copy" copy-click="{{ currentRequest.ip }}"></code> <a class="small" target="_blank" ng-show="hasRequests" href="https://whois.domaintools.com/{{ currentRequest.ip }}"> Whois</a> <a class="small" target="_blank" ng-show="hasRequests" href="https://www.shodan.io/host/{{ currentRequest.ip }}"> Shodan</a> <a class="small" target="_blank" ng-show="hasRequests" href="https://www.netify.ai/resources/ips/{{ currentRequest.ip }}"> Netify</a> <a class="small" target="_blank" ng-show="hasRequests" href="https://search.censys.io/hosts/{{ currentRequest.ip }}"> Censys</a> <a class="small" target="_blank" ng-show="hasRequests" href="http://virustotal.com/gui/ip-address/{{ currentRequest.ip }}/relations"> VirusTotal</a> </td> </tr> <tr ng-if="currentRequest.type === 'email'"> <td>Host</td> <td id="req-ip"> {{ currentRequest.hostname }}   <a class="small" target="_blank" ng-show="hasRequests" href="https://whois.domaintools.com/{{ currentRequest.hostname }}"> Whois</a>  <a class="small" target="_blank" ng-show="hasRequests" href="https://www.shodan.io/host/{{ currentRequest.hostname }}"> Shodan</a>  <a class="small" target="_blank" ng-show="hasRequests" href="https://www.netify.ai/resources/ips/{{ currentRequest.hostname }}"> Netlify</a>  <a class="small" target="_blank" ng-show="hasRequests" href="https://search.censys.io/hosts/{{ currentRequest.hostname }}"> Censys</a> </td> </tr> <tr> <td>Date</td> <td id="req-date" title="{{ currentRequest.created_at }} UTC"> <span ng-show="hasRequests">{{ localDate(currentRequest.created_at) }} ({{ relativeDate(currentRequest.created_at) }})</span> </td> </tr> <tr> <td>Size</td> <td id="req-date" title="{{ currentRequest.size }} bytes"> {{ friendlyBytes(currentRequest.size) }} </td> </tr> <tr ng-if="currentRequest.time"> <td>Time</td> <td id="req-time" title="Webhook.site processing time in seconds (including Custom Actions)"> {{ (currentRequest.time | number:3) }} sec </td> </tr> <tr> <td width="15%">ID</td> <td id="req-date">{{ currentRequest.uuid }}</td> </tr> <tr> <td width="15%">Note</td> <td ng-click="addNote(currentRequest)"> <a ng-if="!currentRequest.note" ng-hide="share" ><i class="bi-pencil-fill"></i> Add Note</a> <span class="inline-edit-hover" >{{ currentRequest.note }}</span> </td> </tr> </tbody> </table> <table class="table table-borderless table-striped" ng-if="currentRequest.type === 'email'"> <thead> <tr> <th colspan="2">Verification Checks</th> </tr> </thead> <tbody> <tr ng-repeat="(checkName, checkValue) in currentRequest.checks"> <td width="15%">{{ checkName }}</td> <td>{{ checkValue ? 'Passed' : 'Failed' }}</td> </tr> </tbody> </table> </div> <div class="col-md-6"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">Headers</th> </tr> </thead> <tbody> <tr ng-repeat="(headerName, values) in currentRequest.headers track by headerName"> <td width="25%">{{ headerName }}</td> <td class="long"> <code> {{ values.join(', ') }} </code> </td> </tr> </tbody> </table> </div> </div> <div class="row" id="requestData" ng-show="!hideDetails && currentRequest.type !== 'email'" ng-class="{'muted': !hasRequests}"> <div class="col-md-6"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">Query strings</th> </tr> </thead> <tbody> <tr ng-show="!currentRequest.query"> <td><span class="small">(empty)</span></td> </tr> <tr ng-repeat="(name, value) in currentRequest.query"> <td width="25%" class="break">{{ name }}</td> <td class="break long"><code>{{ value === '' ? '(empty)' : value }}</code></td> </tr> </tbody> </table> </div> <div class="col-md-6"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">Form values</th> </tr> </thead> <tbody> <tr ng-show="!currentRequest.request"> <td><span class="small">(empty)</span></td> </tr> <tr ng-repeat="(name, value) in currentRequest.request"> <td class="break" width="25%">{{ name }}</td> <td class="break long"><code>{{ value === '' ? '(empty)' : value }}</code></td> </tr> </tbody> </table> </div> </div> <div class="row" id="requestFiles" ng-hide="currentRequest.files | isEmpty"> <div class="col-sm-12"> <table class="table table-borderless table-striped table-align-middle"> <thead> <tr> <th colspan="2">Files</th> </tr> </thead> <tbody> <tr ng-repeat="(fileId, fileProps) in currentRequest.files"> <td width="15%"><code>{{ fileId }}</code></td> <td> <a href="{{ '/token/' + token.uuid + '/request/' + currentRequest.uuid + '/download/' + fileProps.id + '?filename=' + fileProps['filename'] }}"> <img style="max-height: 40vh; max-width: 40vh" ng-if="fileProps['content_type'].indexOf('image/') > -1" ng-src="{{ '/token/' + token.uuid + '/request/' + currentRequest.uuid + '/download/' + fileProps.id }}" alt="Attached image preview"> <i class="bi-download"></i> {{ fileProps['filename'] }} ({{ fileProps['content_type'] }}, {{ friendlyBytes(fileProps['size']) }}) </a> </td> </tr> </tbody> </table> </div> </div> <div class="row" ng-class="{'muted': !hasRequests}"> <div class="col-md-12"> <!-- No content --> <p id="noContent" ng-show="!hasRequests || currentRequest.content == ''"> No content</p> <!-- Text content (Email only) --> <p class="pull-right small" ng-show="currentRequest.type === 'email' && currentRequest.text_content"> <label class="inline" title="Toggles word-wrap"> <input type="checkbox" ng-model="wordWrapEnable" ga-event-category="WordWrap" ga-event-action="toggle"/> Word-Wrap</label>  <a ng-click="copy(currentRequest.text_content)">Copy</a> </p> <p class="header strong" ng-show="currentRequest.type === 'email' && currentRequest.text_content"> Text Content</p> <pre class="req-content" btf-markdown="currentRequest.text_content" ng-show="currentRequest.type === 'email' && currentRequest.text_content" ng-class="{'wordwrapDisable': wordWrapEnable}"></pre> <p class="pull-right small" ng-show="currentRequest.type === 'email' && currentRequest.html_content"> <label class="inline" title="Toggles word-wrap"> <input type="checkbox" ng-model="wordWrapEnable" ga-event-category="WordWrap" ga-event-action="toggle"/> Word-Wrap</label>  <a ng-click="copy(currentRequest.html_content)">Copy</a> </p> <p class="header strong" ng-show="currentRequest.type === 'email' && currentRequest.html_content"> HTML Content</p> <pre class="req-content" ng-bind="currentRequest.html_content" ng-show="currentRequest.type === 'email' && currentRequest.html_content" ng-class="{'wordwrapDisable': wordWrapEnable}"></pre> <!-- Content (Email+Web) --> <div ng-show="hasRequests && (currentRequest.content != '' || currentRequest.email_truncated)"> <div class="pull-right small"> <label class="inline" title="Automatically applies easy to read JSON formatting on valid requests" ng-show="currentRequest.type === 'web'"> <input type="checkbox" ng-model="formatJsonEnable" ga-event-category="JSONFormat" ga-event-action="toggle"/> Format JSON </label> <label class="inline" title="Toggles word-wrap"> <input type="checkbox" ng-model="wordWrapEnable" ga-event-category="WordWrap" ga-event-action="toggle"/> Word-Wrap</label>  <a ng-click="copy(currentRequest.content)">Copy</a> </div> <p class="header strong">Raw Content</p> <p ng-if="currentRequest.email_truncated"> Cannot show content due to size. <a href="token/{{ token.uuid }}/request/{{ currentRequest.uuid }}/download">Download original email.</a> </p> <div class="req-content-container"> <pre class="req-content" ng-if="!currentRequest.email_truncated" ng-class="{'wordwrapDisable': wordWrapEnable}" ng-bind="formatJsonEnable ? formatContentJson(currentRequest.content) : currentRequest.content"> </pre> </div> </div> </div> </div> <hr ng-if="hasActionOutput()"> <div class="row customActionOutput" ng-repeat="(id, outputs) in currentRequest.custom_action_output" ng-if="outputs.length > 0"> <div class="col-md-12"> <p class="header strong"> <span ng-if="getAction(id) === null">Output for Deleted Action (#{{ id.substring(0, 5) }})</span> <span ng-if="getAction(id) !== null">Output for Action #{{ getAction(id).order }} ({{ getAction(id).name ? getAction(id).name : actionNames[getAction(id).type] }})</span> <span class="label label-info" ng-if="id.indexOf('delay') !== -1">Was delayed</span> </p> <pre ng-class="{'wordwrapDisable': wordWrapEnable}" ng-repeat="output in outputs track by $index">{{ formatJsonEnable ? formatContentJson(output) : output }}</pre> </div> </div> <hr ng-if="redirectResponses[currentRequest.uuid].data.length > 0"> <div class="row redirectResponse" ng-repeat="(id, response) in redirectResponses[currentRequest.uuid].data"> <div class="col-md-6" ng-if="response.request_content"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">HTTP Request #{{ response.uuid.substring(0, 5) }}</th> </tr> </thead> <tbody> <tr> <td><span class="label label-{{ getLabel(response.method) }}">{{ response.method }}</span> </td> <td class="long"><a href="{{ response.url }}">{{ response.url }}</a></td> </tr> <tr ng-if="response.action_id"> <td>Sent via Custom Action</td> <td ng-if="getAction(response.action_id)"> #{{ getAction(response.action_id).order }} {{ getAction(response.action_id).name ? getAction(response.action_id).name : actionNames[getAction(response.action_id).type] }} </td> <td ng-if="!getAction(response.action_id)" class="muted">Deleted Action (#{{ response.action_id.substring(0, 5) }}) </td> </tr> <tr> <td>Date</td> <td title="{{ response.created_at }} UTC">{{ localDate(response.created_at) }} ({{ relativeDate(response.created_at) }}) </td> </tr> </tbody> </table> </div> <div class="col-md-6" ng-if="response.request_headers"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">Request Headers</th> </tr> </thead> <tbody> <tr ng-repeat="(headerName, values) in response.request_headers"> <td width="25%" class="break">{{ headerName }}</td> <td class="break long"><code ng-repeat="value in values"> {{ value === '' ? '(empty)' : value }}{{ $last ? '' : ', ' }}</code> </td> </tr> </tbody> </table> </div> <div class="col-md-12" ng-if="response.request_content" style="margin-bottom: 15px"> <p id="noContent" ng-show="response.request_content == ''"> No request content</p> <pre ng-bind="formatJsonEnable ? formatContentJson(response.request_content) : response.request_content" ng-show="response.request_content != ''"></pre> </div> <div class="col-md-6"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">Response Details</th> </tr> </thead> <tbody> <tr> <td>URL</td> <td class="long"><code>{{ response.url }}</code></td> </tr> <tr> <td>Response status code</td> <td>{{ response.status }}</td> </tr> <tr ng-if="response.request_time"> <td>Time</td> <td>{{ response.request_time | number:3 }} sec</td> </tr> </tbody> </table> </div> <div class="col-md-6"> <table class="table table-borderless table-striped"> <thead> <tr> <th colspan="2">Response Headers</th> </tr> </thead> <tbody> <tr ng-repeat="(headerName, values) in response.headers"> <td width="25%" class="break">{{ headerName }}</td> <td class="break long"><code ng-repeat="value in values"> {{ value === '' ? '(empty)' : value }}{{ $last ? '' : ', ' }}</code> </td> </tr> </tbody> </table> </div> <div class="col-md-12"> <p id="noContent" ng-show="response.content == ''"> No response content</p> <pre ng-bind="formatJsonEnable ? formatContentJson(response.content) : response.content" ng-show="response.content != ''"></pre> </div> </div> </div> </div> </div> </div> </div> <div class="modal fade" tabindex="-1" role="dialog" id="redirectModal" ng-include="'https://cdn.webhook.site/subviews/modals/redirectModal.html?1723274511'"></div> <div class="modal fade" tabindex="-1" role="dialog" id="editUrlModal" ng-include="'https://cdn.webhook.site/subviews/modals/editUrlModal.html?1727782325'"></div> <div class="modal fade" tabindex="-1" role="dialog" id="newUrlModal" ng-include="'https://cdn.webhook.site/subviews/modals/newUrlModal.html?1729064479'"></div> <div class="modal modal-draggable fade right" tabindex="-1" role="dialog" id="actionsModal" ng-include="'https://cdn.webhook.site/subviews/modals/actionsModal.html?1726655430'"></div> <div class="modal fade" tabindex="-1" role="dialog" id="shareModal" ng-include="'https://cdn.webhook.site/subviews/modals/shareModal.html?1727777571'"></div> <div class="modal modal-draggable fade right" tabindex="-1" role="dialog" id="actionReplayModal" ng-include="'https://cdn.webhook.site/subviews/modals/actionReplayModal.html?1725296629'"></div> <script async src="https://www.googletagmanager.com/gtag/js?id=G-FYRV1HFMZK"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-FYRV1HFMZK'); /*document.querySelectorAll('[ga-event-category]').forEach(function (element) { element.style.backgroundColor = 'hotpink'; });*/ // autotrack.js for GA4 $(document).bind('click', function(e) { if(e.target.hasAttribute('ga-event-category')) { gtag('event', 'click', { 'event_category': e.target.getAttribute('ga-event-category'), 'event_label': e.target.getAttribute('ga-event-action') }); } }); </script> </div> </body> </html>