How real time indexation of a link is validated by serverless functions

Written by SeLinkPro
August 10, 2026
Building serverless functions to validate link indexation in real time

Understanding how real time indexation of a link is validated by serverless functions requires mapping automated HTTP requests directly to cloud compute nodes. Positions in the top-3 of an organic SERP capture over 50% of total CTR, making immediate data validation a mathematical necessity for backlink profile analysis. A link transfers zero PageRank until search engine crawlers fetch, render, and store the destination URL. Traditional server environments face high latency and continuous resource drain when executing intermittent validation scripts across thousands of external target domains. Serverless architecture removes idle computing costs. It allocates processing power exactly at the millisecond a validation task triggers.

FaaS operates entirely without provisioned virtual machines. Engineers upload discrete code blocks that execute exclusively upon activation.

This execution model forms the foundation of Event-driven Architecture. An API call or a scheduled webhook initiates the workflow. Cloud infrastructure instantly provisions micro-environments to process the script. AWS Lambda handles heavy background processes by permitting up to 15 minutes of execution time and up to 10 GB of memory allocation per instance. Cloudflare Workers deploy code directly to network edge locations, achieving cold start times under 5 milliseconds for rapid pinging. Node.js manages thousands of asynchronous network calls simultaneously through its non-blocking event loop. Python excels at parsing complex JSON payloads and manipulating data pipelines directly from third-party SEO databases.

Validating indexed pages instantly requires strict technical baselines. The cloud infrastructure must handle thousands of concurrent HTTP connections while applying exponential backoff to respect third-party rate limits. The deployed scripts execute exact routing logic to capture status codes, evaluate canonical tags, and scan raw HTML for restrictive directives.

Architectural patterns for serverless indexation validation

Designing a system to process thousands of URLs demands a strict stateless model. Every execution environment spins up as a blank slate. Data from a previous invocation does not persist in local memory or file systems. State must be externalized.

This architectural constraint forces validation tasks to operate independently. If a process requires historical context, it fetches that data from an external database rather than a local cache. Scalability emerges directly from this isolation. When a bulk upload requires validating thousands of target pages, the infrastructure does not queue the tasks sequentially. It provisions parallel compute instances instantly. The system scales from zero to maximum concurrency in milliseconds, processing the entire batch simultaneously.

Fault tolerance configurations dictate how the system handles transient network failures during execution. Infrastructure parameters define maximum retry attempts for failed invocations. Asynchronous triggers automatically route failed payloads to designated dead-letter queues for later analysis. This prevents data loss without blocking the main execution thread.

Pipeline mapping and event routing

The operational pipeline maps inbound webhooks directly to task execution environments. An external trigger transmits a payload to a gateway endpoint.

The gateway parses the inbound payload and maps specific routing keys to distinct compute instances. A payload containing raw HTML triggers an extraction script. A payload containing a list of target URLs triggers an outbound network ping protocol. This mapping eliminates routing logic from the codebase itself, shifting the responsibility entirely to the cloud infrastructure. The compute layer remains ignorant of the trigger source, executing the payload parameters and terminating instantly upon completion.

Comparing execution environments

Selecting the correct execution environment dictates system latency and operational overhead. Centralized compute models contrast sharply with distributed edge computing architectures.

Architectural Parameter AWS Lambda Execution Cloudflare Workers Edge Computing
Deployment Topology Centralized regional data centers Decentralized global edge nodes
Isolation Technology MicroVM containers V8 isolate engines
Maximum Memory Allocation 10 GB per instance 128 MB per instance
Network Routing Distance High latency based on region proximity Ultra-low latency globally distributed

AWS Lambda provisions isolated containers in specific geographic regions. This regional centralization adds network latency if the target server resides continents away. It compensates by supporting massive computational payloads and extended execution limits. Cloudflare Workers execute code within V8 isolates distributed across hundreds of global edge nodes. The code runs physically closer to the target server. This edge computing model minimizes regional routing latency entirely, making it superior for lightweight network pinging and rapid status checks.

Runtime memory allocation strategies

Memory allocation dictates CPU power. Provisioning excessive memory wastes budget. Under-provisioning causes system failure through timeout errors.

