Create Payment
Record a MANUAL / EXTERNAL payment (cash, bank transfer, off-platform).
This endpoint NEVER initiates a real charge. payment_type must be external
— any Stripe/processor value (single_session, group_session, package_redemption)
is rejected with 422, because a real charge must flow through the Stripe
PaymentIntent + webhook that keeps session_ledger consistent; the Python
backend does not own money flows.
organization_id and created_at are server-set; stripe_payment_intent_id
is always null. The referenced session_id (and any
student_id/tutor_id) must be org-scoped (404 otherwise). Honours
Idempotency-Key.
Authorizations
Org API key as Token token=ei_live_...
Headers
Body
POST /v1/payments → session_payments. MANUAL / EXTERNAL payments ONLY.
payment_type is restricted to 'external' — this endpoint NEVER initiates a
real charge. Stripe/processor payment_types (single_session, group_session,
package_redemption) are rejected with 422 because the Python backend does not
own money flows: a real charge must go through the Stripe PaymentIntent +
webhook that drives session_ledger. The referenced session/student/tutor must
be org-scoped.
Cents. Must be >= 0.
x >= 0Only 'external' is accepted (manual/off-platform). Stripe types are rejected.
succeeded | pending | failed
Response
Successful Response