{
  "manifest_version": "1.0.0",
  "template": {
    "id": "1785a1bf-a83f-43bd-88fd-c44b714f6305",
    "slug": "B2f7Hq",
    "name": "FreeAPI.app",
    "description": "Your own API Hub to learn & master API interaction",
    "url": "https://railway.com/deploy/B2f7Hq",
    "upstream": {
      "repo_url": "https://github.com/hiteshchoudhary/apihub"
    }
  },
  "services": [
    {
      "name": "freeapi-app",
      "source": {
        "repo": "https://github.com/hiteshchoudhary/apihub"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "freeapi-app",
      "description": "Application port to run the process",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "NODE_ENV",
      "service": "freeapi-app",
      "description": "Default to development, changing this will avoid stack traces in the error response",
      "secret": false,
      "strategy": "default",
      "default": "development"
    },
    {
      "key": "CORS_ORIGIN",
      "service": "freeapi-app",
      "description": "To add the frontend URL",
      "secret": false,
      "strategy": "default",
      "default": "http://localhost:3000"
    },
    {
      "key": "MONGODB_URI",
      "service": "freeapi-app",
      "description": "Provide url of mongodb database",
      "secret": false,
      "strategy": "default",
      "default": "mongodb+srv://<username>:<password>@<domain>.mongodb.net/?retryWrites=true&w=majority"
    },
    {
      "key": "PAYPAL_SECRET",
      "service": "freeapi-app",
      "description": "To grab from paypal dashboard",
      "secret": true,
      "strategy": "default",
      "default": "__paypal_secret__"
    },
    {
      "key": "RAZORPAY_KEY_ID",
      "service": "freeapi-app",
      "description": "To grab from Razorpay dashboard",
      "secret": true,
      "strategy": "default",
      "default": "__razorpay_key_id__"
    },
    {
      "key": "FREEAPI_HOST_URL",
      "service": "freeapi-app",
      "description": "Provide hosted URL of the docs",
      "secret": false,
      "strategy": "default",
      "default": "http://localhost:8080"
    },
    {
      "key": "GITHUB_CLIENT_ID",
      "service": "freeapi-app",
      "description": "To grab from Github oauth settings",
      "secret": false,
      "strategy": "default",
      "default": "__github_client_id__"
    },
    {
      "key": "GOOGLE_CLIENT_ID",
      "service": "freeapi-app",
      "description": "To grab from google cloud console",
      "secret": false,
      "strategy": "default",
      "default": "__google_client_id__"
    },
    {
      "key": "PAYPAL_CLIENT_ID",
      "service": "freeapi-app",
      "description": "To grab from paypal dashboard",
      "secret": false,
      "strategy": "default",
      "default": "__paypal_client_id__"
    },
    {
      "key": "MAILTRAP_SMTP_HOST",
      "service": "freeapi-app",
      "description": "To grab from mailtrap admin dashboard",
      "secret": false,
      "strategy": "default",
      "default": "__mailtrap_smtp_host__"
    },
    {
      "key": "MAILTRAP_SMTP_PASS",
      "service": "freeapi-app",
      "description": "To grab from mailtrap admin dashboard",
      "secret": false,
      "strategy": "default",
      "default": "__mailtrap_smtp_user_password__"
    },
    {
      "key": "MAILTRAP_SMTP_PORT",
      "service": "freeapi-app",
      "description": "To grab from mailtrap admin dashboard",
      "secret": false,
      "strategy": "default",
      "default": "__mailtrap_smtp_port__"
    },
    {
      "key": "MAILTRAP_SMTP_USER",
      "service": "freeapi-app",
      "description": "To grab from mailtrap admin dashboard",
      "secret": false,
      "strategy": "default",
      "default": "__mailtrap_smtp_user_id__"
    },
    {
      "key": "ACCESS_TOKEN_EXPIRY",
      "service": "freeapi-app",
      "description": "1 day. Formats: https://github.com/vercel/ms#examples",
      "secret": true,
      "strategy": "default",
      "default": "1d"
    },
    {
      "key": "ACCESS_TOKEN_SECRET",
      "service": "freeapi-app",
      "description": "Advised to change the default value to your own secret value",
      "secret": true,
      "strategy": "default",
      "default": "LD9cv1kBfgRHVIg9GG_OGzh9TUkcyqgZAaM0o3DmVkx08MCFRSzMocyO3UtNdDNtoCJ0X0-5nLwK7fdO"
    },
    {
      "key": "GITHUB_CALLBACK_URL",
      "service": "freeapi-app",
      "description": "Add this exact url in your Authorization callback url in github OAuth app",
      "secret": false,
      "strategy": "default",
      "default": "http://localhost:8080/api/v1/users/github/callback"
    },
    {
      "key": "GOOGLE_CALLBACK_URL",
      "service": "freeapi-app",
      "description": "Add this exact url in your Authorized redirect URIs in Google cloude console OAuth Client id form",
      "secret": false,
      "strategy": "default",
      "default": "http://localhost:8080/api/v1/users/google/callback"
    },
    {
      "key": "RAZORPAY_KEY_SECRET",
      "service": "freeapi-app",
      "description": "To grab from Razorpay admin dashboard",
      "secret": true,
      "strategy": "default",
      "default": "__razorpay_key_secret__"
    },
    {
      "key": "GITHUB_CLIENT_SECRET",
      "service": "freeapi-app",
      "description": "To grab from Github oauth settings",
      "secret": true,
      "strategy": "default",
      "default": "__github_client_secret__"
    },
    {
      "key": "GOOGLE_CLIENT_SECRET",
      "service": "freeapi-app",
      "description": "To grab from google cloud console",
      "secret": true,
      "strategy": "default",
      "default": "__google_client_secret__"
    },
    {
      "key": "REFRESH_TOKEN_EXPIRY",
      "service": "freeapi-app",
      "description": "10 days. Formats: https://github.com/vercel/ms#examples",
      "secret": true,
      "strategy": "default",
      "default": "10d"
    },
    {
      "key": "REFRESH_TOKEN_SECRET",
      "service": "freeapi-app",
      "description": "Advised to change the default value to your own secret value",
      "secret": true,
      "strategy": "default",
      "default": "CMdDNtowK7fX0-5D9cv0oJ008MCFRSLHVTUkcyqgZAaIg9GG_OGzh9zMocyO3UtN1kBfLRn3DmVkxdO"
    },
    {
      "key": "EXPRESS_SESSION_SECRET",
      "service": "freeapi-app",
      "description": "Advised to change the default value to your own secret value",
      "secret": true,
      "strategy": "default",
      "default": "7fdOMCFRSLD9cv1k-5n3Dz5n3DmVmVHVIg9GG_OGTUkBfLNdgZAwKDNtoCJ0X0cyqaM0ogR80-zh9kx0Mkx"
    },
    {
      "key": "CLIENT_SSO_REDIRECT_URL",
      "service": "freeapi-app",
      "description": "Frontend url where backend should redirect when user is successfully logged in through the Google/Github SSO",
      "secret": false,
      "strategy": "default",
      "default": "http://localhost:3000/user/profile"
    },
    {
      "key": "MONGO_MEMORY_SERVER_PORT",
      "service": "freeapi-app",
      "description": "MongoDB port for e2e testing",
      "secret": false,
      "strategy": "default",
      "default": "10000"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "B2f7Hq"
      }
    },
    "cli": "railway deploy --template B2f7Hq",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "1785a1bf-a83f-43bd-88fd-c44b714f6305",
            "serializedConfig": {
              "services": {
                "7406765f-2952-4fd5-b18a-f47c12545f78": {
                  "name": "freeapi-app",
                  "build": {},
                  "deploy": {
                    "startCommand": ""
                  },
                  "source": {
                    "repo": "https://github.com/hiteshchoudhary/apihub"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Application port to run the process",
                      "defaultValue": "8080"
                    },
                    "NODE_ENV": {
                      "isOptional": false,
                      "description": "Default to development, changing this will avoid stack traces in the error response",
                      "defaultValue": "development"
                    },
                    "CORS_ORIGIN": {
                      "isOptional": false,
                      "description": "To add the frontend URL",
                      "defaultValue": "http://localhost:3000"
                    },
                    "MONGODB_URI": {
                      "isOptional": false,
                      "description": "Provide url of mongodb database",
                      "defaultValue": "mongodb+srv://<username>:<password>@<domain>.mongodb.net/?retryWrites=true&w=majority"
                    },
                    "PAYPAL_SECRET": {
                      "isOptional": true,
                      "description": "To grab from paypal dashboard",
                      "defaultValue": "__paypal_secret__"
                    },
                    "RAZORPAY_KEY_ID": {
                      "isOptional": true,
                      "description": "To grab from Razorpay dashboard",
                      "defaultValue": "__razorpay_key_id__"
                    },
                    "FREEAPI_HOST_URL": {
                      "isOptional": false,
                      "description": "Provide hosted URL of the docs",
                      "defaultValue": "http://localhost:8080"
                    },
                    "GITHUB_CLIENT_ID": {
                      "isOptional": true,
                      "description": "To grab from Github oauth settings",
                      "defaultValue": "__github_client_id__"
                    },
                    "GOOGLE_CLIENT_ID": {
                      "isOptional": true,
                      "description": "To grab from google cloud console",
                      "defaultValue": "__google_client_id__"
                    },
                    "PAYPAL_CLIENT_ID": {
                      "isOptional": true,
                      "description": "To grab from paypal dashboard",
                      "defaultValue": "__paypal_client_id__"
                    },
                    "MAILTRAP_SMTP_HOST": {
                      "isOptional": true,
                      "description": "To grab from mailtrap admin dashboard",
                      "defaultValue": "__mailtrap_smtp_host__"
                    },
                    "MAILTRAP_SMTP_PASS": {
                      "isOptional": true,
                      "description": "To grab from mailtrap admin dashboard",
                      "defaultValue": "__mailtrap_smtp_user_password__"
                    },
                    "MAILTRAP_SMTP_PORT": {
                      "isOptional": true,
                      "description": "To grab from mailtrap admin dashboard",
                      "defaultValue": "__mailtrap_smtp_port__"
                    },
                    "MAILTRAP_SMTP_USER": {
                      "isOptional": true,
                      "description": "To grab from mailtrap admin dashboard",
                      "defaultValue": "__mailtrap_smtp_user_id__"
                    },
                    "ACCESS_TOKEN_EXPIRY": {
                      "isOptional": false,
                      "description": "1 day. Formats: https://github.com/vercel/ms#examples",
                      "defaultValue": "1d"
                    },
                    "ACCESS_TOKEN_SECRET": {
                      "isOptional": false,
                      "description": "Advised to change the default value to your own secret value",
                      "defaultValue": "LD9cv1kBfgRHVIg9GG_OGzh9TUkcyqgZAaM0o3DmVkx08MCFRSzMocyO3UtNdDNtoCJ0X0-5nLwK7fdO"
                    },
                    "GITHUB_CALLBACK_URL": {
                      "isOptional": true,
                      "description": "Add this exact url in your Authorization callback url in github OAuth app",
                      "defaultValue": "http://localhost:8080/api/v1/users/github/callback"
                    },
                    "GOOGLE_CALLBACK_URL": {
                      "isOptional": true,
                      "description": "Add this exact url in your Authorized redirect URIs in Google cloude console OAuth Client id form",
                      "defaultValue": "http://localhost:8080/api/v1/users/google/callback"
                    },
                    "RAZORPAY_KEY_SECRET": {
                      "isOptional": true,
                      "description": "To grab from Razorpay admin dashboard",
                      "defaultValue": "__razorpay_key_secret__"
                    },
                    "GITHUB_CLIENT_SECRET": {
                      "isOptional": true,
                      "description": "To grab from Github oauth settings",
                      "defaultValue": "__github_client_secret__"
                    },
                    "GOOGLE_CLIENT_SECRET": {
                      "isOptional": true,
                      "description": "To grab from google cloud console",
                      "defaultValue": "__google_client_secret__"
                    },
                    "REFRESH_TOKEN_EXPIRY": {
                      "isOptional": false,
                      "description": "10 days. Formats: https://github.com/vercel/ms#examples",
                      "defaultValue": "10d"
                    },
                    "REFRESH_TOKEN_SECRET": {
                      "isOptional": false,
                      "description": "Advised to change the default value to your own secret value",
                      "defaultValue": "CMdDNtowK7fX0-5D9cv0oJ008MCFRSLHVTUkcyqgZAaIg9GG_OGzh9zMocyO3UtN1kBfLRn3DmVkxdO"
                    },
                    "EXPRESS_SESSION_SECRET": {
                      "isOptional": false,
                      "description": "Advised to change the default value to your own secret value",
                      "defaultValue": "7fdOMCFRSLD9cv1k-5n3Dz5n3DmVmVHVIg9GG_OGTUkBfLNdgZAwKDNtoCJ0X0cyqaM0ogR80-zh9kx0Mkx"
                    },
                    "CLIENT_SSO_REDIRECT_URL": {
                      "isOptional": true,
                      "description": "Frontend url where backend should redirect when user is successfully logged in through the Google/Github SSO",
                      "defaultValue": "http://localhost:3000/user/profile"
                    },
                    "MONGO_MEMORY_SERVER_PORT": {
                      "isOptional": false,
                      "description": "MongoDB port for e2e testing",
                      "defaultValue": "10000"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {}
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": false
  },
  "generated_at": "2026-09-21T22:14:44.200Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-21T17:34:29.018Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_bbbbdd91587446f7984b",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 146,
    "typical_build_seconds": 46,
    "typical_start_seconds": 10,
    "slowest_service": "freeapi-app"
  }
}