Configuring runtime environments requires aligning the language architecture with the allocation parameters.

  • Node.js environments process asynchronous network calls natively. Executing thousands of non-blocking requests requires minimal computational overhead. Engineers configure these runtimes with 128 MB or 256 MB of memory. The single-threaded event loop handles concurrent network wait times without demanding high CPU cycles.
  • Python environments demand higher baseline resources. Executing complex data manipulation tasks loads heavily into system memory. Memory allocation for Python runtimes typically requires a baseline of 512 MB. Increasing memory directly increases available CPU processing power within the infrastructure, drastically reducing total execution time for intensive validation logic.

API integrations and search engine endpoints setup

Establishing secure system-to-system communication dictates the reliability of the indexation validation pipeline. Inadequate credential handling causes immediate authentication failures. The architecture demands precise request structures and rigorous payload formatting. Connecting serverless runtimes to external data sources requires strict adherence to authentication protocols and schema requirements.

Authentication mechanisms and credential handling

Connecting to Google services requires robust identity verification. Standard API keys lack the necessary cryptographic security for server-to-server operations. Engineers must configure a Google Cloud Platform Service Account. This service account acts as a dedicated machine user.

Generating the credentials outputs a specific JSON file. The Google Cloud Platform Service Account JSON Key File contains critical routing and cryptographic assets. The file includes the required public/private key pair setups. The serverless function uses this private key to sign request assertions and request short-lived access tokens. Hardcoding these credentials directly into the execution script introduces severe infrastructure vulnerabilities. Security standards dictate injecting API credentials into the runtime execution environment via secure environment variables.

External data providers implement different authentication models. The DataForSEO Backlink API uses basic access authentication. The integration requires passing a Base64-encoded string combining the login and password within the HTTP headers. Failing to encode the credentials properly results in unauthorized access errors.

REST API endpoints and JSON payloads

Querying the status of specific pages requires precise targeting of official endpoints. Each API expects a strict request structure. Malformed JSON payloads trigger validation errors at the edge, wasting execution time.

The core endpoints for a comprehensive validation workflow include:

  • Google Search Console API: Provides historical performance data and submits sitemap pings.
  • URL Inspection API: Delivers real-time indexation status directly from the Google infrastructure.
  • DataForSEO Backlink API: Extracts raw topological data concerning referring domains and anchor texts.

URL inspection API integration

Retrieving real-time crawl status requires an HTTP POST request. The target REST API endpoint is located at the official Google APIs domain under the URL Inspection path. The system must format the JSON payload specifically to declare the target URL and the associated verified property.

A standard JSON payload requires three specific parameters:


{
  "inspectionUrl": "https://example.com/target-page",
  "siteUrl": "https://example.com/",
  "languageCode": "en-US"
}

The response schema returned by the API is deeply nested. Parsing the JSON requires traversing multiple object layers. The critical indexation data resides within the coverage state object. Engineers must extract this specific node to determine if the page is currently available in the SERP. The script must implement strict null checking during the response schema parsing to prevent runtime crashes if the API returns an unexpected empty object.

DataForSEO backlink API setup

Analyzing the inbound link profile necessitates querying a massive database. The DataForSEO live backlink endpoint processes complex filtering commands. Submitting an HTTP POST request allows for granular data extraction.

The JSON payload structure for this API handles array-based targeting. The application passes an array of target URLs and dictates the desired sorting metrics. The system can filter results by specific referring domains to minimize the returned data size. This reduces network transfer latency.

Response schema parsing guidelines

Extracting actionable data from API responses requires strict schema mapping. APIs return vast amounts of metadata alongside the requested data. Parsing logic must isolate the specific key-value pairs required for the SEO validation workflow.

API Service HTTP Method Target JSON Node Expected Data Type
URL Inspection API POST inspectionResult.indexStatusResult.verdict String
URL Inspection API POST inspectionResult.indexStatusResult.coverageState String
DataForSEO Backlink API POST tasks[0].result[0].items Array
Google Search Console API GET rows[0].keys Array

Parsing arrays demands iterative loops. The serverless function maps over the items array returned by the Backlink API. Each iteration extracts the source URL, the target URL, and the anchor text. Unstructured response handling leads to data corruption downstream. Explicitly defining the expected variable types ensures the parsed metrics align correctly with the database schema.

Handling HTTP headers and technical crawl diagnostics

