Techsy
문의하기
시작하기
블로그로 돌아가기
web-development

커스텀 내부 도구를 위한 HubSpot API 통합: Node + Python 가이드 (2026)

작성자 Mert Batur Gürbüz
Jul 22, 2026
11 분 읽기
목차
커스텀 내부 도구를 위한 HubSpot API 통합: Node + Python 가이드 (2026)

커스텀 내부 도구를 위한 HubSpot API 통합: Node + Python 가이드 (2026)

HubSpot API 통합을 위해 아직도 HubSpot API 키를 찾고 계신가요? 검색을 중단하세요. HubSpot은 2022년 11월 30일에 정적 API 키 지원을 종료했으며, 현재 Node SDK(@hubspot/api-client, 현재 v14)는 이를 더 이상 허용하지 않습니다. 단일 계정 기반 내부 도구에 적합한 자격 증명은 프라이빗 앱 액세스 토큰이며, 이 가이드에서는 첫 번째 create contact 호출부터 서명 검증이 된 웹훅까지 Node와 Python 모두에서 실제 HubSpot-내부 도구 동기화를 구축하는 방법을 소개합니다.

간단한 답변: HubSpot API 통합은 커스텀 내부 도구가 HubSpot의 v3 REST API를 통해 CRM 데이터를 읽고 쓸 수 있게 해줍니다. 단일 계정 내부 도구의 경우 프라이빗 앱 액세스 토큰으로 인증하고(HubSpot은 2022년 API 키 지원을 중단함), 폴링 대신 웹훅을 사용하여 실시간으로 변경 사항을 동기화하세요.

여러분이 구축하게 될 내용은 다음과 같습니다:

  • 프라이빗 앱 토큰 인증과 Node 및 Python에서의 첫 번째 create contact 호출
  • 페이로드를 신뢰하기 전에 X-HubSpot-Signature-v3를 검증하는 웹훅 수신기
  • 429 오류에 안전하며 한 번에 100개씩 배치 처리되는 내부 티켓팅 또는 ERP 기록 동기화

커스텀 내부 도구를 위한 HubSpot API 통합은 어떻게 작동하나요?

HubSpot API 통합은 커스텀 내부 도구(티켓팅 앱, ERP, 청구 대시보드, 고객 포털 등)를 HubSpot의 v3 REST API를 통해 HubSpot CRM에 연결합니다. 여러분의 도구는 프라이빗 앱 액세스 토큰을 사용하여 HTTPS를 통해 CRM 객체(연락처, 딜, 회사 또는 커스텀 객체)를 읽고 쓰며, 실시간 변경 사항은 웹훅을 통해 다시 흘러들어옵니다.

HubSpot의 CRM을 HTTP로 대화하는 데이터베이스라고 생각하세요. 모든 기록은 유형과 ID를 가진 객체입니다. 여러분이 구축 중인 hubspot crm api integration은 두 가지 작업을 수행합니다. HubSpot으로 데이터를 푸시하거나(티켓이 열릴 때 연락처 생성), HubSpot에서 데이터를 가져오는 것(내부 대시보드가 렌더링될 때 딜 읽기)입니다.

동기화는 두 가지 방향 중 하나로 실행됩니다. 단방향 동기화는 HubSpot에서 도구로, 또는 도구에서 HubSpot으로 변경 사항을 복사합니다. 양방향 동기화는 둘 다 수행하며 루프 보호가 필요하며, 이는 나중에 다루겠습니다. 또한 매분 HubSpot에 "새로운 것이 있나요?"라고 묻는(폴링) 대신, 웹훅을 등록하여 기록이 변경되는 순간 HubSpot이 알려주도록 설정합니다.

호스팅된 CRM을 통합하기보다 데이터를 완전히 소유하고 싶다면,コミット하기 전에 오픈 소스 CRM을 자체 호스팅하는 것도 고려해 볼 만한 다른 경로입니다. 하지만 HubSpot이 이미 여러분의 단일 정보 출처(source of truth)라면, API는 다른 모든 시스템이 이와 통신하는 방법입니다.

단일 계정 내부 도구의 경우 OAuth나 앱 마켓플레이스 리스팅이 필요하지 않습니다. 프라이빗 앱 토큰과 웹훅이 전체 통합의 전부입니다.

2026년의 인증: 왜 더 이상 HubSpot API 키가 없는가

