---
title: "Send a paid message via tip"
method: POST
path: "/v1/tip/message"
tags: ["tipping"]
---

# Send a paid message via tip

`POST /v1/tip/message`

Send a tip that delivers a message to the recipient via email. The recipient must have a Grove account with an email identity. All accounts accept paid messages by default (`tip_to_talk_min=0`). Recipients can set a higher minimum or opt out entirely (`tip_to_talk_min=NULL`). Every tip sent via this endpoint lands with `context.is_paid_message=true` on the resulting `TipContextResponse` — it's a server-owned signal (the route writes it unconditionally) that feed / activity consumers can use to render "X messaged Y" without re-deriving intent from the tip amount.

## Headers

- `authorization` string, nullable — Bearer JWT that identifies the sending account.

## Request body

- TipMessageRequest — Request body for sending a paid message via tip.
  - `destination` string, required — Who to message. Accepts the same formats as /tip: Grove handle, EVM/Solana address, ENS name, domain, or social URL.
  - `amount` string, required — Amount to tip. Same formats as /tip: '5', '$5', '5USDC'.
  - `message` string, required — Message to deliver to the recipient (1-840 characters).
  - `network` string, nullable — Target blockchain network.
  - `token` string, nullable — Token symbol to tip.
  - `context` TipContext — Optional social graph context for tip attribution (API request model). Used in TipRequest.context and as query params in the tip endpoint. Lives in models/api.py because it defines API schema, not business logic. Captures: - Where the tip originated (source post URL) - Who sent the tip (sender's social identity) - Additional recipient context - Campaign/attribution tracking
    - `source_post_url` string, nullable — URL of the post/tweet where this tip was triggered
    - `sender_username` string, nullable — Sender's username on the social platform
    - `sender_platform` 'x' | 'twitter' | 'reddit' | 'github' | 'tiktok' | 'discord' | 'telegram' | 'farcaster' | 'lens' | 'substack' | 'youtube' | 'website' | 'instagram' | 'linkedin' | 'medium' | 'soundcloud' | 'twitch' | 'bluesky' | 'facebook' | 'spotify' | 'pinterest' | 'patreon' | 'grove' | 'other' | 'custom' — Social platforms for context attribution in tips. This enum defines WHERE a tip originated from (the sender's platform context), not where the tip is going. For destination types, see DestinationKind. Used in TipContext to track: - sender_platform: Which platform the tipper used (Twitter bot, Discord bot, etc.) - Attribution/analytics for understanding tip sources Note: "x" is the canonical name for Twitter/X. Both "x" and "twitter" are accepted on input, but "x" is used for storage and output. Use normalize_platform() to convert "twitter" → "x". Inherits from str so values serialize naturally to JSON.
    - `sender_profile_url` string, nullable — URL to the sender's profile
    - `recipient_username` string, nullable — Recipient's username on the social platform
    - `recipient_profile_url` string, nullable — URL to the recipient's profile
    - `campaign` string, nullable — Campaign or initiative identifier
    - `referrer` string, nullable — Referrer or source identifier
    - `custom_metadata` string, nullable — Custom metadata string (max 250 characters)
    - `discrete_giveaway_id` string, nullable — Giveaway UUID when this tip is an explicit, user-driven entry via the /giveaways page or a profile's giveaway card. Server-validated. Omit for regular tips (incidental giveaway enrollment still happens automatically for eligible tips — this flag is only about user intent).

## Response `200`

Successful Response

- TipResponse — Response model for successful tip
  - `tip_id` string, required
  - `status` string, required
  - `destination` string, required
  - `from_address` string, required
  - `receiver_address` string, required
  - `amount_sent` string, required
  - `amount_received` string, required
  - `fee_amount` string, required
  - `tx_hash` string, required
  - `new_balance` string, required
  - `network` string, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/grove/apis/grove-api.md) · [All operations](https://skmtc.net/grove/apis/grove-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/grove/grove-api/revisions/f286b48a8105/schema)