Serverless validation pipelines must intercept and evaluate the network response layer before querying indexation endpoints. An active link on a misconfigured page holds zero SEO value. The function initiates an HTTP request to the target URL and extracts the response headers. This initial fetch bypasses full DOM rendering to conserve memory allocation. System failure often occurs at this junction if diagnostic checks are skipped.

HTTP Status Diagnostic Category Validation Action
200 Success Proceed to DOM extraction and API validation
301 Permanent Redirect Log Location header, update target URL, follow path
302 Temporary Redirect Flag as unstable URL equity, follow path
404 Not Found Terminate execution, flag link as dead
410 Gone Terminate execution, flag link as permanently removed
500 Server Error Trigger retry logic, flag infrastructure technical error

Traffic drops frequently originate from invisible routing configurations. Implement strict detection logic for Redirect Chains. The HTTP client must track the Location header across sequential hops. Hardcode a strict ceiling on maximum redirects within the serverless function environment. Exceeding five hops triggers a bottleneck flag and halts further execution.

Status code 200 requires payload verification. Soft 404s bypass superficial network checks. The script must compare the DOM size and structural markers against known error templates to detect false positives. Canonical errors manifest when the link rel="canonical" node points to an alternative URL. The validation script must match the requested URL against the extracted canonical string. Mismatches invalidate the equity transfer and corrupt the data pipeline.

HTTP header and meta tag validation rules

Directive conflicts destroy SERP visibility. Search engine crawlers prioritize HTTP headers over HTML elements. Parse the X-Robots-Tag immediately upon receiving the response headers.

  • Match noindex or none values to trigger immediate validation failure.
  • Detect nofollow directives applied globally at the header level.
  • Terminate function execution early upon detecting blocking headers to minimize billing duration.

Concurrent processing frameworks handle the extraction of HTML meta tags and Security Headers at scale. Asynchronous execution engines map target arrays and resolve multiple HTTP promises simultaneously. This architectural pattern prevents network I/O bottlenecks. Once the HTML streams into the runtime environment, the parsing logic targets the meta name="robots" node to cross-reference header directives. Concurrent extraction scripts also log Security Headers to verify protocol configurations and detect potential firewall blocks that mimic 403 or 500 errors during log analysis.

Managing API quotas and concurrent processing

Unrestricted concurrent execution destroys external endpoints. Hitting the Google Index Checker API and DataForSEO bulk endpoints simultaneously with unthrottled payloads triggers immediate rate limits. Unmanaged parallel requests result in dropped data packets. The entire synchronization pipeline halts.

When target servers detect aggressive polling from serverless architectures, they return an HTTP 429 Too Many Requests response. This status code mandates an immediate pause in pipeline execution. Ignore it, and platforms revoke API credentials entirely. FaaS models amplify this risk due to their dynamic scaling capabilities. A hundred micro-instances spinning up to process a sudden influx of backlink validation webhooks will overwhelm restrictive quotas in seconds.

Control the egress rate by implementing programmatic pacing mechanisms within the routing logic. A token bucket algorithm regulates outgoing requests by requiring a computational token for every HTTP call. This architecture permits short traffic bursts up to a defined concurrency threshold while maintaining a strict baseline throughput. Fixed window counters drop requests the millisecond a threshold is crossed. Token buckets queue the URL payloads until new capacity generates.

Throttling handling logic and exponential backoff

Hardcoded retry loops corrupt system architecture. A linear retry protocol hammering a degraded endpoint creates a thundering herd problem, extending the service outage. Server Load Mitigation requires dynamic adaptation to external endpoint health.

Exponential backoff with jitter intercepts the HTTP 429 error and dynamically scales the waiting period. When an execution engine encounters a throttling event, it suspends the active thread. The first retry occurs after a baseline delay. Subsequent failures exponentially increase the delay interval. This mathematical progression prevents FaaS instances from draining concurrent execution limits while waiting for third-party servers to recover.

  • Extract the Retry-After header from the HTTP 429 response payload to determine the exact server-mandated pause duration.
  • Multiply the base delay by two to the power of the current retry count to scale the backoff interval.
  • Inject cryptographic jitter into the equation to randomize the exact execution millisecond, preventing multiple suspended threads from waking simultaneously.
  • Halt the function and route the failed URL batch to a dead-letter queue after the maximum retry threshold is breached.

Task schedulers and batch URL processing

