---
title: "Create a contribution checkout link"
method: POST
path: "/crowdfund/{id}/checkout"
tags: ["Crowdfunding"]
---

# Create a contribution checkout link

`POST /crowdfund/{id}/checkout`

## Request

- Base URL: `https://www.laboratory.love/api/v1`
- URL: `https://www.laboratory.love/api/v1/crowdfund/{id}/checkout`
- Auth: none required

Write — starts a purchase; treat as sensitive and confirm the product and amount with the person first. Creates a secure Stripe-hosted checkout page for a contribution toward testing one product and returns its URL. This call charges nothing and takes no card details: the person must open `checkout_url` and pay. Success and cancel pages are fixed to laboratory.love. Side effects: creates a Stripe Checkout session (expires after about 24 hours if unused). Use an Idempotency-Key when retrying.

## Path parameters

- `id` string, required

## Headers

- `Idempotency-Key` string

## Request body

- ContributionCheckoutRequest: Contribution request.
  - `amount` integer, required: Whole US dollars, within the product’s contribution range.

## Response `201`

Checkout created; awaiting the person’s payment.

- ContributionCheckout: A created contribution checkout.
  - `checkout_id` string, required: Checkout id for GET /checkouts/{checkout_id}.
  - `checkout_url` string, uri, required: Secure Stripe-hosted payment page for the person to open.
  - `status` 'awaiting_user_payment', required: Always awaiting_user_payment on creation.
  - `requires_user_completion` boolean, required: Always true: nothing is charged until the person pays on checkout_url.
  - `amount` number, required: USD.
  - `currency` 'USD', required: Currency.
  - `expires_at` string, date-time, nullable, required: When checkout_url stops working.
  - `product` object, required: Product being funded.
    - `id` string, required: Product id.
    - `name` string, required: Name.
    - `brand` string, nullable, required: Brand.
    - `amount_remaining_before_contribution` number, required: USD still needed before this contribution.
    - `product_page_url` string, uri, required: Product page.
  - `terms` ContributionTerms, required: Terms to show before a person contributes.
    - `seller` string, required: Merchant of record.
    - `refund_policy` string, required: Refund rules.
    - `what_it_funds` string, required: What the money pays for.
    - `terms_url` string, uri, required: Full terms.
  - `next_step` string, required: What to do next.

## Other responses

- `400`: Invalid input. `error.code` says which rule failed.
- `404`: No such record.
- `409`: The request conflicts with the record’s current state.
- `413`: Request body too large.
- `415`: Body is not JSON.
- `429`: Rate limited. Wait `Retry-After` seconds.
- `502`: The payment provider failed. Nothing was charged.
- `503`: Data source temporarily unavailable. Retry shortly.

---

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