단일 계정 내부 도구의 HubSpot API 인증에는 프라이빗 앱 액세스 토큰을 사용하세요. 이는 HubSpot 계정에서 한 번 생성하는 정적 베어러 토큰으로, 도구가 접근하는 객체에 정확히 범위가 지정됩니다. 갱신 흐름이나 만료 기간이 없습니다. OAuth는 내부 운영 팀이 사용하는 대시보드가 아닌, 공개적인 다중 계정 앱을 위한 것입니다.

프라이빗 앱 토큰 vs 폐기된 API 키

이 검색 결과 페이지(SERP)에 도달한 개발자 절반이 걸려넘어지는 함정이 여기 있습니다. HubSpot은 2022년 11월 30일 API 키 지원을 중단했으며, 현재는 완전히 지원되지 않습니다. 자동완성 기능은 여전히 근육 기억이 따라잡지 못해 "hubspot api key"를 제안하지만, 가져올 키는 존재하지 않습니다. 대신 hubspot private app을 사용하세요. 설정에서 생성하고 필요한 스코프를 부여한 후, Auth 탭에서 액세스 토큰을 복사하세요. HubSpot의 프라이빗 앱 개요에서 설정 방법을 확인할 수 있습니다.

방법사용 사례만료 또는 갱신 여부적합 대상
API 키제거됨2022년 11월 지원 중단없음, 폐기됨
프라이빗 앱 액세스 토큰단일 계정 내부 도구아니오, 정적, 갱신 불필요여러분의 내부 도구, 여기서의 기본값
OAuth 2.0공개 또는 다중 계정 앱예, 토큰은 약 6시간 후 만료되며 갱신 필요다른 회사의 포털에 리스팅하는 앱
서비스 키 (공개 베타, 2026년 2월)계정 수준, 데이터 전용 자격 증명문서에 따른 계정 범위데이터 전용 서버 작업, 아직 베타

토큰 자체에 대한 두 가지 규칙. 최소 권한을 부여하세요. 도구가 딜만 읽고 연락처만 쓴다면 crm.objects.contacts.write와 crm.objects.deals.read만 요청하고 그 이상은 요청하지 마세요. 그리고 토큰은 환경 변수나 시크릿 매니저에 보관하고 Authorization: Bearer 헤더로 전송하며, 하드코딩하거나 브라우저로 전송하지 마세요.

결론은 간단합니다. 내부 도구의 경우 프라이빗 앱 액세스 토큰을 사용하세요. 이것이 나중에 다른 회사가 자체 포털에 설치하는 공개적인 다중 계정 앱이 될 경우에만 OAuth를 사용하세요.

첫 번째 HubSpot API 호출: Node와 Python으로 연락처 생성하기

표준적인 첫 번째 호출은 create contact이며, 공식 SDK를 사용하면 몇 줄의 코드로 완료할 수 있습니다. 클라이언트를 설치하고, 환경 변수의 프라이빗 앱 토큰으로 초기화한 후, 연락처를 생성하고 딜을 다시 읽어옵니다. 이는 회사, 티켓 및 hubspot custom objects api 호출에도 재사용할 동일한 패턴이며, 객체 유형만 변경됩니다.

다음은 @hubspot/api-client(v14)를 사용한 Node 버전입니다:

javascript
// npm i @hubspot/api-client   (v14.x)
import { Client } from "@hubspot/api-client";

// Private app token from a secret manager or env var, never hard-coded
const hubspot = new Client({ accessToken: process.env.HUBSPOT_PRIVATE_APP_TOKEN });

// Create a contact
const { id } = await hubspot.crm.contacts.basicApi.create({
  properties: {
    email: "[email protected]",
    firstname: "Ada",
    lastname: "Lovelace",
    lifecyclestage: "lead",
  },
  associations: [],
});
console.log("Created contact", id);

// Read a deal by ID
const deal = await hubspot.crm.deals.basicApi.getById(
  "1234567890",
  ["dealname", "amount", "dealstage"],
);
console.log(deal.properties.dealname, deal.properties.amount);

그리고 hubspot-api-client(v12)를 사용한 Python 버전입니다:

python
# pip install hubspot-api-client   (v12.x)
import os
from hubspot import HubSpot
from hubspot.crm.contacts import SimplePublicObjectInputForCreate

# Private app token from the environment, not source control
client = HubSpot(access_token=os.environ["HUBSPOT_PRIVATE_APP_TOKEN"])

# Create a contact
contact = client.crm.contacts.basic_api.create(
    simple_public_object_input_for_create=SimplePublicObjectInputForCreate(
        properties={
            "email": "[email protected]",
            "firstname": "Ada",
            "lastname": "Lovelace",
            "lifecyclestage": "lead",
        }
    )
)
print("Created contact", contact.id)

