
G2b Sanctioned Supplier
- 1.2k installs
- 7k repo stars
- Updated August 2, 2026
- nomadamas/k-skill
Helps with ai & agent building tasks.
About
g2b-sanctioned-supplier is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- g2b-sanctioned-supplier
- AI & Agent Building
- AI-coding skill
G2b Sanctioned Supplier by the numbers
- 1,152 all-time installs (skills.sh)
- +240 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #944 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/nomadamas/k-skill --skill g2b-sanctioned-supplierAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.2k |
|---|---|
| repo stars | ★ 7k |
| Last updated | August 2, 2026 |
| Repository | nomadamas/k-skill ↗ |
What it does
Helps with ai & agent building tasks.
Files
나라장터 부정당제재업체정보 조회
What this skill does
공공데이터포털의 조달청 나라장터 사용자정보 서비스(data.go.kr 15129466, getUnptRsttCorpInfo02)를 k-skill-proxy 경유로 호출해, 사업자등록번호 정확 일치(inqryDiv=1)로 조회시점 현재 유효한 부정당제재를 조회한다.
- 반환: 제재 시작/종료일자, 제재기관명, 계약법구분, 제재근거법률 등 upstream 필드 원문
Coverage boundary
upstream 명세상 다음은 제공되지 않는다 — 과거 이력 조회가 아니다.
- 조회시점에 제재만료·해제된 건
- 나라장터 미등록업체·개인에 대한 제재
만료 이력까지 보려면 나라장터(<https://www.g2b.go.kr>)에서 수동 확인이 필요하다.
Design principles
- 점수·등급·해석 라벨을 만들지 않는다. upstream 사실 + 출처 + 적용범위 한계만 담는다.
When to use
- "이 회사 입찰 제재(부정당제재) 이력 있어?"
- "거래/계약 전에 부정당업자 제재 여부 확인해줘"
Prerequisites
- 인터넷 연결,
python3 scripts/g2b_sanctioned_supplier.pyhelper- hosted/self-host
k-skill-proxy의/v1/g2b/sanctioned-supplierroute 접근 가능
Credential requirements
- 사용자 측 필수 시크릿 없음.
KSKILL_PROXY_BASE_URL— self-host 프록시를 쓸 때만 설정. 비우면 hostedhttps://k-skill-proxy.nomadamas.org사용.DATA_GO_KR_API_KEY는 프록시 운영 서버 환경에만 둔다. 공공데이터포털에서조달청_나라장터 사용자정보 서비스(부정당제재업체정보조회 포함) 활용신청이 되어 있어야 한다.
Inputs
--bizno: 사업자등록번호 10자리(하이픈 허용) — 필수
CLI examples
python3 g2b-sanctioned-supplier/scripts/g2b_sanctioned_supplier.py --bizno 124-81-00998Failure modes
400 bad_request: 사업자번호가 10자리가 아님.503 upstream_not_configured: 프록시 서버에DATA_GO_KR_API_KEY없음.502 upstream_forbidden: 프록시 키가 15129466에 활용신청되지 않음.total_count = 0: 조회시점 현재 유효한 제재 없음 (만료·미등록업체는 미제공임에 유의).
Official surfaces
- 공공데이터포털: <https://www.data.go.kr/data/15129466/openapi.do>
- upstream:
https://apis.data.go.kr/1230000/ao/UsrInfoService02/getUnptRsttCorpInfo02 - 수동 대조: 나라장터 <https://www.g2b.go.kr>
- 프록시 route:
GET /v1/g2b/sanctioned-supplier
"""Procurement (나라장터) sanctioned-supplier lookup via k-skill-proxy.
The proxy holds DATA_GO_KR_API_KEY server-side; this helper only builds the
query and reads the structured response. No user secret is required.
"""
from __future__ import annotations
import argparse
import json
import os
import re
import sys
import urllib.error
import urllib.parse
import urllib.request
from typing import Any
PROXY_BASE_URL_ENV_VAR = "KSKILL_PROXY_BASE_URL"
DEFAULT_PROXY_BASE_URL = "https://k-skill-proxy.nomadamas.org"
ROUTE = "/v1/g2b/sanctioned-supplier"
class ApiError(RuntimeError):
def __init__(self, message: str, *, status_code: int | None = None):
super().__init__(message)
self.status_code = status_code
def _text_or_none(value: Any) -> str | None:
if value is None:
return None
text = str(value).strip()
return text or None
def resolve_proxy_base_url(explicit: str | None = None, env: dict[str, str] | None = None) -> str:
env = os.environ if env is None else env
candidate = _text_or_none(explicit or env.get(PROXY_BASE_URL_ENV_VAR))
if candidate and candidate.casefold() in {"off", "false", "0", "disable", "disabled", "none"}:
raise ValueError("KSKILL_PROXY_BASE_URL 가 비활성화되어 있습니다.")
if candidate and candidate != "replace-me":
return candidate.rstrip("/")
return DEFAULT_PROXY_BASE_URL
def normalize_bizno(value: Any) -> str:
raw = _text_or_none(value)
if not raw:
raise ValueError("사업자등록번호(bizno)를 입력하세요.")
normalized = re.sub(r"\D", "", raw)
if not re.fullmatch(r"\d{10}", normalized):
raise ValueError("사업자등록번호는 숫자 10자리여야 합니다.")
return normalized
def read_json_response(request: urllib.request.Request) -> dict[str, Any]:
try:
with urllib.request.urlopen(request, timeout=30) as response:
try:
payload = json.loads(response.read().decode("utf-8"))
except json.JSONDecodeError as error:
raise ApiError("g2b sanction proxy returned invalid JSON.") from error
if not isinstance(payload, dict):
raise ApiError("g2b sanction proxy returned a non-object JSON payload.")
return payload
except urllib.error.HTTPError as error:
body = error.read().decode("utf-8", errors="replace")
try:
payload = json.loads(body)
except json.JSONDecodeError:
payload = None
if isinstance(payload, dict) and payload.get("message"):
raise ApiError(str(payload["message"]), status_code=error.code) from error
raise ApiError(f"g2b sanction proxy request failed with HTTP {error.code}", status_code=error.code) from error
except urllib.error.URLError as error:
raise ApiError(f"g2b sanction proxy request failed: {error.reason}") from error
def query_sanctions(bizno: str, *, base_url: str | None = None,
read_json: Any = read_json_response) -> dict[str, Any]:
normalized = normalize_bizno(bizno)
url = f"{resolve_proxy_base_url(base_url)}{ROUTE}?{urllib.parse.urlencode({'bizno': normalized})}"
request = urllib.request.Request(url, headers={
"Accept": "application/json",
"User-Agent": "k-skill-g2b-sanctioned-supplier/1.0",
}, method="GET")
return read_json(request)
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="나라장터 부정당제재업체정보 조회 (k-skill-proxy 경유)")
parser.add_argument("--bizno", required=True, help="사업자등록번호 10자리(하이픈 허용)")
parser.add_argument("--proxy-base-url")
return parser
def main(argv: list[str] | None = None) -> int:
args = build_parser().parse_args(argv)
try:
result = query_sanctions(args.bizno, base_url=args.proxy_base_url)
print(json.dumps(result, ensure_ascii=False, indent=2))
return 0
except (ValueError, ApiError) as error:
print(json.dumps({"error": str(error)}, ensure_ascii=False, indent=2), file=sys.stderr)
return 1
if __name__ == "__main__":
raise SystemExit(main())
Related skills
AI & Agent Buildingagents