> ## Documentation Index
> Fetch the complete documentation index at: https://docs.corrily.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update subscription

> Notify Corrily that a subscription has changed.

<Warning>
  <h3>Custom payment gateway integrations only</h3>

  You do not need to use this endpoint if you have [granted Corrily automated access](../payment-gateways/integration-guide#recommended-provide-automated-access-of-subscription-and-charge-events) to your payment gateway's subscription and charge events.
</Warning>

## Path Params

<ParamField path="origin" type="string" required>
  The payment gateway that handled the subscription. Accepted values: `stripe`,
  `paypal`, `chargebee`
</ParamField>

<ParamField path="origin_id" type="string" required>
  A unique identifier for the subscription. This can be the ID that the payment
  gateway assigned to the subscription.
</ParamField>

<ParamField path="user_id" type="string" required>
  The [User ID](../users/user-ids) that you provided when you [created the
  subscription](./create-subscription).
</ParamField>

## Body Params

<ParamField body="amount" type="float">
  The amount (price) of the subscription.
</ParamField>

<ParamField body="cancel_at" type="integer">
  A 10-digit (seconds) [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time)
  indicating when the subscription will be canceled. In other words, the
  customer will no longer have access to your service after this time. This
  parameter should only be provided when `status` is set to `canceled`.
</ParamField>

<ParamField body="canceled_at" type="integer">
  A 10-digit (seconds) unix timestamp indicating when customer expressed their
  intent to cancel. This parameter should only be provided when `status` is set
  to `canceled`.
</ParamField>

<ParamField body="created" type="integer">
  A 10-digit (seconds) [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time)
  indicating when the subscription was created. This timestamp should represent
  when the subscription was initialized, regardless of the status of the
  subscription during the initialization. It's rare to need to update created
  after initially setting it.
</ParamField>

<ParamField body="currency" type="string">
  The three-letter ([ISO
  4217](https://en.wikipedia.org/wiki/ISO_4217#Active_codes)) currency code.
</ParamField>

<ParamField body="status" type="string">
  The status of the subscription. Accepted values: `pending`, `trialing`,
  `active`, `canceled`
</ParamField>

<ParamField body="trial_start" type="integer">
  A 10-digit (seconds) [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time)
  indicating when the trial subscription begins. This parameter should only be
  provided when `status` is set to `trialing`.
</ParamField>

<ParamField body="trial_end" type="integer">
  A 10-digit (seconds) [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time)
  indicating when the trial subscription ends. This parameter should only be
  provided when `status` is set to `trialing`.
</ParamField>

<ResponseExample>
  ```json Example theme={null}
  {
    "message": "[dev=False] subscription record was written.",
    "success": true,
    "record": {
      "origin": "stripe",
      "type": "subscription",
      "latest_event_timestamp": 1628609045,
      "latest_event_id": "corrily_evt_1628609045",
      "corrily_product_id": 122,
      "org_id": 97,
      "origin_id": "o123",
      "user_id": "u123",
      "created": null,
      "interval": "month",
      "interval_count": 1,
      "status": "active",
      "cancel_at": null,
      "canceled_at": null,
      "trial_start": null,
      "trial_end": null,
      "currency": null,
      "amount": null,
      "amount_usd": null,
      "amount_usd_monthly": null
    }
  }
  ```
</ResponseExample>

<RequestExample>
  ```bash Bash theme={null}
  curl --request POST \
       --url https://client.corrily.com/v1/subscriptions/user_id/origin/origin_id \
       --header 'Accept: application/json' \
       --header 'Content-Type: application/json' \
       --data '
  {
       "amount": 0,
       "cancel_at": 0,
       "canceled_at": 0,
       "created": 0,
       "currency": "string",
       "status": "string",
       "trial_start": 0,
       "trial_end": 0
  }
  '
  ```

  ```js Node theme={null}
  const fetch = require("node-fetch");

  const url =
    "https://client.corrily.com/v1/subscriptions/user_id/origin/origin_id";
  const options = {
    method: "POST",
    headers: { Accept: "application/json", "Content-Type": "application/json" },
    body: JSON.stringify({
      amount: 0,
      cancel_at: 0,
      canceled_at: 0,
      created: 0,
      currency: "string",
      status: "string",
      trial_start: 0,
      trial_end: 0,
    }),
  };

  fetch(url, options)
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch((err) => console.error("error:" + err));
  ```

  ```python Python theme={null}
  import requests

  url = "https://client.corrily.com/v1/subscriptions/user_id/origin/origin_id"

  payload = {
      "amount": 0,
      "cancel_at": 0,
      "canceled_at": 0,
      "created": 0,
      "currency": "string",
      "status": "string",
      "trial_start": 0,
      "trial_end": 0
  }
  headers = {
      "Accept": "application/json",
      "Content-Type": "application/json"
  }

  response = requests.post(url, json=payload, headers=headers)

  print(response.text)
  ```
</RequestExample>