# Read a deal by ID
deal = client.crm.deals.basic_api.get_by_id(
    deal_id="1234567890",
    properties=["dealname", "amount", "dealstage"],
)
print(deal.properties["dealname"], deal.properties["amount"])

전문가 팁: 프로덕션 환경이 아닌 HubSpot 개발자 샌드박스에서 테스트하세요. 프로덕션에서의 잘못된 생성 호출은 영업 팀이 정리해야 하는 실제 쓰레기 기록을 남깁니다. 토큰, 스코프 및 객체 모델은 샌드박스에서도 동일하게 작동합니다.

실시간으로 HubSpot을 내부 도구와 어떻게 동기화하나요?

폴링이 아닌 웹훅을 사용하세요. 관심 있는 객체와 이벤트(예: deal.propertyChange)에 대해 프라이빗 앱에서 웹훅 구독을 등록하고, 호스팅하는 HTTPS 엔드포인트를 지정하면, 일치하는 변경 사항이 발생하는 순간 HubSpot이 작은 JSON 배열을 POST로 전송합니다. 모니터링해야 할 것에 대한 구독이 없을 때만 폴링을 사용하세요.

효율성이 핵심입니다. 폴링은 매분 "새로운 것이 있나요?"라고 묻으며 rate limit을 소모하지만, 웹훅은 딜이 변경되는 순간 알려줍니다. 이 차이는 규모가 커질 때 중요하며, 웹훅은 이제 더 이상 특이한 것이 아니라 주류가 되었습니다. Postman의 2025 State of the API Report(5,700명 이상의 개발자를 대상으로 한 설문 조사)에 따르면 팀의 약 절반이 웹훅에 의존하고 있습니다.

프라이빗 앱의 Webhooks 탭에서 구독을 등록하고, 대상 URL을 설정하며, 이벤트를 선택하세요. HubSpot은 subscriptionType, objectId 및 변경 사항을 포함하는 이벤트 객체 배열을 보냅니다. 다음은 Express를 사용한 Node의 수신기 스텁입니다:

javascript
import express from "express";

const app = express();
// Capture the raw body: you need the exact bytes to validate the signature next
app.use(express.json({
  verify: (req, _res, buf) => { req.rawBody = buf.toString("utf8"); },
}));

// HubSpot POSTs an array of events to this URL
app.post("/webhooks/hubspot", (req, res) => {
  const events = req.body; // [{ subscriptionType: "deal.propertyChange", objectId: 1234, ... }]
  for (const event of events) {
    console.log("HubSpot event:", event.subscriptionType, event.objectId);
    // Do NOT trust this payload yet. The next section validates it before we act.
  }
  res.sendStatus(200);
});

app.listen(3000, () => console.log("Listening on :3000"));

이제 본격적인 구축 단계로 들어갑니다. 예를 들어 소규모 제조업체의 ERP 기록으로 딜을 동기화한다고 가정해 봅시다. 웹훅이 발생하면 핸들러가 일치하는 ERP 티켓을 생성하거나 업데이트하고, 운영 팀은 HubSpot을 건드리지 않고도 변경 사항을 확인합니다. 이는 우리가 음성 에이전트를 CRM에 동기화할 때 사용하는 것과 동일한 실시간 접근 방식이지만, 트리거가 전화 통화 대신 속성 변경이라는 점만 다릅니다. 주의할 점: 위의 스텁은 POST되는 모든 것을 신뢰합니다. 라이브 배포 전에 이를 수정하세요.

위조된 페이로드를 절대 신뢰하지 않도록 웹훅 서명(v3) 검증하기

들어오는 모든 웹훅을 v3 서명으로 검증하세요. HubSpot은 앱 시크릿으로 각 요청에 서명하고 X-HubSpot-Signature-v3 및 X-HubSpot-Request-Timestamp라는 두 개의 헤더를 보냅니다. 5분보다 오래된 요청은 거부하고, method + 전체 URL + 원본 본문 + timestamp로 소스 문자열을 재구성한 후, 앱 시크릿으로 HMAC-SHA256 해싱하고 base64로 인코딩하여 상수 시간(constant time)에 비교하세요.

이를 건너뛰면 웹훅 URL을 추측한 누구나 딜 업데이트를 위조할 수 있습니다. 검증은 선택 사항이 아닙니다. HubSpot의 요청 검증 문서와 v3 서명 변경 로그에 정확한 레시피가 명시되어 있습니다. 다음은 Express 미들웨어로 바로 사용할 수 있는 코드입니다:

