기업회원 신청 서류 안내
신청자 구분에 따라 재직증명서 또는 위임장을 함께 제출해 주세요.
신청자 구분에 따라 재직증명서 또는 위임장을 함께 제출해 주세요.
A PRACTICAL GUIDE
Exchange an accessKey and secretKey for a bearer token, and call the Sendgo API with it. Differences between v1 and v2, token caching, and the 401/403 codes.
POST /api/v2/token이 가이드는 아직 번역되지 않아 English 문서를 표시합니다.
Sendgo authentication is two steps: exchange keys for a token, send with the token.
Most of the time you never need this page — the SDKs handle all of it. It matters when you call REST directly or build a client for a language with no SDK.
An accessKey and secretKey from Integration → Apps in the Sendgo console.
export SENDGO_ACCESS_KEY=your_access_key
export SENDGO_SECRET_KEY=your_secret_key
These carry the full sending permission for the account. Do not commit them. If you already did, revoking and reissuing in the console is the only fix — reverting the commit does not un-leak anything.
Base64-encode accessKey:secretKey and send it as Basic auth.
curl -X POST https://sendgo.io/api/v2/token \
-H "Authorization: Basic $(printf '%s:%s' "$SENDGO_ACCESS_KEY" "$SENDGO_SECRET_KEY" | base64)"
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
Everything after this uses bearer auth, and v1 and v2 differ.
| Version | Header |
|---|---|
| v1 | Authorization: Bearer base64(token) |
| v2 | Authorization: Bearer token |
Forgetting the second encode on v1 gives you a 401. Use v2.
curl -X POST https://sendgo.io/api/v2/notices/send \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"templateCode": "ORDER_CONFIRM_001",
"scheduleType": "DIRECTLY",
"kakaoSenderKey": "your_kakao_sender_key",
"senderKey": "your_sms_sender_key",
"contacts": [{ "contact": "01012345678", "var1": "ORD-001" }]
}'
Pass the keys and stop thinking about it. Issuance, caching, refresh on expiry and the 401/403 retry all happen inside.
import Sendgo from '@sendgo/node';
const sendgo = new Sendgo({
accessKey: process.env.SENDGO_ACCESS_KEY!,
secretKey: process.env.SENDGO_SECRET_KEY!,
apiVersion: 'v2',
});
// No token code. It fetches one on the first send.
from sendgo import Sendgo
client = Sendgo(
access_key=os.environ["SENDGO_ACCESS_KEY"],
secret_key=os.environ["SENDGO_SECRET_KEY"],
api_version="v2",
)
<?php
$sendgo = new Sendgo\Php\Sendgo([
'access_key' => $_ENV['SENDGO_ACCESS_KEY'],
'secret_key' => $_ENV['SENDGO_SECRET_KEY'],
'api_version' => 'v2',
]);
client, err := sendgo.New(sendgo.Config{
AccessKey: os.Getenv("SENDGO_ACCESS_KEY"),
SecretKey: os.Getenv("SENDGO_SECRET_KEY"),
ApiVersion: "v2",
})
Build the client once and reuse it. A new client per request throws away the cached token and fetches a new one every time. The Laravel, Spring and NestJS extensions register a singleton, so they avoid this by construction.
| Code | HTTP | Cause |
|---|---|---|
INVALID_ACCESS_KEY |
401 | Key does not exist, or the secret is wrong |
ACCESS_KEY_NOT_APPROVED |
403 | App is still pending approval |
IP_NOT_ALLOWED |
403 | Called from outside the app's IP allowlist |
IP_NOT_ALLOWED shows up constantly during local development. Leave the allowlist empty on a development app, or add your own IP. For production, check the actual outbound IP — behind a NAT gateway or load balancer it is not the instance IP.
From issuing an access key to sending a Kakao Alimtalk, with working code in Node.js, Python, PHP, Laravel, Java and Go.
Pick the organisation, issue API keys, register sender numbers and templates from a coding agent. Everything except topping up credit works without the console.
Kakao Alimtalk, Kakao Brand Message and SMS/LMS/MMS differ in what content they allow, what they cost and what you must set up first. Which to pick, by situation.
Pick the right Sendgo package for PHP, Laravel, Symfony, WordPress, Node.js, Next.js, NestJS, Python, Django, FastAPI, Java, Spring Boot, Go, Ruby, Rails, .NET, ASP.NET Core or Flutter.
Korean law requires the caller ID to be pre-registered. How to register an SMS sending number and connect a Kakao channel, and where registrations usually get rejected.