API
Generate timestamps and change your bot settings from your own programs. Every endpoint matches a bot command, and requests follow the settings of the Discord account the key was created for.
Generate timestamps and change your bot settings from your own programs. Every endpoint matches a bot command, and requests follow the settings of the Discord account the key was created for.
Log in to create API keys. The keys act as one of the Discord accounts linked to your profile.
Send your key as a bearer token in the Authorization header of every request.
This returns the timestamp for 18:30 today in your saved time zone. The key in the examples is made up, use your own:
curl https://api.hammertime.cyou/at \
-H "Authorization: Bearer 42|htk_qqXmIwpKxbAe3zYntwsLqK83wcKzbjD34M0yjsV9a698cb93" \
-H "Content-Type: application/json" \
-d '{"hour": 18, "minute": 30}'A key has the permissions it was created with, and the rest of this page refers to them by these codes.
Every key can call GET/me, whatever its permissions, to find out which ones it has.
| Permission | Allows |
|---|---|
timestamps:create | Generating timestamps with the timestamp endpoints and MCP tools, as the Discord account the key acts as. |
settings:read | Reading the bot settings of that account. |
settings:write | Changing the bot settings of that account, only the fields that are sent. |
Requests are rate limited per key. The RateLimit headers of every response tell you where you stand, and a 429 response comes with a Retry-After header.
Runs are counted like bot commands, and the reply says which run it was, unless you turned statistics off in your app settings.
Every endpoint with the fields it takes and the responses it gives. This is read from the OpenAPI specification of the API server, so it always matches the version that is running.
Base URL
https://api.hammertime.cyouEvery error response has this body. The status code tells what kind of error it is, and error.code the exact reason.
{"error": {object"code": "commands.at.responses.hourRange",stringMachine-readable reason. For rejected command input this is the bot's locale key, e.g. commands.at.responses.hourRange"message": "When a meridiem is not specified, hour must be a number between 0 and 23",stringEnglish explanation, the same text the Discord bot replies with"params": {},objectoptionalValues interpolated into the message"issues": [object[]optionalFor invalid_request: what is wrong with which field{"path": "string",string"message": "string"string}]}}Bot commands as endpoints
Equivalent to the bot's /add command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"to": 0,numberThe UNIX timestamp in seconds"years": 1,integeroptionalmin 1How many years to add to the specified timestamp"months": 1,integeroptionalmin 1How many months to add to the specified timestamp"days": 1,integeroptionalmin 1How many days to add to the specified timestamp"hours": 1,integeroptionalmin 1How many hours to add to the specified timestamp"minutes": 1,integeroptionalmin 1How many minutes to add to the specified timestamp"seconds": 0.001,numberoptionalmin 0.001How many seconds to add to the specified timestamp"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /ago command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"years": 1,integeroptionalmin 1How many years to subtract from the current time"months": 1,integeroptionalmin 1How many months to subtract from the current time"days": 1,integeroptionalmin 1How many days to subtract from the current time"hours": 1,integeroptionalmin 1How many hours to subtract from the current time"minutes": 1,integeroptionalmin 1How many minutes to subtract from the current time"seconds": 0.001,numberoptionalmin 0.001How many seconds to subtract from the current time"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /at command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"year": 0,integeroptionalSpecify the year (defaults to current year)"month": 1,integeroptionalmin 1, max 12Specify the month (defaults to current month)"day": 1,integeroptionalmin 1, max 31Specify the day (defaults to current day)"hour": "string",string | numberoptionalSpecify the hour (defaults to current hour). A plain number is accepted and read as text."hour12": 1,integeroptionalmin 1, max 12Specify the hour using 12-hour clock (defaults to current hour)"am": false,booleanoptionalWhen True, hour must be between 1 to 12 and will be interpreted as AM (ante meridiem)"pm": false,booleanoptionalWhen True, hour must be between 1 to 12 and will be interpreted as PM (post meridiem)"minute": 0,integeroptionalmin 0, max 59Specify the minute (defaults to current minute)"second": 0,numberoptionalmin 0, max 59.999Specify the second (defaults to 0)"timezone": "string",stringoptionalmin length 3Specify the timezone (defaults to GMT)"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /at12 command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"year": 0,integeroptionalSpecify the year (defaults to current year)"month": 1,integeroptionalmin 1, max 12Specify the month (defaults to current month)"day": 1,integeroptionalmin 1, max 31Specify the day (defaults to current day)"hour": 1,integeroptionalmin 1, max 12Specify the hour (defaults to current hour)"am": false,booleanoptionalWhen True, hour will be interpreted as am (ante meridiem, before noon)"pm": false,booleanoptionalWhen True, hour will be interpreted as pm (post meridiem, after noon)"minute": 0,integeroptionalmin 0, max 59Specify the minute (defaults to current minute)"second": 0,numberoptionalmin 0, max 59.999Specify the second (defaults to 0)"timezone": "string",stringoptionalmin length 3Specify the timezone (defaults to GMT)"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /in command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"years": 1,integeroptionalmin 1How many years to add to the current time"months": 1,integeroptionalmin 1How many months to add to the current time"days": 1,integeroptionalmin 1How many days to add to the current time"hours": 1,integeroptionalmin 1How many hours to add to the current time"minutes": 1,integeroptionalmin 1How many minutes to add to the current time"seconds": 0.001,numberoptionalmin 0.001How many seconds to add to the current time"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /iso command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"value": "string",stringmin length 10, max length 25The ISO 8601 standard timestamp"timezone": "string",stringoptionalmin length 3Specify the timezone (defaults to GMT)"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /snowflake command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"value": "string",stringmin length 1The Snowflake number"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /subtract command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"from": 0,numberThe UNIX timestamp in seconds"years": 1,integeroptionalmin 1How many years to subtract from the specified timestamp"months": 1,integeroptionalmin 1How many months to subtract from the specified timestamp"days": 1,integeroptionalmin 1How many days to subtract from the specified timestamp"hours": 1,integeroptionalmin 1How many hours to subtract from the specified timestamp"minutes": 1,integeroptionalmin 1How many minutes to subtract from the specified timestamp"seconds": 0.001,numberoptionalmin 0.001How many seconds to subtract from the specified timestamp"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}Equivalent to the bot's /unix command: the same options, and any option left out falls back to the account's saved settings.
Permissiontimestamps:create{"value": 0,integerThe UNIX timestamp in seconds"format": "d",stringoptionalReturns only the specified format in the response(d (short date), f (date and time), t (short time), D (long date), F (weekday, date and time), s (short date and short time), S (short date and long time), R (relative), T (long time), all (all (default)))"header": false,booleanoptionalDisplay the initial time (as interpreted by the bot) on top of the response"columns": "both",stringoptionalSpecify which columns to display in the returned response(both (both syntax and preview), preview (preview only), syntax (syntax only))"ephemeral": falsebooleanoptionalWhen true the response will only be visible to you}{"command": "at",string(add, ago, at, at12, in, iso, snowflake, subtract, unix)"unix": 1792773000,integerUNIX timestamp in seconds"timezone": "Europe/Budapest",string | nullThe timezone the input was interpreted in, null for commands that have none"header": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest",string | nullThe exact time as interpreted, null when the header is turned off"content": "📅 2026-10-23 • 🕕 18:30:00 • 🌐 Europe/Budapest\n`<t:1792773000:d>` → **<t:1792773000:d>**\n`<t:1792773000:R>` → **<t:1792773000:R>**",stringThe reply the bot would send: the optional header and the syntax/preview rows"singleFormat": null,string | nullThe one format that was asked for (by option or setting), null when every format is listed"minimalReply": false,booleanTrue when only the preview of a single format is meant to be shown, which the formatMinimalReply setting asks for"usingAtHoursOnly": true,booleanoptionalOnly for at: the hour was given as a bare 24-hour value, which the at12 command or a meridiem makes unambiguous"formats": [object[]{"format": "d",stringDiscord timestamp style (d, D, t, T, f, F, s, S or R)"timestamp": "<t:1792773000:d>"stringMarkdown to paste into Discord, e.g. <t:1650802953:R>}],"telemetry": {objectoptionalPresent only when usage telemetry is enabled in the settings of the account the key acts as"executionNumber": 1234,integerHow many times the command has been run, across Discord and the API"command": "at",string"privacyPolicyUrl": "https://hammertime.cyou/en/legal#telemetry-statistics",string"note": "This is execution #1234 for the /at command (since we started counting). Thank you for contributing telemetry data, which helps the bot's future development."stringThe sentence the bot appends to its replies}}The bot settings of the account
The saved settings of the account the key acts as. These are the defaults the timestamp endpoints fall back to.
Permissionsettings:read{"ephemeral": true,boolean | nullWhether the bot replies are only visible to you (no effect on the API)"timezone": "Europe/Budapest",string | nullTimezone used when a command does not specify one"header": true,boolean | nullWhether replies start with the exact time as interpreted"boldPreview": true,boolean | nullWhether previews are bold when listing all formats"columns": null,string | nullWhich columns replies show(both, preview, syntax)"format": null,string | nullOnly return this format instead of all of them(d, D, t, T, f, F, s, S, R)"formatMinimalReply": true,boolean | nullWith a single format, reply with just the preview"telemetry": true,boolean | nullWhether anonymous command usage is recorded, and the run count shown in replies"defaultAtHour": null,integer | nullHour (0-23) used by the at command when none is given"defaultAt12Hour": null,integer | nullHour (1-12) used by the at12 and at commands when none is given"defaultAtMinute": null,integer | nullMinute used by the at commands when none is given"defaultAtSecond": 0integer | nullSecond used by the at commands when none is given}Changes the given settings only. A null value resets a setting to its default.
Permissionsettings:write{"ephemeral": false,boolean | nulloptional"timezone": "string",string | nulloptionalmin length 1, max length 64"header": false,boolean | nulloptional"boldPreview": false,boolean | nulloptional"columns": "both",string | nulloptional(both, preview, syntax)"format": "d",string | nulloptional(d, D, t, T, f, F, s, S, R)"formatMinimalReply": false,boolean | nulloptional"telemetry": false,boolean | nulloptional"defaultAtHour": 0,integer | nulloptionalmin 0, max 23"defaultAt12Hour": 1,integer | nulloptionalmin 1, max 12"defaultAtMinute": 0,integer | nulloptionalmin 0, max 59"defaultAtSecond": 0integer | nulloptionalmin 0, max 59}{"ephemeral": true,boolean | nullWhether the bot replies are only visible to you (no effect on the API)"timezone": "Europe/Budapest",string | nullTimezone used when a command does not specify one"header": true,boolean | nullWhether replies start with the exact time as interpreted"boldPreview": true,boolean | nullWhether previews are bold when listing all formats"columns": null,string | nullWhich columns replies show(both, preview, syntax)"format": null,string | nullOnly return this format instead of all of them(d, D, t, T, f, F, s, S, R)"formatMinimalReply": true,boolean | nullWith a single format, reply with just the preview"telemetry": true,boolean | nullWhether anonymous command usage is recorded, and the run count shown in replies"defaultAtHour": null,integer | nullHour (0-23) used by the at command when none is given"defaultAt12Hour": null,integer | nullHour (1-12) used by the at12 and at commands when none is given"defaultAtMinute": null,integer | nullMinute used by the at commands when none is given"defaultAtSecond": 0integer | nullSecond used by the at commands when none is given}About the API key in use
Which account the key acts as and what it is allowed to do.
Any valid key{"keyId": "42",string"kind": "user",string(user, service)"discordUserId": "140360880079503362",stringThe Discord account the key acts as"scopes": ["timestamps:create","settings:read","settings:write"]string[]}Service status
Whether the service is up.
No key needed{"status": "ok"string(ok)}The MCP server uses the Streamable HTTP transport and the same keys. It offers one tool per command plus settings, and only the tools your key's permissions allow.
Server URL
https://api.hammertime.cyou/mcpAdd it to Claude Code with:
claude mcp add --transport http hammertime https://api.hammertime.cyou/mcp \
--header "Authorization: Bearer 42|htk_qqXmIwpKxbAe3zYntwsLqK83wcKzbjD34M0yjsV9a698cb93"Other clients take a similar configuration, with the URL and an Authorization header:
{
"mcpServers": {
"hammertime": {
"type": "http",
"url": "https://api.hammertime.cyou/mcp",
"headers": {
"Authorization": "Bearer 42|htk_qqXmIwpKxbAe3zYntwsLqK83wcKzbjD34M0yjsV9a698cb93"
}
}
}
}