javascript
import crypto from "crypto";

const CLIENT_SECRET = process.env.HUBSPOT_APP_SECRET; // from your private app settings
const MAX_AGE_MS = 5 * 60 * 1000; // reject anything older than 5 minutes

export function validateHubSpotSignature(req, res, next) {
  const signature = req.header("X-HubSpot-Signature-v3");
  const timestamp = req.header("X-HubSpot-Request-Timestamp");

  // 1. Reject stale requests (replay protection)
  if (!signature || !timestamp || Date.now() - Number(timestamp) > MAX_AGE_MS) {
    return res.sendStatus(401);
  }

  // 2. Rebuild the exact source string: method + full URL + raw body + timestamp
  const uri = `https://${req.get("host")}${req.originalUrl}`;
  const source = `${req.method}${uri}${req.rawBody}${timestamp}`;

  // 3. HMAC-SHA256 with the app secret, base64-encoded
  const hash = crypto
    .createHmac("sha256", CLIENT_SECRET)
    .update(source, "utf8")
    .digest("base64");

  // 4. Constant-time compare against the header
  const expected = Buffer.from(hash);
  const received = Buffer.from(signature);
  if (expected.length !== received.length ||
      !crypto.timingSafeEqual(expected, received)) {
    return res.sendStatus(401);
  }
  next();
}

두 스택 모두를 커버하기 위한 Python 함수 버전의 동일한 검사 로직입니다:

python
import base64
import hashlib
import hmac
import os
import time

CLIENT_SECRET = os.environ["HUBSPOT_APP_SECRET"].encode("utf-8")
MAX_AGE_MS = 5 * 60 * 1000  # 5 minutes

def is_valid_signature(method, uri, body, signature, timestamp):
    # 1. Reject stale requests
    if not signature or not timestamp:
        return False
    if int(time.time() * 1000) - int(timestamp) > MAX_AGE_MS:
        return False

    # 2. method + full URL + raw body + timestamp
    source = f"{method}{uri}{body}{timestamp}".encode("utf-8")

    # 3. HMAC-SHA256, base64
    digest = hmac.new(CLIENT_SECRET, source, hashlib.sha256).digest()
    expected = base64.b64encode(digest).decode("utf-8")

    # 4. Constant-time compare
    return hmac.compare_digest(expected, signature)

사람들이 반나절을 낭비하게 만드는 함정: HubSpot은 스키마, 호스트 및 경로를 포함한 전체 대상 URL에 서명합니다. 프록시, 로드 밸런서 또는 ngrok 터널 뒤에 있을 때 req.get("host")는 HubSpot이 서명한 공용 호스트 대신 내부 호스트를 보고할 수 있습니다. 합법적인 페이로드임이 확실한데 검증이 계속 실패한다면, 재구성한 정확한 URI를 로그로 기록하고 공용 웹훅 URL과 문자 단위로 비교하세요.

Rate Limits, 429 오류 및 Batch API: 프로덕션에서 겪은 경험

프라이빗 앱은 초당 약 10개의 요청(Free/Starter에서는 10초당 100개, Pro/Enterprise에서는 10초당 190개)을 받으며, 일일 제한은 250,000에서 1,000,000 사이입니다. 함정: CRM Search는 별도로 초당 4개의 요청으로 제한되며, 배치 엔드포인트는 요청당 최대 100개의 기록을 허용합니다. HubSpot의 사용 지침에서 티어를 확인할 수 있습니다.

티어10초당초당일일 제한비고
Free / Starter (프라이빗 앱)100~10250,000CRM Search는 별도로 초당 4회 요청으로 제한
Pro / Enterprise (프라이빗 앱)190~19최대 1,000,000배치 엔드포인트는 요청당 최대 100개 기록

이론이 붉은 색 경고등이 켜진 스테이징 대시보드와 마주친 순간입니다. 올해 봄 백필(backfill) 동안 내부 티켓팅 도구에서 기존 기록 약 8,000개를 HubSpot으로 푸시하고 각각을 CRM Search 조회로 보강했습니다. Node 측에서는 @hubspot/api-client v14를, Python 보강 워커에서는 hubspot-api-client v12를 실행했습니다. 대량 쓰기는 문제없었습니다. 하지만 Search 호출은 1분 이내에 실패했는데, 이는 워커가 별도로 예산을 잡지 않은硬性 한도인 초당 4회 요청 against 초당 약 15회 요청을 날렸기 때문입니다.