Real-time validation requires state-driven processing, not instantaneous brute force. Grouping target URLs into arrays optimizes quota consumption and reduces network I/O operations. Configure a Task Scheduler to aggregate single validation events into dense batch payloads.

A cron event running on a five-minute interval pulls accumulated target URLs from the storage array. This shifts the architecture from synchronous individual calls to asynchronous batch processing. The Google Index Checker API strictly enforces project-level quotas. Task scheduling ensures the validation script parses these limits evenly over a 24-hour cycle instead of exhausting daily allocations during a sudden spike in crawling activity.

DataForSEO bulk endpoints demand grouped JSON arrays to function efficiently. Sending sequential GET requests consumes excess quota units and heavily degrades execution speed. Transmitting a single POST payload containing a massive array of target URLs consumes minimal API overhead. This batching strategy bypasses concurrency limits while maximizing data extraction per billing unit.

Select the appropriate pacing algorithm based on the endpoint architecture and bulk processing requirements.

Algorithm Pattern Traffic Handling Logic API Quota Protection Server Load Mitigation
Fixed Window Drops requests upon reaching the exact limit within a strict timeframe. High Low
Token Bucket Allows controlled bursts. Accumulates unused capacity for sudden URL influxes. Medium High
Leaky Bucket Forces a steady egress rate. Flattens burst traffic into a continuous stream. Maximum Maximum
Exponential Backoff Halts processing on 429 errors. Scales wait times based on failure count. Critical Critical

Infrastructure deployment via serverless framework

Manual function uploads generate architectural flaws. Deploying validation scripts directly through a web console creates untrackable configuration drift. We use infrastructure-as-code principles to standardize the deployment cycle.

The Serverless Framework manages the entire deployment stack through a single declarative file. You define the routing, permissions, and environment variables in the configuration, allowing the engine to provision the required cloud resources automatically.

Configuring the serverless.yml file

The serverless.yml file sits at the root of your project directory. It controls the provider settings, runtime definitions, and event triggers. A properly structured file prevents system failures caused by mismatched execution environments.

Define the core provider parameters and execution boundaries first. Restrict the deployment region and specify the target runtime.

service: indexation-validator
provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1
  memorySize: 512
  timeout: 30

Security policies require strict boundary management. IAM roles must follow the principle of least privilege. Do not attach wildcard administrative policies to the execution role. Define explicit iamRoleStatements within the provider block to grant the function access only to the necessary resources, such as specific object storage buckets or database tables used for temporary state storage.

Bind the function to the web using API Gateway configuration. The HTTP event mapping routes incoming web traffic directly to your handler payload.

functions:
  validateUrls:
    handler: src/handler.processBatch
    events:
      - http:
          path: /validate
          method: post
          cors: true

Dependency bundling and package optimization

Bloated deployment payloads create deployment bottlenecks. Pushing an unoptimized directory containing full dependency trees drastically inflates the package size. Heavy packages increase upload durations and degrade system efficiency.

Implement dependency bundling strategies. For JavaScript runtimes, Webpack intercepts the build process to compile all required modules into a single minified file. Enable tree shaking within the Webpack configuration. Tree shaking acts as dead code elimination. It scans the import statements and strips out any unused functions from external libraries. If your script only utilizes one specific method from a large utility library, tree shaking ensures only that method makes it into the final deployment package.

Python runtimes require a different approach to package minimization. AWS environments provide built-in access to the core infrastructure SDK. Boto3 integration comes pre-installed in the default execution environment. Exclude Boto3 from your deployment requirements file to strip unnecessary weight from the payload. Only bundle a custom Boto3 layer if your application demands strict version parity with a newer release.

Optimization Technique Implementation Target Impact on Deployment Package
Tree Shaking JavaScript modules Strips unused library code. Reduces final bundle size.
Native SDK Exclusion Python dependencies Removes redundant Boto3 packages. Prevents module conflicts.
Minification Source code Removes whitespace and comments. Condenses syntax.
Layer Separation Heavy binary dependencies Keeps function code lightweight. Caches static libraries.

CLI commands for stack deployment

