Make
Call Curva from a Make scenario and route bundles on the typed answer with a Router.
1. Build the request body
Section titled “1. Build the request body”Mapped text can hold quotes and newlines, so build the body with JSON → Create JSON rather
than typing JSON around mapped values. Create a data structure with the request fields (or paste
the example below into the structure generator), then map your trigger’s fields into state:
{ "project": "support", "state": {"subject": "…", "body": "…"}, "questions": { "department": { "type": "choice", "instructions": "Which team should handle this", "options": {"billing": "Payments, refunds", "technical": "Bugs", "sales": "Pricing"}, "min_confidence": 0.8 }, "refund": {"type": "noul", "instructions": "The customer explicitly asks for a refund"} }}2. Call /v1/decide
Section titled “2. Call /v1/decide”Add HTTP → Make a request:
| Field | Value |
|---|---|
| URL | https://curva.example.com/v1/decide |
| Method | POST |
| Headers | Authorization = Bearer curva_… |
| Body type | Raw, content type JSON (application/json) |
| Request content | the JSON string output of step 1 |
| Parse response | Yes |
Run it once so Make learns the response shape. The answers are then mappable as
Data → answers → department → choice, … → confidence, … → abstain,
Data → answers → refund → noul, and the decision id as Data → id.
3. Route on the answer
Section titled “3. Route on the answer”Add a Router after the HTTP module, with a filter on each route:
| Route | Filter |
|---|---|
| Human review | answers.department.abstain — Boolean operators: Equal to — true |
| Billing | answers.department.choice — Text operators: Equal to — billing |
| Technical | answers.department.choice — Text operators: Equal to — technical |
Make runs every route whose filter passes, so give the choice routes a second condition,
abstain not equal to true, and an unsure answer only reaches the human route. abstain is
set because the question has min_confidence; on that route, create a task for a person. A Noul
is a probability: filter on answers.refund.noul with Numeric operators: Greater than 0.9.
Store Data → id (the decision id) with whatever the scenario creates.
4. Send feedback
Section titled “4. Send feedback”When the true answer is known, send it with another HTTP → Make a request, POST to
https://curva.example.com/v1/feedback, same header, raw JSON body:
{"decision_id": "dec_…", "question": "department", "label": "billing"}From 30 labels for a question, its answers are calibrated whenever that makes them more accurate. See Calibrate with feedback.
Errors and retries
Section titled “Errors and retries”Curva errors are JSON with a 4xx or 5xx status, which makes the HTTP module fail. Add an error
handler (Break with retries) for 429 (it carries Retry-After) and 502. See the
error list.