두 가지 변경 사항으로 이를 해결했습니다. 첫째, X-HubSpot-RateLimit-* 응답 헤더를 읽고 429 오류 시 백오프하는 재시도 래퍼:

javascript
// Wrap any HubSpot call; retries on 429 with exponential backoff
async function withRetry(fn, maxRetries = 5) {
  let attempt = 0;
  while (true) {
    try {
      return await fn();
    } catch (err) {
      const status = err.code ?? err.response?.status;
      if (status !== 429 || attempt >= maxRetries) throw err;

      // Honor HubSpot's reset window if the header is present
      const headers = err.response?.headers ?? {};
      const resetMs = Number(headers["x-hubspot-ratelimit-interval-milliseconds"]) || 0;
      const backoff = Math.max(resetMs, 2 ** attempt * 500); // 0.5s, 1s, 2s, 4s...

      console.warn(`429 hit, retry ${attempt + 1} in ${backoff}ms`);
      await new Promise((r) => setTimeout(r, backoff));
      attempt++;
    }
  }
}

둘째, 기록을 하나씩 쓰는 것을 중단했습니다. 배치 엔드포인트는 POST /crm/v3/objects/{objectType}/batch/create당 최대 100개의 기록을 받으므로, 백필을 8,000개의 단일 POST 대신 80개의 배치 호출로 분할했습니다:

javascript
// HubSpot batch endpoints accept at most 100 records per request
function chunk(arr, size = 100) {
  const out = [];
  for (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));
  return out;
}

// POST /crm/v3/objects/contacts/batch/create, chunked to 100 at a time
async function batchCreateContacts(records) {
  for (const group of chunk(records, 100)) {
    const inputs = group.map((r) => ({
      properties: { email: r.email, firstname: r.firstName, lastname: r.lastName },
      associations: [],
    }));
    await withRetry(() => hubspot.crm.contacts.batchApi.create({ inputs }));
    console.log(`Wrote ${group.length} contacts`);
  }
}

Search 워커를 초당 4회 요청으로 제한하고 쓰기를 배치 처리함으로써, 재시도로 가득 차던 실행을 조용히 완료되는 실행으로 바꾸었습니다. 이 섹션에서 하나의 숫자만 기억한다면 4를 기억하세요. CRM Search 제한은 프로덕션에서 문제를 일으키는 제한이며, 대부분의 요약 게시물이 언급하기를 잊는 제한입니다. 참고로 이전의 "연락처용 10개" 배치 한도는 사라졌으며, 현재는 객체 유형 전반에 걸쳐 100개입니다.

양방향으로 가기: 무한 루프 없이 HubSpot으로 변경 사항 다시 쓰기

양방향 동기화는 내부 도구에서 HubSpot으로 변경 사항을 다시 쓰는 것과 함께 읽기도 수행합니다. 위험은 피드백 루프입니다. 여러분의 write-back이 핸들러를 트리거한 바로 그 웹훅을 다시 발생시켜, 영원히 다시 쓰게 됩니다. 이를 방지하려면 멱등성 키(이미 적용한 변경 사항 건너뛰기)와 소스 플래그(자체 도구가 유발한 inbound 이벤트 무시)를 사용하세요.

javascript
const processed = new Set(); // use Redis or a unique DB constraint in production

async function writeBackToHubSpot(record) {
  // Dedup key: object id + a hash of the change we're about to apply
  const key = `${record.id}:${record.updatedHash}`;
  if (processed.has(key)) return; // already synced this exact change
  processed.add(key);

  await withRetry(() =>
    hubspot.crm.contacts.basicApi.update(record.id, {
      // Tag the source so the resulting webhook is ignored by our own receiver
      // (check for source: "internal-tool" before acting on an inbound event)
      properties: { internal_status: record.status, last_sync_source: "internal-tool" },
    })
  );
}

패턴은 작지만, 이를 건너뛰면 동기화가 하룻밤 사이에 쓰기량을 조용히 두 배로 늘릴 수 있습니다. 양방향으로 데이터가 깨끗해지면, 팀은 종종 이를 AI SDR 파이프라인이나 보고 계층으로 downstream에서 활용합니다. 양방향 동기화에 대한 두 번째 관점이 필요하다면 Nango의 HubSpot 통합 튜토리얼이 훌륭한 Node 전용 참고 자료이지만, 루프 방지 아이디어는 직접 포트해야 합니다.

이를 사내에서 구축해야 할까, 아니면 통합 파트너를 고용해야 할까?