Command line execution drives the infrastructure-as-code pipeline. Standardize your deployment workflow around core CLI commands.

  • sls package compiles the deployment artifacts locally without pushing them to the cloud provider. Use this to inspect the final zip file size and verify the bundling strategy.
  • sls deploy initiates the primary infrastructure upload. It parses the YAML file, provisions the IAM roles, configures the API Gateway, and pushes the optimized code package.
  • sls deploy function -f functionName isolates the update to a specific handler. This command bypasses the full infrastructure provisioning cycle, updating only the executable code. It executes much faster during active script iteration.
  • sls remove tears down the entire stack. This command destroys all associated API endpoints, roles, and functions, preventing orphaned resources from generating passive billing charges.

Environment variables govern external API credentials and endpoint URLs. Pass dynamic variables directly through the CLI during deployment using stage flags. This isolates testing endpoints from production traffic without requiring hardcoded configuration changes.

Workflow orchestration with n8n and make

Serverless functions execute discrete computational tasks. Workflow automation platforms assemble these isolated tasks into operational business pipelines. n8n and Make operate as the orchestration layer, controlling the flow of data between your CMS, the serverless validation endpoints, and your reporting dashboards. They replace custom polling scripts with visual node-based logic.

Webhook routing configurations dictate how external systems initiate the validation pipeline. A content update triggers a webhook payload containing the target URL. The automation tool captures this event and initiates the workflow execution. Configure the Webhook node to strictly accept POST requests. Define a strict JSON schema within the node settings to validate the incoming payload structure before processing begins. Malformed requests drop immediately, preventing unnecessary API Gateway invocations.

Stateless state transfer governs the data progression through the workflow. Automation platforms process data in isolated execution units. Node memory does not persist across complex branching paths. Inject a unique correlation ID into the initial JSON payload. Pass this exact identifier through every subsequent HTTP Request node. The final data destination relies entirely on this embedded context to map the validation result back to the original database record.

HTTP request node configurations

The HTTP Request node acts as the bridge to your serverless infrastructure. Precision in its configuration prevents downstream execution failures.

  • Set the authentication type to match your API Gateway configuration, passing the required keys via headers rather than query parameters.
  • Enable the option to return full response data, ensuring HTTP headers are available for parsing alongside the response body.
  • Configure timeout settings to match the maximum execution limit of your serverless environment to prevent premature connection termination.
  • Format the outgoing body as raw JSON, explicitly declaring the content type header.

Disable the default error-handling behavior that stops workflow execution on non-200 responses. Serverless indexation functions often return 404 or 410 statuses as valid operational data indicating a dropped URL. The workflow must catch these responses, parse the status code, and log the removal rather than halting the entire queue.

Schedule trigger events for link workflows

Automated link-building workflows require precise temporal execution. Trigger nodes replace standard server cron jobs for running batch operations. Schedule Trigger events handle daily backlink audits without requiring external invocation.

Configure the Schedule node in Make or the Cron trigger in n8n to execute during off-peak server hours. The trigger initiates a database query pulling all unverified URLs. A loop node processes this list, sending batches to the serverless indexation function. Synchronize these trigger schedules with the limits of your target databases to prevent locking read operations during high-traffic periods.

Granular scheduling controls pacing. Instead of running a single massive job at midnight, distribute the load. Set the trigger interval to fire every fifteen minutes, processing micro-batches of URLs. This continuous trickle architecture aligns perfectly with the event-driven nature of serverless deployments.

JSON transformations for reporting dashboards

DataForSEO and search engine APIs return highly nested arrays. Reporting dashboards require flat, tabular data structures. The workflow must transform the hierarchical payload before pushing it to the visualization layer. Use the Set node in n8n or the Iterator and Aggregator modules in Make to rebuild the data schema.

Extract specific keys from the deep JSON structure. Discard extraneous meta-data like execution times or internal server IDs generated by the external API. Isolate the target URL, the indexation status, the discovered anchor text, and the crawl timestamp.

Raw JSON Data Node Flattened Dashboard Field Data Type Requirement
tasks[0].result[0].items[0].url target_url String
tasks[0].result[0].items[0].is_indexed index_status Boolean
tasks[0].result[0].items[0].metrics.rank domain_authority Integer
tasks[0].result[0].items[0].fetch_time last_crawled_date Datetime

Data normalization occurs immediately after flattening. Standardize boolean values and date formats across all data sources. If the Google API returns a text string for the indexation status while DataForSEO returns a boolean, use a Switch node to map these disparate values to a single standard. Push this normalized, flat JSON array into your data warehouse using the dedicated integration node.

