---
title: "Sync Paddle Subscription"
method: POST
path: "/api/users/{user_id}/paddle-sync-subscription"
---

# Sync Paddle Subscription

`POST /api/users/{user_id}/paddle-sync-subscription`

## Request

- Base URL: `https://api.adplug.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.adplug.app/api/users/{user_id}/paddle-sync-subscription`
- Auth: HTTP bearer

Browser-triggered subscription sync.

The dashboard calls this from Paddle.js's `checkout.completed` callback so
the user sees their new tier instantly — no need to wait for the webhook
to round-trip through Paddle's servers. We re-fetch the canonical
subscription from Paddle's API (don't trust the browser payload alone),
then route through the same handler the webhook uses. Idempotency at the
handler layer means a later webhook for the same subscription is a no-op.

Accepts `{ "subscription_id": "sub_..." }` or `{ "transaction_id": "txn_..." }`.

## Path parameters

- `user_id` string, required

## Request body

- object

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/adplug/apis/adplug-api.md) · [All operations](https://skmtc.dev/adplug/apis/adplug-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adplug/apis/adplug-api/revisions/47dbef2d7c84?raw)