동기화가 작고, 안정적이며, 소유권이 명확할 때 사내에서 구축하세요. 단방향 흐름, 몇 가지 객체, 그리고 HubSpot의 연 2회 정도 발생하는 파괴적 변경(breaking changes)을 흡수할 수 있는 엔지니어가 있는 경우입니다. 양방향 동기화, 커스텀 객체 모델링이 필요하거나 팀 내에 지속적인 유지보수를 담당할 사람이 없을 때는 파트너를 고용하세요. 결정 요인은 초기 구축이 아니라, 1년 후에 누가 이를 모니터링하느냐입니다.

솔직한 체크리스트입니다. 다음과 같다면 직접 구축하세요: 방향이 단방향이고, 표준 객체를 동기화하며, 웹훅 엔드포인트를 호스팅할 개발자가 있고, 페이로드 실패 시 이를 알아차릴 사람이 있는 경우. 위의 모든 내용이 여러분의 청사진입니다.

다음과 같다면 파트너를 고용하세요: 여러 객체에 걸쳐 루프 방지가 포함된 양방향 동기화가 필요하거나, 타입화된 연관성을 가진 커스텀 객체를 모델링 중이거나, 여러 시스템(HubSpot plus ERP plus billing)을 연결 중이거나, 유지보수를 담당할 사람이 이미 업무 과포화 상태인 경우. HubSpot은 날짜 기반 API 버전 관리를 사용하며 파괴적 변경은 연 2회 정도만 발생하는데, 이는听起来 부드러워 보이지만 가장 바쁜 주에 발생하고 소유자가 없을 때는 그렇지 않습니다. 첫 배포가 아닌 이러한 유지보수의 꼬리가 내부 통합을 조용히 침몰시키는 원인입니다. 이를 소유하고 싶지 않다면, 우리의 커스텀 CRM 통합 서비스가 도움이 될 수 있습니다.

주요 요약

  • HubSpot API 키는 더 이상 존재하지 않습니다. 단일 계정 내부 도구에는 프라이빗 앱 액세스 토큰을 사용하세요. OAuth는 공개적인 다중 계정 앱용입니다.
  • 웹훅 페이로드를 신뢰하기 전에 항상 X-HubSpot-Signature-v3를 검증하세요. 전체 대상 URL로 소스 문자열을 재구성하세요.
  • 초당 4회 요청의 CRM Search 제한을 존중하고, 429 백오프와 함께 100개 단위로 대량 쓰기를 배치 처리하세요.
  • 실시간 동기화를 위해 폴링보다 웹훅을 선호하며, HubSpot 통합은 더 넓은 비즈니스용 AI 도구 스택의 일부입니다.

유지보수 측면에서 막혔거나, 배포 전에 제2의 눈이 필요하신가요? 무료 통합 상담 예약. 어느 쪽이든 부담은 없습니다. 위의 코드는 여러분이 실행할 수 있는 것입니다.

저자 소개

Mert Batur Gurbuz는 Techsy.io의 공동 창립자로, 팀은 B2B 고객을 위한 AI 에이전트, 자동화 시스템 및 음성/SDR 파이프라인을 제공합니다. 그는 버밍엄 대학교에서 공부하며 Techsy 팀이 프로덕션에서 실제로 사용하는 LLM 도구 스택에 대해 작성합니다. 자격: Techsy.io 공동 창립자, 버밍엄 대학교. LinkedIn에서 연결하세요.

자주 묻는 질문

2026년에도 여전히 HubSpot API 키가 필요한가요?

아니요. HubSpot은 2022년 11월 30일 정적 API 키 지원을 중단했으며 완전히 지원되지 않습니다. 습관적으로 자동완성이 "hubspot api key"를 제안하지만, 가져올 것은 없습니다. 단일 계정 내부 도구의 경우 설정에서 프라이빗 앱을 생성하고 대신 해당 액세스 토큰을 사용하세요.

HubSpot에서 프라이빗 앱 토큰과 OAuth의 차이점은 무엇인가요?

프라이빗 앱 액세스 토큰은 만료 기간과 갱신 흐름이 없는 단일 HubSpot 계정용 정적 자격 증명으로, 내부 도구에 이상적입니다. OAuth 2.0은 다른 회사가 자체 포털에 설치하는 공개적인 다중 계정 앱용이며, 토큰은 약 6시간 후 만료되며 갱신 주기가 필요합니다.

2026년 HubSpot의 API rate limits는 무엇인가요?

