# LINE Setup

This page covers constructing the `core/line` bot, exposing its webhook, and the `Input` your handler receives.

## Constructor and options

```go
bot, err := line.New(channelSecret, channelAccessToken, "8080",
    line.WithPath("/hooks/line"),
)
```

| Argument | Rule |
|---|---|
| `secret` | Channel secret; used to verify webhook signatures. Empty → `secret is required` |
| `token` | Channel access token. Empty → `token is required` |
| `port` | Listen port; the server binds `:<port>` on every interface. Empty → `port is required` |
| `WithPath(path)` | Webhook path; default `/linebot/webhook`. An empty `path` keeps the default |

`New` builds the client with the legacy `linebot` package of `line-bot-sdk-go/v8` and does not start the server.

## Public HTTPS endpoint

Unlike Telegram and Discord, LINE pushes events to you. Set the webhook URL in the LINE Developers Console to a public HTTPS address that forwards to `http://<host>:<port><path>`. For local testing use a tunnel such as ngrok.

`Start(ctx)` calls `GetBotInfo` to validate the token, binds the port synchronously (a port already in use is returned as an error), and serves in a goroutine.

## Webhook handling

| Situation | HTTP response |
|---|---|
| Signature check fails (`ErrInvalidSignature`) | 400 |
| Body cannot be parsed | 500 |
| Bot not running | 503 |
| Events handled | 200, after every event in the request has been processed |

Events in one request are handled one after another under a shared 30-second context. LINE expects a quick 200, so keep slow work out of the handler or move it to a goroutine and use `Send` afterwards.

## Input

| Field | Content |
|---|---|
| `SourceType` | `user`, `group`, or `room` |
| `UserID` / `GroupID` / `RoomID` | Source IDs; set according to `SourceType` |
| `Username` | Sender's display name, fetched with `GetProfile`, `GetGroupMemberProfile`, or `GetRoomMemberProfile`; `""` if the call fails or `UserID` is empty |
| `ReplyToken` | One-time reply token; consumed by the automatic reply when the handler returns non-empty text |
| `MessageID` | ID of the message (all types); pass it to `Save` for media |
| `MessageType` | `text`, `image`, `video`, `audio`, or `file` |
| `Text` | Text messages only |
| `FileName` | File messages only |
| `Raw` | `*linebot.Event` |

LINE events do not carry a display name, so each message costs one profile API call before the handler runs.

## Related pages

- [LINE Messages](/line-messages)
- [Saving Media](/media-save)
- [LINE API](/api-reference-line)
