{"id":30772184,"url":"https://github.com/query-farm/duckdb-extension-httpclient","last_synced_at":"2025-09-05T00:52:44.755Z","repository":{"id":258789116,"uuid":"872094255","full_name":"Query-farm/duckdb-extension-httpclient","owner":"Query-farm","description":"DuckDB HTTP GET/POST Client in a Community Extension","archived":false,"fork":false,"pushed_at":"2025-07-28T17:16:32.000Z","size":77,"stargazers_count":67,"open_issues_count":6,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-08-27T14:51:04.478Z","etag":null,"topics":["duckdb","duckdb-extension","extension","http-client"],"latest_commit_sha":null,"homepage":"https://duckdb.org/community_extensions/extensions/http_client.html","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Query-farm.png","metadata":{"files":{"readme":"docs/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,"zenodo":null}},"created_at":"2024-10-13T19:02:56.000Z","updated_at":"2025-08-15T11:34:03.000Z","dependencies_parsed_at":"2024-11-16T15:21:14.816Z","dependency_job_id":"09ca1841-b258-47fb-a724-c6f42d989953","html_url":"https://github.com/Query-farm/duckdb-extension-httpclient","commit_stats":null,"previous_names":["quackscience/duckdb-extension-httpclient","query-farm/duckdb-extension-httpclient"],"tags_count":7,"template":false,"template_full_name":"duckdb/extension-template","purl":"pkg:github/Query-farm/duckdb-extension-httpclient","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Query-farm%2Fduckdb-extension-httpclient","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Query-farm%2Fduckdb-extension-httpclient/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Query-farm%2Fduckdb-extension-httpclient/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Query-farm%2Fduckdb-extension-httpclient/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Query-farm","download_url":"https://codeload.github.com/Query-farm/duckdb-extension-httpclient/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Query-farm%2Fduckdb-extension-httpclient/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273695250,"owners_count":25151484,"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","status":"online","status_checked_at":"2025-09-04T02:00:08.968Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["duckdb","duckdb-extension","extension","http-client"],"created_at":"2025-09-05T00:52:39.636Z","updated_at":"2025-09-05T00:52:44.737Z","avatar_url":"https://github.com/Query-farm.png","language":"C++","readme":"\u003cimg src=\"https://github.com/user-attachments/assets/46a5c546-7e9b-42c7-87f4-bc8defe674e0\" width=250 /\u003e\n\n# DuckDB HTTP Client Extension\nThis very experimental extension spawns an HTTP Client from within DuckDB resolving GET/POST requests.\u003cbr\u003e\n\n\u003e Experimental: USE AT YOUR OWN RISK!\n\n### 📦 Installation\n```sql\nINSTALL http_client FROM community;\nLOAD http_client;\n```\n\n### Functions\n- `http_get(url)`\n- `http_post(url, headers, params)`\n  - Sends POST request with params encoded as a JSON object\n- `http_post_form(url, headers, params)`\n  - Sends POST request with params being `application/x-www-form-urlencoded` encoded (used by many forms and some APIs)\n\n### Examples\n#### GET\n```sql\nD WITH __input AS (\n    SELECT\n      http_get(\n          'https://httpbin.org/delay/0'\n      ) AS res\n  ),\n  __response AS (\n    SELECT\n      (res-\u003e\u003e'status')::INT AS status,\n      (res-\u003e\u003e'reason') AS reason,\n      unnest( from_json(((res-\u003e\u003e'body')::JSON)-\u003e'headers', '{\"Host\": \"VARCHAR\"}') ) AS features\n    FROM\n      __input\n  )\n  SELECT\n    __response.status,\n    __response.reason,\n    __response.Host AS host,\n  FROM\n    __response\n  ;\n┌────────┬─────────┬─────────────┐\n│ status │ reason  │    host     │\n│ int32  │ varchar │   varchar   │\n├────────┼─────────┼─────────────┤\n│    200 │ OK      │ httpbin.org │\n└────────┴─────────┴─────────────┘\n```\n\n#### POST\n```sql\nD WITH __input AS (\n    SELECT\n      http_post(\n          'https://httpbin.org/delay/0',\n          headers =\u003e MAP {\n            'accept': 'application/json',\n          },\n          params =\u003e MAP {\n          }\n      ) AS res\n  ),\n  __response AS (\n    SELECT\n      (res-\u003e\u003e'status')::INT AS status,\n      (res-\u003e\u003e'reason') AS reason,\n      unnest( from_json(((res-\u003e\u003e'body')::JSON)-\u003e'headers', '{\"Host\": \"VARCHAR\"}') ) AS features\n    FROM\n      __input\n  )\n  SELECT\n    __response.status,\n    __response.reason,\n    __response.Host AS host,\n  FROM\n    __response\n  ;\n┌────────┬─────────┬─────────────┐\n│ status │ reason  │    host     │\n│ int32  │ varchar │   varchar   │\n├────────┼─────────┼─────────────┤\n│    200 │ OK      │ httpbin.org │\n└────────┴─────────┴─────────────┘\n```\n\n#### POST using form encoding(application/x-www-form-urlencoded, not multipart/form-data)\n```sql\nD WITH __input AS (\n  SELECT\n    http_post_form(\n        'https://httpbin.org/delay/0',\n        headers =\u003e MAP {\n          'accept': 'application/json',\n        },\n        params =\u003e MAP {\n          'limit': 10\n        }\n    ) AS res\n),\n__response AS (\n  SELECT\n    (res-\u003e\u003e'status')::INT AS status,\n    (res-\u003e\u003e'reason') AS reason,\n    unnest( from_json(((res-\u003e\u003e'body')::JSON)-\u003e'form', '{\"limit\": \"VARCHAR\"}') ) AS features\n  FROM\n    __input\n)\nSELECT\n  __response.status,\n  __response.reason,\n  __response.limit AS limit\nFROM\n  __response\n;\n┌────────┬─────────┬─────────┐\n│ status │ reason  │  limit  │\n│ int32  │ varchar │ varchar │\n├────────┼─────────┼─────────┤\n│    200 │ OK      │ 10      │\n└────────┴─────────┴─────────┘\n```\n\n\n#### Full Example w/ spatial data\nThis is the original example by @ahuarte47 inspiring this community extension.\n\n```sql\nD SET autoinstall_known_extensions=1; SET autoload_known_extensions=1;\nD LOAD json; LOAD httpfs; LOAD spatial;\n\nD WITH __input AS (\n    SELECT\n      http_get(\n        'https://earth-search.aws.element84.com/v0/search')\n      AS res\n  ),\n  __features AS (\n    SELECT\n      unnest( from_json(((res-\u003e\u003e'body')::JSON)-\u003e'features', '[\"json\"]') )\n      AS features\n    FROM\n      __input\n  )\n  SELECT\n    features-\u003e\u003e'id' AS id,\n    features-\u003e'properties'-\u003e\u003e'sentinel:product_id' AS product_id,\n    concat(\n      'T',\n      features-\u003e'properties'-\u003e\u003e'sentinel:utm_zone',\n      features-\u003e'properties'-\u003e\u003e'sentinel:latitude_band',\n      features-\u003e'properties'-\u003e\u003e'sentinel:grid_square'\n    ) AS grid_id,\n    ST_GeomFromGeoJSON(features-\u003e'geometry') AS geom\n  FROM\n    __features\n  ;\n┌──────────────────────┬──────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────┐\n│          id          │      product_id      │ grid_id │                                       geom                                       │\n│       varchar        │       varchar        │ varchar │                                     geometry                                     │\n├──────────────────────┼──────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────┤\n│ S2B_55GDP_20241003…  │ S2B_MSIL2A_2024100…  │ T55GDP  │ POLYGON ((146.7963024570636 -42.53859799130381, 145.7818492341335 -42.53284395…  │\n│ S2B_55HEC_20241003…  │ S2B_MSIL2A_2024100…  │ T55HEC  │ POLYGON ((146.9997932100229 -34.429312828654396, 146.9997955899612 -33.4390429…  │\n│ S2B_55JHN_20241003…  │ S2B_MSIL2A_2024100…  │ T55JHN  │ POLYGON ((149.9810192714723 -25.374826158099584, 149.9573295859729 -24.3845516…  │\n│ S2B_15MWT_20230506…  │ S2B_MSIL2A_2023050…  │ T15MWT  │ POLYGON ((-92.01266261624052 -2.357695714729873, -92.0560908879947 -2.35076658…  │\n│ S2B_16PBT_20230506…  │ S2B_MSIL2A_2023050…  │ T16PBT  │ POLYGON ((-88.74518736203468 11.690012668805194, -88.9516536515512 11.72635252…  │\n│ S2B_16PCT_20230506…  │ S2B_MSIL2A_2023050…  │ T16PCT  │ POLYGON ((-87.82703591176752 11.483638069337541, -88.8349824533826 11.70734355…  │\n│ S2B_15PZP_20230506…  │ S2B_MSIL2A_2023050…  │ T15PZP  │ POLYGON ((-89.24113885498912 11.784951995968179, -89.38831685490888 11.8080246…  │\n│ S2B_16PET_20230506…  │ S2B_MSIL2A_2023050…  │ T16PET  │ POLYGON ((-87.00017408768262 11.277451946475995, -87.00017438483464 11.7600349…  │\n│ S2B_16PBU_20230506…  │ S2B_MSIL2A_2023050…  │ T16PBU  │ POLYGON ((-88.74518962519173 11.690373971442378, -89.62017907866615 11.8466519…  │\n│ S2B_16PDU_20230506…  │ S2B_MSIL2A_2023050…  │ T16PDU  │ POLYGON ((-87.91783982214183 11.670141095427311, -87.92096676562824 12.5828090…  │\n├──────────────────────┴──────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────┤\n│ 10 rows                                                                                                                        4 columns │\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquery-farm%2Fduckdb-extension-httpclient","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquery-farm%2Fduckdb-extension-httpclient","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquery-farm%2Fduckdb-extension-httpclient/lists"}