프라이빗 앱은 초당 약 10개의 요청(Free/Starter에서는 10초당 100개, Pro/Enterprise에서는 190개)을 받으며 일일 제한은 250,000에서 1,000,000입니다. CRM Search API는 별도로 초당 4개의 요청으로 제한되며, 배치 엔드포인트는 요청당 최대 100개의 기록을 허용합니다.

HubSpot 웹훅 서명을 어떻게 검증하나요?

v3 레시피를 사용하세요. X-HubSpot-Request-Timestamp가 5분보다 오래된 요청은 거부한 후, 메서드 plus 전체 대상 URL plus 원본 본문 plus timestamp로 소스 문자열을 구성하세요. 앱 시크릿으로 HMAC-SHA256 해싱하고 결과를 base64로 인코딩한 후, 상수 시간에 X-HubSpot-Signature-v3와 비교하세요.

어떤 HubSpot SDK를 사용해야 하나요, Node인가요 Python인가요?

둘 다 공식이며 유지보수됩니다. Node는 @hubspot/api-client(v14)를 사용하고 Python은 hubspot-api-client(v12)를 사용합니다. 둘 다 동일한 v3 CRM 객체 모델을 노출하므로 스택에 맞는 것을 선택하세요. 이 가이드는 두 언어 모두에서 동일한 인증 및 서명 검증 코드를 제공합니다.

실시간으로 HubSpot을 커스텀 내부 도구와 어떻게 동기화하나요?

관심 있는 객체와 이벤트에 대해 프라이빗 앱에서 웹훅 구독을 등록한 후, 일치하는 변경 사항이 발생할 때 HubSpot이 POST하는 HTTPS 엔드포인트를 호스팅하세요. 서명을 검증한 후 변경 사항을 내부 도구에 기록하세요. 웹훅 구독이 필요한 것을 커버하지 않을 때만 폴링하세요.

HubSpot 서비스 키란 무엇이며 사용해야 하나요?

서비스 키는 HubSpot이 2026년 2월 공개 베타로 출시한 계정 수준의 데이터 전용 자격 증명입니다. 데이터만 다루는 서버 사이드 작업을 목표로 합니다. 오늘날의 표준 내부 도구의 경우 프라이빗 앱 액세스 토큰이 여전히 더 안전하고 문서화가 잘 된 기본값입니다. 서비스 키는 정식 출시될 때까지 베타로 취급하세요.

프로덕션 환경에 영향을 주지 않고 HubSpot 통합을 테스트할 수 있나요?

예. HubSpot 개발자 샌드박스를 생성하고 프라이빗 앱 토큰을 해당 샌드박스로 지정하세요. 스코프, 객체 모델, 웹훅 및 rate limits는 프로덕션과 동일하게 작동하므로, 영업 팀이 나중에 정리해야 할 쓰레기 기록을 남기지 않고 테스트 연락처를 생성하고 웹훅을 발생시킬 수 있습니다.

HubSpot 배치 API는 한 번에 얼마나 많은 기록을 받을 수 있나요?

배치 엔드포인트(POST /crm/v3/objects/{objectType}/batch/create 및 그 업데이트 및 upsert 변형)는 요청당 최대 100개의 기록을 허용합니다. 더 큰 페이로드는 100개 단위로 분할하세요. 일부 튜토리얼에서 여전히 인용하는 이전의 "연락처용 10개 기록" 한도는 제거되었으며, 현재는 객체 유형 전반에 걸쳐 100개입니다.

이를 사내에서 구축해야 할까요, 아니면 에이전시를 고용해야 할까요?

동기화가 단방향이고 표준 객체를 사용하며 HubSpot의 연 2회 파괴적 변경을 흡수할 수 있는 소유자가 있는 경우 사내에서 구축하세요. 양방향 동기화, 커스텀 객체 모델링이 필요하거나 유지보수를 담당할 사람이 없을 때는 파트너를 고용하세요. 첫 배포는 쉽습니다. 그後の 1년간의 유지보수가 실제 비용입니다.

태그

hubspot api integrationhubspot private app tokenhubspot webhooksnodepython

이 기사 공유하기

관련 글

더 많은 글 보기 web-development

web-development
Jun 20, 2026

소규모 기업을 위한 12가지 Salesforce 대안 (2026) — 그중 8개는 다른 곳에서는 찾아볼 수 없습니다

검증된 2026년 가격, 구매 시나리오별 결정 흐름도, 그리고 누가 Salesforce를 계속 사용해야 하는지에 대한 솔직한 분석을 포함한 소규모 기업용 Salesforce 대안 12가지의 중립적인 요약입니다.

