{"id":21851901,"url":"https://github.com/ulbora/ulboraapigateway","last_synced_at":"2025-07-10T17:33:04.183Z","repository":{"id":87394614,"uuid":"72300411","full_name":"Ulbora/UlboraAPIGateway","owner":"Ulbora","description":"A Microservice API gateway with self service portal, blue/green deployments, circuit breaker, fall-over Self Healing, Health Check","archived":false,"fork":false,"pushed_at":"2018-06-24T00:02:10.000Z","size":19497,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-21T18:32:54.940Z","etag":null,"topics":["analytics","api-gateway","circuit-breaker","gateway","gateway-api","gateway-microservice","health-check","microservice","restful-api","self-healing"],"latest_commit_sha":null,"homepage":"http://www.ulboralabs.com/view/apigateway","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ulbora.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-29T17:50:06.000Z","updated_at":"2020-05-14T13:49:40.000Z","dependencies_parsed_at":"2023-05-07T11:31:09.527Z","dependency_job_id":null,"html_url":"https://github.com/Ulbora/UlboraAPIGateway","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Ulbora/UlboraAPIGateway","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ulbora%2FUlboraAPIGateway","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ulbora%2FUlboraAPIGateway/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ulbora%2FUlboraAPIGateway/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ulbora%2FUlboraAPIGateway/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ulbora","download_url":"https://codeload.github.com/Ulbora/UlboraAPIGateway/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ulbora%2FUlboraAPIGateway/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263182174,"owners_count":23426632,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","api-gateway","circuit-breaker","gateway","gateway-api","gateway-microservice","health-check","microservice","restful-api","self-healing"],"created_at":"2024-11-28T01:12:14.998Z","updated_at":"2025-07-02T17:06:16.834Z","avatar_url":"https://github.com/Ulbora.png","language":"Go","readme":"[![Go Report Card](https://goreportcard.com/badge/github.com/Ulbora/UlboraAPIGateway)](https://goreportcard.com/report/github.com/Ulbora/UlboraAPIGateway)\n[![](https://img.shields.io/docker/build/mariobehling/loklak.svg)](https://hub.docker.com/r/ulboralabs/ulboraapigateway/builds/)\n[![sqale_rating](https://sonarcloud.io/api/project_badges/measure?project=myapigateway\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=myapigateway)\n[![coverage](https://sonarcloud.io/api/project_badges/measure?project=myapigateway\u0026metric=coverage)](https://sonarcloud.io/dashboard?id=myapigateway)\n\n\n\n\n\nUlbora API Gateway\n==============\n\nGet a **free** account on the **Free Tier** at: http://www.myapigateway.com\n\nMulti-user lightweight API Gateway with a self service portal: http://www.myapigateway.com\n\nCopyright (C) 2016 Ulbora Labs LLC. (www.ulboralabs.com)\nAll rights reserved.\n\nCopyright (C) 2016 Ken Williamson\nAll rights reserved.\n\nCertain inventions and disclosures in this file may be claimed within\npatents owned or patent applications filed by Ulbora Labs LLC., or third\nparties.\n\n\nUser Admin Portal: https://github.com/Ulbora/ApiGatewayUserPortal.git\n\n# Features\n- Circuit Breaker\n- Health Check\n- Self Healing when breaker is open\n- Gateway Analytics\n- Blue/Green/Active Routes\n- Gateway Error Loggin\n- Admin Portal (written in Golang)\n\n\n# Using API Gateway Routes\n- The Ulbora API Gateway routes REST service calls to endpoints assigned through the user portal.\n- There can be multiple API endpoints mapped to any route; blue, green, or any name you choose.\n- CORS is passed through the gateway, so if CORS is enabled in your REST services, it works automatically in the gateway.\n- Authentication is also passed through the gateway. If you pass any type of token in a header, it will be passed through automatically.\n- Any other headers are also passed through the gateway automatically.\n- The gateway works with both JSON and XML bodies.\n\n\n## Headers For Gateway Route Calls\n- clientId: Your assigned client id\n- apiKey: Your assigned API Key\n- Any other headers required for your micro services\n\n## Allowed HTTP Methods\n- POST\n- PUT\n- PATCH\n- GET\n- DELETE\n- OPTIONS\n\n\n## Gateway Routes\n### Local Non-Prod\n- http://localhost:3011/np/routeID/routeName/yourRoute\n- (example): http://localhost:3011/np/challenge/blue/rs/challenge/en_us?g=g\u0026b=b\n- Note: \n- routeID is: challenge\n- routeName is: blue\n- yourRoute is: rs/challenge/en_us?g=g\u0026b=b which can be mappend in the user portal to something like https://www.youapi/rs/challenge/en_us?g=g\u0026b=b\n\n### Local Prod\n\n- http://localhost:3011/routeID/yourRoute\n- (example): http://localhost:3011/challenge/rs/challenge?name=sam\u0026age=44\n- Note: \n- routeID is: challenge\n- yourRoute is: /rs/challenge?name=sam\u0026age=44 which can be mappend in the user portal to something like https://www.youapi/rs/challenge?name=sam\u0026age=44\n\n### Active Production Route\nThe User Admin Portal allows you to make any route URL the active production route with the click of a switch.\nUsing Non-Prod routes allows you to test services before placing them in production.\n\n\n# Super Admin REST Services\n\n## Headers\n- Content-Type: application/json (for POST and PUT)\n- Authorization: Bearer aToken (POST, PUT, GET and DELETE.)\n- clientId: clientId (example 33477)\n\n\n## Add Client\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwClient/add\n\nExample Request\n{  \n   \"clientId\":4,\n   \"apiKey\":\"112233\",\n   \"enabled\":true,\n   \"level\":\"small\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update client\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwClient/update\n\nExample Request\n{  \n   \"clientId\":4,\n   \"apiKey\":\"55555\",\n   \"enabled\":true,\n   \"level\":\"small\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 11\n}\n\n```\n\n\n## Get Client\n\n```\nGET:\nURL: http://localhost:3011/rs/gwClient/get/4\n  \n```\n\n```\nExample Response   \n\n{  \n   \"clientId\":4,\n   \"apiKey\":\"55555\",\n   \"enabled\":true,\n   \"level\":\"small\"\n}\n\n```\n\n\n## Get Client List\n\n```\nGET:\nURL: http://localhost:3011/rs/gwClient/list\n  \n```\n\n```\nExample Response   \n\n[\n    {  \n        \"clientId\":4,\n        \"apiKey\":\"555525\",\n        \"enabled\":true,\n        \"level\":\"small\"\n    },\n    {\n        \"clientId\":5,\n        \"apiKey\":\"5553355\",\n        \"enabled\":true,\n        \"level\":\"small\"\n    },\n    {\n        \"clientId\":6,\n        \"apiKey\":\"5555445\",\n        \"enabled\":true,\n        \"level\":\"small\"\n    }\n]\n\n```\n\n\n## Delete Client\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwClient/delete/1\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 1\n}\n\n```\n\n\n\n## Add Route\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwRestRouteSuper/add\n\nExample Request\n{  \n   \"clientId\":4,\n   \"route\":\"mail\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update Route\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwRestRouteSuper/update\n\nExample Request\n{  \n   \"id\": 84,\n   \"clientId\":4,\n   \"route\":\"mailChimp\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 84\n}\n\n```\n\n\n## Get Route\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRestRouteSuper/get/84/4\n  \n```\n\n```\nExample Response   \n\n{  \n   \"id\": 84,\n   \"clientId\":4,\n   \"route\":\"mail\"\n}\n\n```\n\n\n## Get Route List\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRestRouteSuper/list/4\n  \n```\n\n```\nExample Response   \n\n[\n    {  \n        \"id\": 84,\n        \"clientId\":4,\n        \"route\":\"mail\"\n    },\n    {\n        \"id\": 85,\n        \"clientId\":4,\n        \"route\":\"content\"\n    },\n    {\n        \"id\": 86,\n        \"clientId\":4,\n        \"route\":\"products\"\n    }\n]\n\n```\n\n\n## Delete Route\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwRestRouteSuper/delete/85/4\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 85\n}\n\n```\n\n\n\n\n## Add Route URL\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwRouteUrlSuper/add\n\nExample Request\n{  \n   \"routeId\":87,\n   \"clientId\": 403,\n   \"name\": \"testMail\",\n   \"url\": \"google.com/test1\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update Route URL\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwRouteUrlSuper/update\n\nExample Request\n{  \n   \"id\": 188,\n   \"routeId\":87,\n   \"clientId\": 403,\n   \"name\": \"testMailGreen\",\n   \"url\": \"google.com/test1\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 188\n}\n\n```\n\n\n## Activate Route URL\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwRouteUrlSuper/activate\n\nExample Request\n{  \n   \"id\": 188,\n   \"routeId\":87,\n   \"clientId\": 403\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 188\n}\n\n```\n\n\n## Get Route URL\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRouteUrlSuper/get/188/87/403\n  \n```\n\n```\nExample Response   \n\n{  \n    \"id\": 188,\n    \"routeId\":87,\n    \"clientId\": 403,\n    \"name\": \"testMailGreen\",\n    \"url\": \"google.com/test1\"\n}\n\n```\n\n\n## Get Route URL List\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRouteUrlSuper/list/87/403\n  \n```\n\n```\nExample Response   \n\n[\n    {\n        \"id\": 188,\n        \"name\": \"testMailGreen\",\n        \"url\": \"google.com/test1\",\n        \"active\": true,\n        \"routeId\": 87,\n        \"clientId\": 403\n    },\n    {\n        \"id\": 189,\n        \"name\": \"testMail\",\n        \"url\": \"google.com/test1\",\n        \"active\": false,\n        \"routeId\": 87,\n        \"clientId\": 403\n    }\n]\n\n```\n\n\n## Delete Route URL\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwRouteUrlSuper/delete/190/87/403\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 190\n}\n\n```\n\n\n\n## Add Breaker\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwBreakerSuper/add\n\nExample Request\n{\n   \"failureThreshold\":3,\n   \"healthCheckTimeSeconds\":60,\n   \"failoverRouteName\":\"red\",\n   \"openFailCode\":501,\n   \"routeId\":22,\n   \"routeUriId\":33,\n   \"clientId\":403\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update Breaker\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwBreakerSuper/update\n\nExample Request\n{\n   \"id\": 620,\n   \"failureThreshold\":3,\n   \"healthCheckTimeSeconds\":120,\n   \"failoverRouteName\":\"red\",\n   \"openFailCode\":501,\n   \"routeId\":22,\n   \"routeUriId\":33,\n   \"clientId\":403\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 84\n}\n\n```\n\n\n## Get Breaker\n\n```\nGET:\nURL: http://localhost:3011/rs/gwBreakerSuper/get/33/22/403\n  \n```\n\n```\nExample Response   \n\n{  \n   \"id\": 84,\n   \"clientId\":4,\n   \"route\":\"mail\"\n}\n\n```\n\n\n## Delete Breaker\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwBreakerSuper/delete/33/22/403\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true\n    \n}\n\n```\n\n\n\n\n## Get Errors\n\n```\nGET:\nURL: http://localhost:3011/rs/gwErrorsSuper\n  \n```\n\n```\nExample Response   \n\n{\n   \"routeId\":22,\n   \"routeUriId\":33,\n   \"clientId\":403\n}\n\n```\n\n\n\n\n## Get Performance\n\n```\nGET:\nURL: http://localhost:3011/rs/gwPerformanceSuper\n  \n```\n\n```\nExample Response   \n\n{\n   \"routeId\":22,\n   \"routeUriId\":33,\n   \"clientId\":403\n}\n\n```\n\n\n\n\n# Admin REST Services (User Portal)\n\n## Headers\n- Content-Type: application/json (for POST and PUT)\n- Authorization: Bearer aToken (POST, PUT, GET and DELETE.)\n- clientId: clientId (example 33477)\n\n\n\n\n## Add Route\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwRestRoute/add\n\nExample Request\n{     \n   \"route\":\"mail\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update Route\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwRestRoute/update\n\nExample Request\n{  \n   \"id\": 84,   \n   \"route\":\"mailChimp\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 84\n}\n\n```\n\n\n## Get Route\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRestRoute/get/84\n  \n```\n\n```\nExample Response   \n\n{  \n   \"id\": 84,  \n   \"route\":\"mail\"\n}\n\n```\n\n\n## Get Route List\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRestRoute/list\n  \n```\n\n```\nExample Response   \n\n[\n    {  \n        \"id\": 84,\n        \"clientId\":4,\n        \"route\":\"mail\"\n    },\n    {\n        \"id\": 85,\n        \"clientId\":4,\n        \"route\":\"content\"\n    },\n    {\n        \"id\": 86,\n        \"clientId\":4,\n        \"route\":\"products\"\n    }\n]\n\n```\n\n\n## Delete Route\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwRestRoute/delete/85\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 85\n}\n\n```\n\n\n\n\n## Add Route URL\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwRouteUrl/add\n\nExample Request\n{  \n   \"routeId\":87,   \n   \"name\": \"testMail\",\n   \"url\": \"google.com/test1\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update Route URL\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwRouteUrl/update\n\nExample Request\n{  \n   \"id\": 188,\n   \"routeId\":87,   \n   \"name\": \"testMailGreen\",\n   \"url\": \"google.com/test1\"\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 188\n}\n\n```\n\n\n## Activate Route URL\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwRouteUrl/activate\n\nExample Request\n{  \n   \"id\": 188,\n   \"routeId\":87   \n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 188\n}\n\n```\n\n\n## Get Route URL\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRouteUrl/get/188/87\n  \n```\n\n```\nExample Response   \n\n{  \n    \"id\": 188,\n    \"routeId\":87,\n    \"clientId\": 403,\n    \"name\": \"testMailGreen\",\n    \"url\": \"google.com/test1\"\n}\n\n```\n\n\n## Get Route URL List\n\n```\nGET:\nURL: http://localhost:3011/rs/gwRouteUrl/list/87\n  \n```\n\n```\nExample Response   \n\n[\n    {\n        \"id\": 188,\n        \"name\": \"testMailGreen\",\n        \"url\": \"google.com/test1\",\n        \"active\": true,\n        \"routeId\": 87,\n        \"clientId\": 403\n    },\n    {\n        \"id\": 189,\n        \"name\": \"testMail\",\n        \"url\": \"google.com/test1\",\n        \"active\": false,\n        \"routeId\": 87,\n        \"clientId\": 403\n    }\n]\n\n```\n\n\n## Delete Route URL\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwRouteUrl/delete/190/87\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 190\n}\n\n```\n\n\n## Add Breaker\n\n```\nPOST:\nURL: http://localhost:3011/rs/gwBreaker/add\n\nExample Request\n{\n   \"failureThreshold\":3,\n   \"healthCheckTimeSeconds\":60,\n   \"failoverRouteName\":\"red\",\n   \"openFailCode\":501,\n   \"routeId\":22,\n   \"routeUriId\":33\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 19\n}\n\n```\n\n\n## Update Breaker\n\n```\nPUT:\nURL: http://localhost:3011/rs/gwBreaker/update\n\nExample Request\n{\n   \"id\": 620,\n   \"failureThreshold\":3,\n   \"healthCheckTimeSeconds\":120,\n   \"failoverRouteName\":\"red\",\n   \"openFailCode\":501,\n   \"routeId\":22,\n   \"routeUriId\":33\n}\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true,\n    \"id\": 84\n}\n\n```\n\n\n## Get Breaker\n\n```\nGET:\nURL: http://localhost:3011/rs/gwBreaker/get/33/22\n  \n```\n\n```\nExample Response   \n\n{  \n   \"id\": 84,\n   \"clientId\":4,\n   \"route\":\"mail\"\n}\n\n```\n\n\n## Delete Breaker\n\n```\nDELETE:\nURL: http://localhost:3011/rs/gwBreaker/delete/33/22\n  \n```\n\n```\nExample Response   \n\n{\n    \"success\": true\n    \n}\n\n```\n\n\n\n\n## Get Errors\n\n```\nGET:\nURL: http://localhost:3011/rs/gwErrors\n  \n```\n\n```\nExample Request   \n\n{\n   \"routeId\":22,\n   \"routeUriId\":33\n}\n\n```\n\n\n\n\n## Get Performance\n\n```\nGET:\nURL: http://localhost:3011/rs/gwPerformance\n  \n```\n\n```\nExample Request   \n\n{\n   \"routeId\":22,\n   \"routeUriId\":33\n}\n\n```\n#Docker usage\n\n```\n\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fulbora%2Fulboraapigateway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fulbora%2Fulboraapigateway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fulbora%2Fulboraapigateway/lists"}