{
  "info": {
    "name": "Shortnd Public API",
    "_postman_id": "8b4db6e8-bd13-4c33-891a-8d7fe976f4ae",
    "description": "Dedicated collection for the supported /api/v1 external contract.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Auth",
      "item": [
        {
          "name": "POST /api/v1/auth/token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "ApiKey {{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/auth/token",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "auth",
                "token"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "API Keys",
      "item": [
        {
          "name": "GET /api/v1/api-keys",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/v1/api-keys?organizationId={{organizationId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "api-keys"
              ],
              "query": [
                {
                  "key": "organizationId",
                  "value": "{{organizationId}}"
                }
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/api-keys",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organizationId\": \"{{organizationId}}\",\n  \"name\": \"Partner production key\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/api-keys",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "api-keys"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/api-keys/{{id}}/rotate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organizationId\": \"{{organizationId}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/api-keys/{{id}}/rotate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "api-keys",
                "{{id}}",
                "rotate"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/api-keys/{{id}}/revoke",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organizationId\": \"{{organizationId}}\",\n  \"reason\": \"rotated\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/api-keys/{{id}}/revoke",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "api-keys",
                "{{id}}",
                "revoke"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Domains",
      "item": [
        {
          "name": "GET /api/v1/domains",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/domains",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "domains"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/domains",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"domain\": \"acme.com\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/domains",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "domains"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/domains/{{id}}/verify",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/domains/{{id}}/verify",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "domains",
                "{{id}}",
                "verify"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "URLs",
      "item": [
        {
          "name": "GET /api/v1/urls",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/urls",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"targetUrl\": \"https://example.io/onboarding\",\n  \"customSlug\": \"welcome\",\n  \"domainId\": \"{{domainId}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls"
              ]
            }
          }
        },
        {
          "name": "Bulk-create up to 100 URLs",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/bulk",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "bulk"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"urls\": [\n    {\n      \"targetUrl\": \"https://example.com/a\"\n    },\n    {\n      \"targetUrl\": \"https://example.com/b\",\n      \"customSlug\": \"promo-2026\"\n    },\n    {\n      \"targetUrl\": \"https://example.com/c\",\n      \"title\": \"Summer launch\",\n      \"tags\": [\n        \"launch\",\n        \"2026\"\n      ]\n    }\n  ]\n}"
            }
          }
        },
        {
          "name": "Bulk-update URLs",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/bulk",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "bulk"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"updates\": [\n    {\n      \"id\": 1,\n      \"title\": \"New title\",\n      \"isActive\": true\n    },\n    {\n      \"id\": 2,\n      \"tags\": [\n        \"promo\",\n        \"summer-2026\"\n      ]\n    }\n  ]\n}"
            }
          }
        },
        {
          "name": "Bulk-soft-delete URLs (ids in query)",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/bulk?ids=1,2,3",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "bulk"
              ],
              "query": [
                {
                  "key": "ids",
                  "value": "1,2,3"
                }
              ]
            }
          }
        },
        {
          "name": "GET /api/v1/urls/{{id}}",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/{{id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "PATCH /api/v1/urls/{{id}}",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Updated title\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/{{id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "DELETE /api/v1/urls/{{id}}",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/{{id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "{{id}}"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "QR Codes",
      "item": [
        {
          "name": "List QR codes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr?limit=25&offset=0",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25"
                },
                {
                  "key": "offset",
                  "value": "0"
                }
              ]
            }
          }
        },
        {
          "name": "Create QR for an org-owned URL",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"urlId\": 1,\n  \"size\": 512,\n  \"format\": \"png\",\n  \"foregroundColor\": \"#000000\",\n  \"backgroundColor\": \"#FFFFFF\",\n  \"errorCorrectionLevel\": \"M\"\n}"
            }
          }
        },
        {
          "name": "Read QR by id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr/{{qrId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr",
                "{{qrId}}"
              ]
            }
          }
        },
        {
          "name": "Update QR branding",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr/{{qrId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr",
                "{{qrId}}"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"size\": 1024,\n  \"foregroundColor\": \"#1F2937\"\n}"
            }
          }
        },
        {
          "name": "Soft-delete QR",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr/{{qrId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr",
                "{{qrId}}"
              ]
            }
          }
        },
        {
          "name": "List QRs for a URL",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/{{id}}/qr",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "{{id}}",
                "qr"
              ]
            }
          }
        },
        {
          "name": "Create standalone QR (no urlId)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"data\": \"BEGIN:VCARD\\nVERSION:3.0\\nFN:Tosh\\nTEL:+1-555-0123\\nEND:VCARD\",\n  \"size\": 512,\n  \"format\": \"png\"\n}"
            }
          }
        },
        {
          "name": "Per-QR scan analytics",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/qr/{{qrId}}/scans?since=2026-04-08T00:00:00Z&groupBy=day&limit=10",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "qr",
                "{{qrId}}",
                "scans"
              ],
              "query": [
                {
                  "key": "since",
                  "value": "2026-04-08T00:00:00Z"
                },
                {
                  "key": "groupBy",
                  "value": "day"
                },
                {
                  "key": "limit",
                  "value": "10"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Analytics And Usage",
      "item": [
        {
          "name": "GET /api/v1/analytics/overview",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/analytics/overview",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "analytics",
                "overview"
              ]
            }
          }
        },
        {
          "name": "GET /api/v1/usage",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "usage"
              ]
            }
          }
        },
        {
          "name": "GET /api/v1/billing/usage",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/billing/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "billing",
                "usage"
              ]
            }
          }
        },
        {
          "name": "Per-URL click breakdowns",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/urls/{{id}}/clicks?since=2026-04-08T00:00:00Z&groupBy=day&limit=10",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "urls",
                "{{id}}",
                "clicks"
              ],
              "query": [
                {
                  "key": "since",
                  "value": "2026-04-08T00:00:00Z"
                },
                {
                  "key": "groupBy",
                  "value": "day"
                },
                {
                  "key": "limit",
                  "value": "10"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "GET /api/v1/webhooks",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks"
              ]
            }
          }
        },
        {
          "name": "POST /api/v1/webhooks",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/webhooks/shortnd\",\n  \"events\": [\"url.created\", \"url.updated\"]\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks"
              ]
            }
          }
        },
        {
          "name": "GET /api/v1/webhooks/{{id}}",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/{{id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "PATCH /api/v1/webhooks/{{id}}",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"isActive\": false\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/{{id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "DELETE /api/v1/webhooks/{{id}}",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/{{id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "GET /api/v1/webhooks/{{id}}/deliveries",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{accessToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/{{id}}/deliveries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "{{id}}",
                "deliveries"
              ]
            }
          }
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://shortnd.com"
    },
    {
      "key": "apiKey",
      "value": ""
    },
    {
      "key": "accessToken",
      "value": ""
    },
    {
      "key": "organizationId",
      "value": ""
    },
    {
      "key": "domainId",
      "value": ""
    },
    {
      "key": "id",
      "value": ""
    }
  ]
}