11 min read 분 읽기
읽어보기
web-development
Jun 13, 2026

스타트업을 위한 최고의 오픈소스 CRM 7선 (셀프 호스팅, 2026년 테스트 완료)

실제 VPS에 7가지 오픈소스 CRM을 셀프 호스팅하여 GitHub 스타 수, 라이선스, API, 그리고 코드 확장 가능성에 따라 순위별로 평가했습니다. Twenty, EspoCRM, SuiteCRM, Odoo, Krayin 등 2026년 스타트업에 적합한 솔루션들을 비교 분석했습니다.

14 min read 분 읽기
읽어보기
web-development
Jun 13, 2026

소규모 제조업을 위한 최고의 ERP 시스템 7선 (2026, 리셀러 과장 광고 없음)

스프레드시트와 퀵북스(QuickBooks)로는 한계에 부딪혔나요? 실제 2026년 USD 가격, 프로필별 시스템 선택 가이드, 그리고 맞춤형 개발이 필요한 시기를 솔직하게 비교 분석했습니다. 리셀러의 이해관계는 배제했습니다.

14 min read 분 읽기
읽어보기
모든 글 보기
프로젝트 시작하기

새로운 것을 만들 준비가 되었다면 특별함은?

여러분의 비전을 현실로 만들어 보세요. 차이를 만드는 소프트웨어, 우리 팀이 함께 만들겠습니다.

30분 스코핑 미팅 예약프로젝트 보기

라이브러리에서 인기 있는 도구

Claude 스킬

전체 보기
  • New Post

    Full SEO blog pipeline: research, brief, write, validate, image, translate, publish to Sanity. Autonomous from start to finish.

  • Content Refresh

    Audit a stale post, find decay drivers, and ship a SERP-aligned refresh without losing existing rankings.

  • SEO Audit

    Site-wide SEO audit with prioritized fix list: technical, on-page, and EEAT signals.

AI 자동화

전체 보기
  • Security Auditor

    Weekly SCA + IaC scan with prioritized fix PRs.

  • Cold Email Writer

    Generates first-touch emails grounded in one specific public detail.

  • Lead Research Agent

    Enrich an email into a profile, score fit, alert in Slack.

라이브러리에서 인기 있는 도구

Claude 스킬

전체 보기
  • New Post

    Full SEO blog pipeline: research, brief, write, validate, image, translate, publish to Sanity. Autonomous from start to finish.

  • Content Refresh

    Audit a stale post, find decay drivers, and ship a SERP-aligned refresh without losing existing rankings.

  • SEO Audit

    Site-wide SEO audit with prioritized fix list: technical, on-page, and EEAT signals.

AI 자동화

전체 보기
  • Security Auditor

    Weekly SCA + IaC scan with prioritized fix PRs.

  • Cold Email Writer

    Generates first-touch emails grounded in one specific public detail.

  • Lead Research Agent

    Enrich an email into a profile, score fit, alert in Slack.

서비스

  • 엔터프라이즈 솔루션
  • 모바일 앱
  • 웹 애플리케이션

솔루션

  • CRM 시스템
  • AI 통합
  • ERP 솔루션
  • 음성 에이전트
  • 프로세스 자동화
  • 사이버 보안

라이브러리

  • 블로그
  • 포트폴리오

커뮤니티

  • AI 자동화
  • Claude 스킬

도구

  • 모바일 앱 비용 계산기
  • OpenAI / LLM API 비용 계산기
  • MVP 비용 계산기
  • 음성 AI 에이전트 비용 계산기

회사 소개

  • 소개
  • 파트너
  • 문의하기

법적 고지사항

  • 개인정보 처리방침
  • 서비스 약관
  • 쿠키 정책

서비스

  • 엔터프라이즈 솔루션
  • 모바일 앱
  • 웹 애플리케이션

솔루션

  • CRM 시스템
  • AI 통합
  • ERP 솔루션
  • 음성 에이전트
  • 프로세스 자동화
  • 사이버 보안

라이브러리

  • 블로그
  • 포트폴리오

커뮤니티

  • AI 자동화
  • Claude 스킬

도구

  • 모바일 앱 비용 계산기
  • OpenAI / LLM API 비용 계산기
  • MVP 비용 계산기
  • 음성 AI 에이전트 비용 계산기

회사 소개

  • 소개
  • 파트너
  • 문의하기
법적 고지사항개인정보 처리방침서비스 약관쿠키 정책
TECHSY
© 2026 Techsy. 무단전재 및 재배포 금지.