Skip to content
ContentRemovalDeskDocumentation

Build your integration

Paid legal escalation

Select eligible CRD cases, review grouped site prices and bulk discounts, then follow payment and legal work.

REST API · JSONv0.8.0 · Live CRD integration
On this page

Start from CRD’s escalation queue

List the creator’s cases and offer selection only when case.escalation.eligible is true. CRD selects leaks with status Besoin d’escalade. Ordinary findings, removed content and impersonation accounts cannot be purchased as legal escalations.

escalation.reason explains why a case is unavailable. escalation_mandate_required means the agency must complete its existing general escalation mandate in the portal. This is separate from the creator’s normal authorization. Current creator eligibility and agency ownership are still required. Base amounts are estimates before basket grouping; always obtain a quote.

Quote one grouped selection

POST /v1/escalation-quotes with 1–100 distinct case_ids from one workspace. A selection may span creators in that agency. CRD reloads the native records and returns a 15-minute quote with grouped site lines, subtotal, volume discount, optional promotion discount, total and currency. Values are EUR cents. Quoting does not charge a card.

Display the returned total before asking the manager to continue. Use CRD’s returned prices; do not calculate a parallel price table in your application. Optional promo_code accepts active unrestricted percentage promotions. Fixed-amount and redemption-limited promotions are not supported.

How the bulk discount works

URLs on the same CRD site group are charged once within one purchase, including a selection across creators. Sites are sorted by base price, highest first. Discounts apply to each site’s position, not the whole basket.

At the current default EUR 800 site price: three URLs on one site cost EUR 800. Three distinct default-price sites cost EUR 2,320: 800 + 800 + 720. Use the live quote because some sites have different base prices. This concerns paid legal escalations only.

Site positionDiscount on that site
1–20%
3–410%
5–920%
10–1430%
15+35%

Create checkout after price review

POST /v1/escalation-quotes/{id}/checkout with an empty object and a stable Idempotency-Key. The response starts queued. Eligibility, signed mandate, case ownership and the frozen price are checked again before one durable order is reserved. Changed data requires a fresh quote and another review.

Poll GET /v1/escalation-requests/{id}. ready means a real hosted Stripe payment_link is available. Send the payer to that link. The API never accepts a caller-defined price and cannot mark up CRD’s payment. For uncertain results, keep the original request and idempotency key.

The older POST /v1/cases/{id}/escalation-requests remains available for single cases under the same eligibility checks. Separate single-case purchases do not combine sites or receive a basket discount.

Track payment and legal work separately

CRD reconciles payments independently of agency API access. payment exposes the latest verified Stripe state, refunded_amount_cents, dispute_status and checked_at. Refunded, partially_refunded and disputed requests emit escalation.status_changed; existing legal work is retained. Processing payments must not be paid again. External cancellations and expired checkouts release unpaid reservations.

paid means CRD recorded the verified Stripe payment. workflow contains the native legal-work status for each purchased creator/URL, with its updated_at time. It does not include private case notes, legal documents or recipient contacts. case_ids identifies the full selection; case_id and creator_id refer to its first case and creator.

escalation.status_changed is emitted when payment state or observed workflow changes. Refresh the request after receiving it. A Stripe redirect is never payment proof. An expired unpaid checkout becomes failed with escalation_checkout_expired and releases the reserved cases. Create and review a fresh quote for a new purchase.

StatusMeaning
queuedAccepted; awaiting dispatch.
readyStripe checkout is available; payment is not yet recorded.
paidPayment recorded. Consult workflow for the actual legal work.
dispatching / uncertainDispatch or recovery in progress. Keep the original request identity.
attention_requiredCRD must reconcile this purchase before another is attempted.
failedA definite rejection or expired checkout. Read error_code.

Request & response example

POST/v1/escalation-quotes
curl --request POST 'https://api.crd.systems/v1/escalation-quotes' \
  --header "Authorization: Bearer $CRD_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "case_ids": [
    "case_example"
  ]
}'
Use your secret key in the environment variable.
Example response · 201
{
  "id": "66666666-6666-4666-8666-666666666666",
  "case_ids": [
    "case_example"
  ],
  "expires_at": "2026-09-22T00:15:00.000Z",
  "expired": false,
  "pricing": {
    "currency": "eur",
    "site_count": 1,
    "subtotal_cents": 80000,
    "volume_discount_cents": 0,
    "promo_discount_cents": 0,
    "total_cents": 80000,
    "lines": [
      {
        "site": "example.invalid",
        "leak_ids": [
          "55555555-5555-4555-8555-555555555555"
        ],
        "base_amount_cents": 80000,
        "discount_percent": 0,
        "amount_cents": 80000
      }
    ]
  },
  "mandate_status": "signed"
}

Illustrative response. Replace example resource IDs with the IDs returned by your API requests. View endpoint details.