API Documentation
Integrate BlockMedic into your tools, server panels or bots with a simple JSON-over-HTTP API.
https://blockmedic.ampznetwork.comQuick start
Upload a log with one request. The response contains a shareable link and a token for deleting it later.
curl -X POST https://blockmedic.ampznetwork.com/api/1/log \
-H "Content-Type: application/json" \
-H "Origin: https://blockmedic.ampznetwork.com" \
-d '{ "content": "<your log text>" }'Authentication
Requests must identify where they come from. This is a basic abuse filter, not a secret: it is not a substitute for protecting your own tokens. Send either:
- an
OriginorRefererheader (browsers add one automatically; set it yourself from servers and scripts), or - an API key as
Authorization: Bearer <key>if you have been issued one.
Deleting a log needs its deletion token. Account endpoints need your session cookie or a Bearer session token.
Errors & limits
Failures return a JSON body like { "success": false, "error": "…" } with one of these status codes. Uploads are rate limited per IP; respect Retry-After when you see a 429 or 503.
| Status | Meaning | When |
|---|---|---|
| 400 | Bad request | Missing or invalid fields, e.g. no content, bad gzip, or more than 256 bulk entries. |
| 401 | Unauthorised | No Origin or Referer header and no valid API key. |
| 403 | Forbidden | IP or account is banned, a VPN/proxy was detected, the token is wrong, or the content was held for review. |
| 404 | Not found | The log does not exist or has expired. |
| 429 | Rate limited | Too many uploads. Wait for Retry-After seconds before trying again. |
| 503 | Busy | Under heavy load or in maintenance. Retry after the Retry-After delay. |
Create a log
/api/1/logUploads a log, anonymises it (IPs, emails) and returns links plus a deletion token. Uploading identical content again returns the existing log instead of a new one.
Request body
| Field | Type | Description |
|---|---|---|
content | String | Full text of the log file. Required |
source | String | Identifier for your app or tool. Defaults to web, discord or api based on the request. |
metadata | Array | Extra info as [{"key","value","label","visible"}] objects. |
encoding | String | Set to "gzip" if content is gzip-compressed and base64-encoded. |
Example response
{
"success": true,
"id": "WnMMikq",
"url": "https://blockmedic.ampznetwork.com/log/WnMMikq",
"raw": "https://blockmedic.ampznetwork.com/api/1/raw/WnMMikq",
"token": "78351fafe495398...",
"size": 157369,
"lines": 1201,
"errors": 8,
"created": 1767225600
}- Keep the token: it is the only way to delete the log later and is shown once.
- Duplicate content returns { "success": true, "duplicate": true, "id": "…", "url": "…" } without a token.
- Responses include X-RateLimit-Remaining and, on 429 or 503, a Retry-After header.
Get log info
/api/1/log/:idReturns details about a log. Add query parameters to include its content.
Query parameters
| Field | Type | Description |
|---|---|---|
content | Boolean | Include every content type below. |
raw | Boolean | Include the cleaned log text. |
parsed | Boolean | Include parsed lines with their levels. |
insights | Boolean | Include detected problems with solutions. |
Example response
{
"success": true,
"id": "WnMMikq",
"source": "web",
"created": 1767225600,
"expires": 1769817600,
"size": 157369,
"url": "https://blockmedic.ampznetwork.com/log/WnMMikq",
"raw": "https://blockmedic.ampznetwork.com/api/1/raw/WnMMikq",
"metadata": [ ... ],
"content": {
"raw": "...",
"parsed": [ ... ],
"insights": [ ... ]
},
"lines": 1201,
"errors": 8
}content, lines and errors only appear when at least one query parameter is true.
Delete a log
/api/1/log/:idPermanently deletes one log. Authenticate with the token you received when creating it.
Authentication
| Field | Type | Description |
|---|---|---|
Authorization | Header | Bearer <token>. Alternatively send the token in the body. |
token | String | Body field, used when no Authorization header is sent. |
Example response
{
"success": true
}Check a log exists
/api/1/log/:id/existsA cheap check for whether a log is still available. Expired logs report false.
Example response
{
"exists": true
}Get insights
/api/1/insights/:idA compact diagnostic summary: the detected software, game version and every problem found. No query parameters.
Example response
{
"success": true,
"software": "NeoForge 21.1.65",
"version": "1.21.1",
"insights": [
{
"type": "error",
"message": "The JVM ran out of heap memory (OutOfMemoryError).",
"level": 0
}
]
}type is "error" or "warn".
Raw log text
/api/1/raw/:idReturns the anonymised log as plain text (text/plain). Handy for piping into other tools or printing in a terminal.
Bulk delete
/api/1/bulk/log/deleteDeletes up to 256 logs in one request. Each entry needs the log id and its deletion token.
Request body
{
"logs": [
{ "id": "WnMMikq", "token": "..." },
{ "id": "XyZ123", "token": "..." }
]
}Example response
{
"success": true,
"deleted": 2,
"failed": 0
}Public statistics
/api/1/statsThe numbers behind the status page: totals, recent uploads, daily and hourly activity, and 30-day breakdowns. Results are cached for about 10 seconds.
Example response
{
"success": true,
"data": {
"total": 1204,
"recent_24h": 38,
"recent_7d": 211,
"recent_30d": 802,
"minecraft_count": 790,
"hytale_count": 12,
"top_versions": [ { "name": "1.21.1", "count": 140 } ],
"breakdown": {
"versions": [ { "name": "1.21.1", "count": 140 } ],
"loaders": [ { "name": "NeoForge", "count": 96 } ],
"java": [ { "name": "Java 21", "count": 380 } ],
"os": [ { "name": "Windows 11", "count": 301 } ],
"sources": [ { "name": "Website", "count": 410 } ]
},
"daily": [ { "date": "2026-10-27", "count": 41 } ],
"hourly": [ { "hour": "2026-10-27T14:00Z", "count": 3 } ]
}
}Breakdown rows may include "kind": "other" or "unknown" for grouped entries.
Service health
/api/1/healthA live probe that times a database round-trip and reports whether uploads are being accepted. Never cached, so it is safe to poll for monitoring.
Example response
{
"success": true,
"data": {
"status": "operational",
"database": { "ok": true, "latency_ms": 114 },
"uploads": { "accepting": true, "retry_after": 0 },
"checked_at": 1767225600
}
}status is one of "operational", "slow", "degraded" or "down".
Link Discord account
/api/1/account/discordLinks a Discord account to your BlockMedic account. You can only modify your own account. Authenticate with your session cookie or a Bearer session token.
Request body
{
"discord_id": "123456789012345678",
"discord_username": "username#0000"
}Example response
{
"success": true,
"discord_id": "123456789012345678",
"discord_username": "username#0000"
}Unlink Discord account
/api/1/account/discordRemoves the Discord link from your account. Same authentication as linking; no request body.

