# Choose the plan for your free trial

```http
POST https://secure.yoprint.com/v1/api/store/{team_slug}/setting/subscription/plan/select_trial
```

- API version: v1
- Operation ID: `v1_public_setting_subscription_plan_select_trial`
- Section: Team settings › [YoPrint subscription](https://developer.yoprint.com/reference/yoprint-subscription.md)
- Web page: https://developer.yoprint.com/reference/yoprint-subscription/v1-setting-subscription-plan-select-trial/
- Authentication: `Authorization: Bearer YOUR_API_KEY`

Sets which plan's features the team gets during its free trial. Send a `trial_plan_id` from the plan list. It charges nothing.

It works only while the team can still trial: its trial hasn't ended and it has no subscription. Returns your company details.

## Permission

The team owner, or a member with the Manage Billing permission. Manage Settings alone is not enough.

## Side effects

- Changes which features the team has during the trial.

## Path parameters

- `team_slug` (string, required): Your team slug, shown as Team ID next to your API key in Profile. Example `your-team`.

## Request body

Content type `application/json`, required.

Fields:

- `plan_id` (string, required): A `trial_plan_id` from the plan list. At most 191 characters.

### Example request

```bash
curl -X POST 'https://secure.yoprint.com/v1/api/store/your-team/setting/subscription/plan/select_trial' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Accept: application/json' \
  -H 'X-Yoprint-Decimal-Format: exact-v1' \
  -H 'Content-Type: application/json' \
  -d '{
    "plan_id": "starter-trial"
  }'
```

## Response

`200` Successful response.

Fields:

- `data` (object, required)
  - `custom_domain` (string | null, required): The host your customer portal is served on, or null.
  - `id` (string, required)
  - `name` (string, required)
  - `payment_gateway` (array of objects, required): The payment gateways your customers can pay through, with only their public identifiers (for example a Stripe publishable key). Empty when the plan has no payment integration.
  - `plan` (object, required): The team's YoPrint plan.
    - `active` (boolean, required): Whether the plan is active now.
    - `detail` (object, required): With a subscription: `name`, `status`, `active` and `need_to_select_plan`. On a trial or free plan: `id`, `name`, `archive`, `need_to_select_plan`, and on a trial `expire_at` and `status` (`active` or `expired`).
      - `active` (boolean, optional)
      - `archive` (boolean, optional)
      - `expire_at` (string (date-time) | null, optional)
      - `id` (string, optional)
      - `name` (string | null, optional): With a subscription, always `default`; otherwise the trial or free plan's name.
      - `need_to_select_plan` (boolean, optional): True when the team must choose a plan before it can go on.
      - `status` (string | null, optional)
    - `features` (object, required): What the plan allows: features, limits and integrations, keyed by name.
    - `type` (string, required): `paid` with a subscription; otherwise `trial` or `free`. One of: `"paid"`, `"trial"`, `"free"`.
  - `slug` (string, required): The `{team_slug}` in every path.
  - `timezone` (string, required)
  - `channel_id` (integer, optional): The team's number, used by YoPrint's live-update channel.
  - `customer_portal_bg` (string | null, optional): The customer portal background image, or null.
  - `dimension` (string | null, optional): Length unit: `m`, `cm`, `mm` or `in`.
  - `email` (string | null, optional)
  - `favicon_url` (string | null, optional): The customer portal favicon (the icon in the browser tab), or null when none is uploaded.
  - `ga_id` (string, optional): An analytics id: `YxPx` and the team's number (`channel_id`).
  - `logo_url` (string | null, optional)
  - `onboard_status` (string | null, optional)
  - `phone` (string | null, optional)
  - `phone_country` (string | null, optional)
  - `plan_region` (string | null, optional)
  - `printavo_importer_available` (boolean, optional)
  - `printavo_importer_enabled` (boolean, optional)
  - `seeded` (boolean, optional)
  - `tax_number` (string | null, optional)
  - `trial_expires_at` (string (date-time), optional)
  - `website` (string | null, optional)
  - `weight` (string | null, optional): Weight unit: `kg`, `g`, `lbs` or `oz`.
- `status` (integer, required)
- `success` (boolean, required)

Example response:

```json
{
  "data": {
    "channel_id": 1001,
    "custom_domain": "shop.example.com",
    "customer_portal_bg": null,
    "dimension": "in",
    "email": "alex@example.com",
    "favicon_url": null,
    "ga_id": "YxPx1001",
    "id": "OutVLW14xRJYLp",
    "logo_url": "https://example.com/logo.png",
    "name": "Northwind Apparel",
    "onboard_status": null,
    "payment_gateway": [],
    "phone": "+1 201 555 0123",
    "phone_country": "US",
    "plan": {
      "active": true,
      "detail": {
        "archive": false,
        "expire_at": "2026-11-17T00:00:00+00:00",
        "id": "starter-trial",
        "name": "Starter Trial",
        "need_to_select_plan": false,
        "status": "active"
      },
      "features": {
        "user_limit": 3
      },
      "type": "trial"
    },
    "plan_region": "US",
    "printavo_importer_available": false,
    "printavo_importer_enabled": false,
    "seeded": true,
    "slug": "your-team",
    "tax_number": null,
    "timezone": "America/New_York",
    "trial_expires_at": "2026-01-15T00:00:00+00:00",
    "website": "https://example.com",
    "weight": "lbs"
  },
  "status": 200,
  "success": true
}
```

## Errors

- `401` The API key is missing or wrong (`unauthenticated`).
- `403` You are not allowed to do this. `api_access_not_in_plan`: your team's plan doesn't include API access (Pro and above, with an active subscription or trial), so every request answers this until the team upgrades. When your role lacks the permission the operation needs, the body is only `{"message": "Insufficient Permission"}`. Other refusals use the error envelope, with `unauthorized` or `user_is_not_authorized`.
  - When: You are not the owner and your role lacks Manage Billing. The body is `{"message": "Insufficient Permission"}`, without the error envelope. Fix: Use the owner's key, or that of a member with Manage Billing.
- `404` Not found. `page_not_found`: the team slug is unknown, you are not a member of the team, or an id in the path is not one of this team's. `code: null`, with a message that starts "No query results for": there is no record with that id.
- `422` The request was refused and changed nothing. `validation_failed` lists what to fix in `error.fields`; other codes name a business rule, explained in `error.message`. A few checks answer with only `{"message": "..."}`. An operation that calls another service (a payment provider, a carrier, an accounting app) can answer `connect_timeout` ("Please retry again") when that service does not answer in time: the change may or may not have happened there, so read the record back before you retry.
  - When: The plan is not a trial plan you can choose, or the team can no longer trial: `error.code` `invalid_plan`. A missing `plan_id` is `validation_failed`. Fix: Use a `trial_plan_id` from the plan list, or subscribe with checkout.

## Notes

- Part of your YoPrint subscription: what your shop pays YoPrint, not your customers' payments.
- AI apps (MCP connections) can't call this operation: they get 403 `agent_operation_not_available`. Use a personal API key.

## Related

- [List YoPrint plans you can choose](https://developer.yoprint.com/reference/yoprint-subscription/v1-setting-subscription-plan-index.md): `GET /v1/api/store/{team_slug}/setting/subscription/plan`