Monitoring, logging, and latency mitigation

Unmonitored execution layers conceal deep system failure. Blind task processing at high volume leads to undetected throttling and subsequent traffic drop across tracked domains. You require strict visibility into the compute lifecycle to isolate any architectural flaw. Establish strict monitoring baselines for average response time, Latency, and execution duration.

Standard log streams fail under concurrent request loads. You must set up CloudWatch Log Insights for historical logging of validation events. Efficient log analysis prevents unstructured data from burying technical error codes behind endless text arrays. Log Insights queries parse structured JSON payloads to extract granular performance data directly from the execution environment.

Query Target Log Insights Syntax Structure Diagnostic Value
Latency Spikes filter @duration > 5000 | sort @timestamp desc Identifies bottleneck occurrences during heavy external API calls
Technical Error Rates filter @message like /Error/ | stats count(@requestId) by bin(1h) Tracks system failure trends over defined temporal periods
Execution Limits stats max(@duration), avg(@duration) by bin(5m) Monitors average response time against defined compute thresholds

Complex URL validation sequences demand granular tracking mechanisms. Configure AWS X-Ray for distributed tracing across the entire pipeline. A single trigger passes through gateways, processing nodes, and external verification endpoints. X-Ray generates precise execution maps tracking the exact microsecond a payload spends at each network hop.

You isolate the specific integration causing the delay.

  • Identify network latency between the compute node and the search engine endpoint
  • Detect parsing delays within the data transformation logic
  • Isolate queue accumulation before warehouse ingestion

Architectural flaw detection becomes deterministic rather than speculative.

Cold start mitigation

Analyze Cold starts rigorously. Provisioning a new compute container adds heavy initialization overhead to the first request in a batch. This initialization delays downstream workflows and artificially skews your execution duration metrics.

Implement HTTP Keep Alive to bypass network initialization limits.

Configure the runtime environment variables directly in your deployment template. Inject AWS_NODEJS_CONNECTION_REUSE_ENABLED with a value of 1. This parameter forces the execution layer to reuse established network connections for outbound API traffic.

Opening fresh connection handshakes for every sequential outbound request consumes excess compute cycles. Connection reuse eliminates this protocol overhead. Execution duration stabilizes immediately. You optimize Function-as-a-Service throughput directly at the network layer.

Keep Reading

Explore more insights and technical guides from our blog.

Managing API rate limits when processing thousands of donor URLs
Aug 13, 2026

Managing API rate limits when processing thousands of donor URLs

Managing strict API rate limits is absolutely crucial when processing thousands of donor URLs for your link building campaigns.

Automating the extraction of broken links into developer task trackers
Aug 12, 2026

Automating the extraction of broken links into developer task trackers

Automating the daily extraction of your broken links into developer task trackers saves time and fixes SEO errors quickly.

Automating bulk domain authority checks via Ahrefs API endpoints
Aug 10, 2026

Automating bulk domain authority checks via Ahrefs API endpoints

Automating complex bulk domain authority checks is possible via custom endpoints of the Ahrefs API for large scale SEO analysis.

Explore protection modules

Screen vendors with our bulk domain metrics and PBN checker to detect toxic networks and avoid link fraud.

Bulk Google and Yandex index checker

Verify agency reports and track live SERP status in Google and Yandex to protect your SEO ROI.

Detect stealthy removals, nofollow tag injections, and altered anchors instantly.

Visualize anchor distribution to prevent algorithmic penalties caused by agency over-optimization.

Detect orphan pages, deep click depths, and toxic reciprocal links built by careless agencies.

Reverse engineer top SERP rankings and compare 50+ on-page SEO metrics to outrank competitors.

Semantic backlink analyzer

Detect stealthy content rewrites, relevance drops, and injected spam links.

Technical SEO site audit tool

Run a deep technical crawl to identify 4xx errors, missing meta tags, and indexation blockers.

Semantic internal linking

Build a semantic internal linking structure, eliminate orphan pages, and simulate PageRank distribution.

Bulk PR checker

Calculate true internal PageRank distribution based on your exact site architecture to identify authority hubs.

Parse live Google SERPs, extract LSI entities, and write highly relevant articles.

Protect your SEO today.