Test Data
Prerequisites
- Onboarded portal with
portalIdactive.- Test company provided by Fabrick (in SANDBOX) with cash account "shortcut" to the portal account, to allow end-to-end verification (investment → campaign closure → cashout).
Common headers
Authorization: Bearer ACCESSTOKENSANDBOX
X-Portal-Id: PORTAL_ID
Content-Type: application/json
1) Create Campaign
curl -X POST https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/campaigns \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTAL_ID>" \
-H "Content-Type: application/json" \
-d '{
"companyId": "USR03VRXZ1726000668",
"name": "Test Campaign E2E",
"description": "Integration test campaign",
"targetAmountMin": 100000,
"targetAmountMax": 120000,
"currency": "EUR",
"expectedClosingDate": "2026-02-28",
"portalSuccessFee": {
"fixedAmount": 1200,
"variableAmountPercentage": 0.15
}
}'
Notes:
companyIdis issued by Fabrick after the test company has been onboarded.portalSuccessFee(v4.0) optional: used to deduct fees at the time of cashout.
2) Open Campaign (OPEN status)
curl -X PUT https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/campaigns/<CAMPAIGNID>/open \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
An open campaign allows the creation of investment orders.
3) Create Investor
curl -X POST https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/investors \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>" \
-H "Content-Type: application/json" \
-d '{
"name": "Mario",
"surname": "Rossi",
"businessName": null,
"fiscalCode": "RSSMRA81L04A859O",
"type": "NATURALPERSON",
"address": "Via dei Fori Imperiali, 34",
"postalCode": "00100",
"city": "Roma",
"country": "Italia",
"email": "mario.rossi@example.it",
"phone": "+393471234567"
}'
- Both natural person investors (
NATURAL_PERSON) and legal entities (LEGAL_PERSON) are supported.
4) Create Order
curl -X POST https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/orders \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>" \
-H "Content-Type: application/json" \
-d '{
"investorId": "<INVESTORID>",
"companyId": "USR03VRXZ1726000668",
"campaignId": "<CAMPAIGNID>",
"investorAccount": {
"iban": "IT08I0129518672180944821099",
"holderName": "Mario",
"holderSurname": "Rossi",
"holderBusinessName": null
},
"totalAmount": 1100,
"orderAmount": 1000,
"feeAmount": 100,
"currency": "EUR",
"channel": "MONEYTRANSFER",
"description": "Order TEST-E2E",
"portalOrderCode": "TEST-E2E-001",
"portalOrderDatetime": "2026-02-03T14:15:12.234Z",
"portalInvestorCode": "RSSMRA81L04A859O",
"portalCompanyCode": "CMP-TST",
"portalCampaignCode": "CMP-TST-2026"
}'
totalAmount = orderAmount + feeAmount(required).channelcan beMONEY_TRANSFERor card; the example uses bank transfer.- The response contains
orderId, which you will use in the next steps.
5) Set Order to WAITING (awaiting payment)
curl -X PUT https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/orders/<ORDERID>/waiting \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
This step prepares the system to receive the money-in; it is typical for payments via bank transfer or authorized cards.
6) (SANDBOX) Simulate Money-In and Verify Payment Status
In SANDBOX, the test setup connects the test company's cash account to the portal account. After generating a consistent money-in (amount and reference
orderId), verify the results with the order's payment endpoints.
Retrieve order money-outs:
curl -X GET "https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/orders/<ORDERID>/payment/moneyouts" \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
Example payload:
{
"moneyoutId": "MO181951400555230W9V5001485",
"companyId": "USR02KZLN1827000201",
"status": "AVAILABLE",
"amount": 810.68,
"cashoutAvailableAmount": 810.68,
"currency": "EUR",
"createdDatetime": "2019-05-30T18:51:40.000Z",
"executedDatetime": null
}
This information confirms the routing of the orderAmount to the campaign account and (if applicable) of the fee to the portal fee account.
Retrieve any order refund:
curl -X GET "https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/orders/<ORDERID>/payment/refund" \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
Example payload:
{
"refundId": "MB0287617555553OEKR12000041",
"status": "EXECUTED",
"createdDatetime": "2018-06-28T02:26:28.000Z",
"executedDatetime": "2018-06-28T06:00:25.000Z",
"amount": 40,
"currency": "EUR"
}
Refunds are generated automatically in the expected cases (order cancelled after accounting, FAIL campaign finalization).
7) Close Campaign (CLOSED status)
curl -X PUT https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/campaigns/<CAMPAIGNID>/closed \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
Closing does not move funds per se, but prevents new orders. WAITING orders can still receive money-in.
8) SUCCESS Finalization (cashout + refunds)
When the campaign has reached at least targetAmountMin, invoke the SUCCESS finalization specifying:
ordersToExecute: orders to be aggregated in the cashout (required, ≥1)ordersToUndo: orders to be refunded (optional)orderToSplit: any orders to be split in order to comply exactly with the minimum threshold
curl -X PUT https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/campaigns/<CAMPAIGNID>/finalize/success \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>" \
-H "Content-Type: application/json" \
-d '{
"ordersToExecute": [
"TRX4387623841827947",
"TRX4387623841827124"
],
"ordersToUndo": [
"TRX2309823841827364"
],
"orderToSplit": {
"orderId": "TRX2309823842182736",
"companyAmountToExecute": 600,
"companyAmountToUndo": 400,
"feeAmountToExecute": 60,
"feeAmountToUndo": 40
}
}'
- If a portal success fee is defined, it will be deducted from the total before cashout to the company.
- The call returns a
cashoutIdto view the cashout details.
Retrieve cashout details:
curl -X GET https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/campaigns/cashouts/<CASHOUTID> \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
9) FAIL Finalization (full refund)
If the campaign has not reached targetAmountMin, invoke the FAIL finalization:
curl -X PUT https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/campaigns/<CAMPAIGNID>/finalize/failure \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTALID>"
The effect is the refund of all subscribed orders; refunds are sent via the same channel as the money-in (card → card reversal, bank transfer → return transfer).
10) Special Cases: Unidentified Transfers
Recovery of "unidentified transfers" list (e.g., transfers without orderId, incorrect orderId, or inconsistent totalAmount). These are automatically rejected and returned to the sender.
curl -X GET https://api.sandbox.fabrick.com/equity-crowdfunding/v4.0/unidentified-transfers \
-H "Authorization: Bearer <ACCESSTOKENSANDBOX>" \
-H "X-Portal-Id: <PORTAL_ID>"
Example payload:
{
"unidentifiedTransferId": "UTR170309AHMC07172815000001",
"amount": 120,
"currency": "EUR",
"description": "TRXWRONGID",
"payerName": "John Doe",
"status": "RECEIVED",
"type": "UNIDENTIFIED",
"receivedDatetime": "2019-06-24T09:39:19Z",
"refundedDatetime": null
}
Tips for Performing Tests
- Plan tests: test company availability is limited (one per week). Coordinate the team to meet the useful window.
- Data consistency: make sure that
totalAmount,orderAmount,feeAmount, andchannelare consistent between order and payment; avoid generating "unidentified transfers." - Post-payment checks: consult
moneyouts,refund, and cashout details to validate the entire flow.