{
  "info": {
    "name": "Alva Digital Downloads API v1",
    "description": "Collection for the Alva Digital Downloads /api/v1 external REST API. Covers all 37 shipped endpoints. Bearer auth (adk_live_<keyId>_<secret>) is inherited collection-wide; GET /health overrides to noauth. Every non-GET request carries an Idempotency-Key header (idempotency is required on writes via withApiV1Write).",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    { "key": "base_url", "value": "https://app.example.com/api/v1" },
    { "key": "api_token", "value": "adk_live_<keyId>_<secret>" },
    { "key": "key_id", "value": "1" },
    { "key": "asset_id", "value": "123" },
    { "key": "upload_id", "value": "up_..." },
    { "key": "category_id", "value": "1" },
    { "key": "pack_id", "value": "1" },
    { "key": "job_id", "value": "ingest_..." },
    { "key": "mapping_id", "value": "1" },
    { "key": "order_id", "value": "5501234567890" },
    { "key": "purchase_id", "value": "1" }
  ],
  "item": [
    {
      "name": "Health",
      "item": [
        {
          "name": "Health check (public)",
          "request": { "method": "GET", "url": "{{base_url}}/health", "auth": { "type": "noauth" } }
        },
        {
          "name": "Ping (authenticated)",
          "request": { "method": "GET", "url": "{{base_url}}/ping" }
        }
      ]
    },
    {
      "name": "API keys",
      "item": [
        {
          "name": "List keys",
          "request": { "method": "GET", "url": "{{base_url}}/auth/keys" }
        },
        {
          "name": "Create key",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "key-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/auth/keys",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"label\": \"PMT integration\",\n  \"scopes\": []\n}"
            }
          }
        },
        {
          "name": "Revoke key",
          "request": {
            "method": "DELETE",
            "header": [{ "key": "Idempotency-Key", "value": "key-revoke-{{$guid}}" }],
            "url": "{{base_url}}/auth/keys/{{key_id}}"
          }
        }
      ]
    },
    {
      "name": "Assets",
      "item": [
        {
          "name": "List assets",
          "request": { "method": "GET", "url": "{{base_url}}/assets?page=1&pageSize=50" }
        },
        {
          "name": "Remote URL ingest",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "asset-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/assets",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"source_url\": \"https://storage.example.com/products/video.mp4\",\n  \"filename\": \"video.mp4\",\n  \"content_type\": \"video/mp4\",\n  \"title\": \"Video lesson\"\n}"
            }
          }
        },
        {
          "name": "Get asset",
          "request": { "method": "GET", "url": "{{base_url}}/assets/{{asset_id}}" }
        },
        {
          "name": "Update asset",
          "request": {
            "method": "PATCH",
            "header": [
              { "key": "Idempotency-Key", "value": "asset-patch-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/assets/{{asset_id}}",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Renamed asset\",\n  \"category_id\": null\n}"
            }
          }
        },
        {
          "name": "Delete asset",
          "request": {
            "method": "DELETE",
            "header": [{ "key": "Idempotency-Key", "value": "asset-delete-{{$guid}}" }],
            "url": "{{base_url}}/assets/{{asset_id}}"
          }
        },
        {
          "name": "Begin direct upload",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "upload-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/assets/uploads",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"filename\": \"manual.pdf\",\n  \"file_size\": 1048576,\n  \"content_type\": \"application/pdf\",\n  \"title\": \"Product manual\"\n}"
            }
          }
        },
        {
          "name": "Complete direct upload",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "upload-complete-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/assets/uploads/{{upload_id}}/complete",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"file_id\": {{asset_id}},\n  \"file_key\": \"<shopId>/<fileId>/manual.pdf\",\n  \"filename\": \"manual.pdf\",\n  \"size\": 1048576,\n  \"content_type\": \"application/pdf\",\n  \"mode\": \"presigned\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Categories",
      "item": [
        {
          "name": "List categories",
          "request": { "method": "GET", "url": "{{base_url}}/categories" }
        },
        {
          "name": "Create category",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "category-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/categories",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Course assets\"\n}"
            }
          }
        },
        {
          "name": "Get category",
          "request": { "method": "GET", "url": "{{base_url}}/categories/{{category_id}}" }
        },
        {
          "name": "Rename category",
          "request": {
            "method": "PATCH",
            "header": [
              { "key": "Idempotency-Key", "value": "category-patch-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/categories/{{category_id}}",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Renamed category\"\n}"
            }
          }
        },
        {
          "name": "Delete category",
          "request": {
            "method": "DELETE",
            "header": [{ "key": "Idempotency-Key", "value": "category-delete-{{$guid}}" }],
            "url": "{{base_url}}/categories/{{category_id}}"
          }
        }
      ]
    },
    {
      "name": "Packs",
      "item": [
        {
          "name": "List packs",
          "request": { "method": "GET", "url": "{{base_url}}/packs?page=1&pageSize=50" }
        },
        {
          "name": "Create pack",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "pack-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/packs",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Starter bundle\",\n  \"description\": \"All starter files\",\n  \"file_ids\": [{{asset_id}}]\n}"
            }
          }
        },
        {
          "name": "Get pack",
          "request": { "method": "GET", "url": "{{base_url}}/packs/{{pack_id}}" }
        },
        {
          "name": "Delete pack",
          "request": {
            "method": "DELETE",
            "header": [{ "key": "Idempotency-Key", "value": "pack-delete-{{$guid}}" }],
            "url": "{{base_url}}/packs/{{pack_id}}"
          }
        }
      ]
    },
    {
      "name": "License key tags",
      "item": [
        {
          "name": "List license key tags",
          "request": { "method": "GET", "url": "{{base_url}}/license-key-tags" }
        },
        {
          "name": "Create license key tag",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "tag-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/license-key-tags",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Pro license\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Mappings",
      "item": [
        {
          "name": "List mappings",
          "request": { "method": "GET", "url": "{{base_url}}/mappings?page=1&pageSize=50" }
        },
        {
          "name": "Create mapping",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "mapping-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/mappings",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"shopify_product_id\": \"gid://shopify/Product/1234567890\",\n  \"shopify_variant_ids\": [],\n  \"file_ids\": [{{asset_id}}],\n  \"pack_ids\": [],\n  \"link_ids\": [],\n  \"license_key_tag_ids\": [],\n  \"download_type\": \"ZIP\",\n  \"is_active\": true\n}"
            }
          }
        },
        {
          "name": "Get mapping",
          "request": { "method": "GET", "url": "{{base_url}}/mappings/{{mapping_id}}" }
        },
        {
          "name": "Replace mapping",
          "request": {
            "method": "PUT",
            "header": [
              { "key": "Idempotency-Key", "value": "mapping-put-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/mappings/{{mapping_id}}",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"shopify_variant_ids\": [],\n  \"file_ids\": [{{asset_id}}],\n  \"pack_ids\": [],\n  \"link_ids\": [],\n  \"license_key_tag_ids\": [],\n  \"download_type\": \"ZIP\",\n  \"is_active\": true\n}"
            }
          }
        },
        {
          "name": "Delete mapping",
          "request": {
            "method": "DELETE",
            "header": [{ "key": "Idempotency-Key", "value": "mapping-delete-{{$guid}}" }],
            "url": "{{base_url}}/mappings/{{mapping_id}}"
          }
        }
      ]
    },
    {
      "name": "Orders",
      "item": [
        {
          "name": "Get order status",
          "request": { "method": "GET", "url": "{{base_url}}/orders/{{order_id}}" }
        },
        {
          "name": "List order assignments",
          "request": { "method": "GET", "url": "{{base_url}}/orders/{{order_id}}/assignments" }
        },
        {
          "name": "Create assignment",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "assign-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/assignments",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"shopify_customer_id\": \"777888999\",\n  \"items\": [\n    { \"shopify_product_id\": \"gid://shopify/Product/1234567890\" }\n  ],\n  \"send_email\": false,\n  \"fraud_check\": false\n}"
            }
          }
        },
        {
          "name": "Download URLs for assignment",
          "request": { "method": "GET", "url": "{{base_url}}/orders/{{order_id}}/assignments/{{purchase_id}}/download-urls" }
        },
        {
          "name": "Revoke order access",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "revoke-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/revoke",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"shopify_product_id\": \"gid://shopify/Product/1234567890\"\n}"
            }
          }
        },
        {
          "name": "Restore order access",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "restore-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/restore",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"shopify_product_id\": \"gid://shopify/Product/1234567890\"\n}"
            }
          }
        },
        {
          "name": "Grant extra downloads",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "grant-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/grant-downloads",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"extra_downloads\": 5,\n  \"shopify_product_id\": \"gid://shopify/Product/1234567890\"\n}"
            }
          }
        },
        {
          "name": "Resend order email",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Idempotency-Key", "value": "resend-{{$guid}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/resend",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"shopify_product_id\": \"gid://shopify/Product/1234567890\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Status",
      "item": [
        {
          "name": "Get ingest job",
          "request": { "method": "GET", "url": "{{base_url}}/jobs/{{job_id}}" }
        }
      ]
    }
  ]
}
