Skip to main content
Discord Timestamps LogoDiscordTimestamps

Discord Webhook Timestamps: Embeds, ISO-8601 & Dynamic Formatting

By Elena Rostova•Updated 2026-09-25•7 min read
Sending dates through Discord webhooks trips up a lot of developers because Discord has two different timestamp systems: dynamic Unix tags in text and ISO-8601 strings in embed footers. Here is how both work.

The Two Types of Webhook Timestamps: Dynamic vs Footer

When sending embeds to Discord, keep this rule in mind: dynamic tags (`<t:EPOCH:STYLE>`) go inside descriptions and field values. Embed footers, on the other hand, strictly require an ISO-8601 string (like `2026-09-25T20:00:00.000Z`). If you accidentally put a `<t:...>` tag inside the embed footer timestamp field, the Discord API throws an immediate HTTP 400 Bad Request.

Complete Webhook JSON Payload Example

Here is a production-ready JSON payload showing both dynamic timestamp syntax inside fields and the top-level ISO timestamp in the footer:
json
{
  "username": "Server Alert Bot",
  "avatar_url": "https://i.imgur.com/4M34hi2.png",
  "content": "Scheduled Maintenance Alert for all regional nodes!",
  "embeds": [
    {
      "title": "Database Cluster Maintenance",
      "color": 5793266,
      "description": "Upgrades will begin **<t:1727280000:R>**.",
      "fields": [
        {
          "name": "Start Time",
          "value": "<t:1727280000:F>",
          "inline": true
        },
        {
          "name": "Expected Duration",
          "value": "45 Minutes",
          "inline": true
        }
      ],
      "timestamp": "2026-09-25T20:00:00.000Z",
      "footer": {
        "text": "Systems Status Hub"
      }
    }
  ]
}

Sending Webhooks in Node.js (fetch)

Here is how to automate this in modern JavaScript or TypeScript without installing heavy external packages:
javascript
const webhookUrl = process.env.DISCORD_WEBHOOK_URL;
const eventDate = new Date('2026-09-25T20:00:00Z');
const epochSeconds = Math.floor(eventDate.getTime() / 1000);

await fetch(webhookUrl, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    embeds: [{
      title: 'Incident Resolved',
      description: `All services restored as of <t:${epochSeconds}:R> (<t:${epochSeconds}:t>).`,
      color: 0x57F287,
      timestamp: eventDate.toISOString()
    }]
  })
});

Automating Announcements with cURL and GitHub Actions

For automated CI/CD alerts or scheduled event notices, you can calculate the Unix epoch in Bash and send the webhook using cURL in GitHub Actions:
yaml
name: Discord Event Alert
on:
  schedule:
    - cron: '0 12 * * 1' # Every Monday at 12:00 UTC
jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Send Scheduled Discord Webhook
        env:
          WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
        run: |
          # Calculate epoch for event in 2 hours
          TARGET_EPOCH=$(($(date +%s) + 7200))
          
          curl -H "Content-Type: application/json" \
            -X POST \
            -d '{"content": "Weekly Community Standby starts <t:'"$TARGET_EPOCH"':R> (<t:'"$TARGET_EPOCH"':F>)!"}' \
            "$WEBHOOK_URL"

Frequently Asked Questions

No. Discord does not parse `<t:EPOCH:STYLE>` tags inside embed `title` or `author.name` properties. They will display as raw code. Only use them inside embed `description`, `fields.value`, and regular message `content`.