Table of Contents
- Overview
- Authentication
- Request body
- Reserved parameter keys
- Responses
- Example — Delphi
- Example — Postman
- Example — Bruno
- Example — curl
Overview
Trigger report printing programmatically by posting a JSON payload to the Articles local webhook listener. Useful for integrating with external applications, schedulers, or custom Delphi/VCL hosts.
Endpoint: POST http://localhost:3000/webhook
Authentication
Every request must include the X-Webhook-Secret header matching the secret configured in Articles settings. Requests without a valid secret are rejected with 401.
| Header | Value |
|---|---|
Content-Type |
application/json |
X-Webhook-Secret |
Your secret GUID from Articles settings |
Request body
Send a JSON object with the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
ReportFileName |
string | Yes | Full path to the .fr3 report file on the server machine. |
Parameters |
object | No | Key/value pairs injected as report variables. All values must be strings. |
Reserved parameter keys
These keys inside Parameters control print behaviour and are applied before the report runs. All values are passed as strings.
| Key | Description | Example value |
|---|---|---|
PrintOptions_Copies |
Number of copies to print. Default: 1. | "2" |
PrintOptions_Printer |
Printer display name. Defaults to the Windows default printer. | "Zebra ZT230" |
PrintOptions_PageRange |
"all" or "range". Default: "all". |
"range" |
PrintOptions_FromPage |
Start page when PrintOptions_PageRange is "range". |
"2" |
PrintOptions_ToPage |
End page when PrintOptions_PageRange is "range". |
"5" |
PrintOptions_Collate |
Collate copies. Pass "true" to enable. |
"true" |
Responses
| Status | Meaning |
|---|---|
200 |
Report queued and printed successfully. |
401 |
Missing or invalid X-Webhook-Secret. |
404 |
Report file not found at the specified path. |
500 |
Articles encountered an internal error running the report. |
Example — Delphi
procedure TForm1.SendWebhook;
var
Client: THTTPClient;
Params: TJSONObject;
JSON: TJSONObject;
Body: TStringStream;
Resp: IHTTPResponse;
begin
Client := THTTPClient.Create;
JSON := TJSONObject.Create;
try
JSON.AddPair('ReportFileName',
'C:\ProgramData\Articles\Reports\Label_2x1.fr3');
Params := TJSONObject.Create;
Params.AddPair('PrintOptions_Copies', '2');
Params.AddPair('PrintOptions_Printer', 'Zebra ZT230');
Params.AddPair('StartDate', '2026-01-01');
Params.AddPair('CompanyName', 'Acme Corp');
JSON.AddPair('Parameters', Params);
Body := TStringStream.Create(JSON.ToJSON, TEncoding.UTF8);
try
Resp := Client.Post(
'http://localhost:3000/webhook',
Body,
nil,
[
TNameValuePair.Create('Content-Type', 'application/json'),
TNameValuePair.Create('X-Webhook-Secret',
'32F81205-ED2A-4D4C-B719-12F5A2D61012')
]
);
if Resp.StatusCode = 200 then
ShowMessage('Report sent to printer.')
else
ShowMessage('Error ' + IntToStr(Resp.StatusCode)
+ ': ' + Resp.ContentAsString);
finally
Body.Free;
end;
finally
JSON.Free;
Client.Free;
end;
end;
Example — Postman
Save the JSON below as a .json file and import via File → Import in Postman.
{
"info": {
"name": "Articles Webhook",
"_postman_id": "articles-webhook-v1",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Print report - 2 copies",
"request": {
"method": "POST",
"header": [
{ "key": "Content-Type", "value": "application/json" },
{ "key": "X-Webhook-Secret", "value": "32F81205-ED2A-4D4C-B719-12F5A2D61012" }
],
"body": {
"mode": "raw",
"raw": "{\n \"ReportFileName\": \"C:\\\\ProgramData\\\\Articles\\\\Reports\\\\Label_2x1.fr3\",\n \"Parameters\": {\n \"PrintOptions_Copies\": \"2\",\n \"PrintOptions_Printer\": \"Zebra ZT230\",\n \"StartDate\": \"2026-01-01\",\n \"CompanyName\": \"Acme Corp\"\n }\n}",
"options": { "raw": { "language": "json" } }
},
"url": {
"raw": "http://localhost:3000/webhook",
"protocol": "http",
"host": ["localhost"],
"port": "3000",
"path": ["webhook"]
}
}
}
]
}
Example — Bruno
Save the text below as print-report.bru inside your Bruno collection folder.
meta {
name: Print report - 2 copies
type: http
seq: 1
}
post {
url: http://localhost:3000/webhook
body: json
auth: none
}
headers {
Content-Type: application/json
X-Webhook-Secret: 32F81205-ED2A-4D4C-B719-12F5A2D61012
}
body:json {
{
"ReportFileName": "C:\\ProgramData\\Articles\\Reports\\Label_2x1.fr3",
"Parameters": {
"PrintOptions_Copies": "2",
"PrintOptions_Printer": "Zebra ZT230",
"StartDate": "2026-01-01",
"CompanyName": "Acme Corp"
}
}
}
Example — curl
Run from a Windows Command Prompt:
curl -X POST http://localhost:3000/webhook ^
-H "Content-Type: application/json" ^
-H "X-Webhook-Secret: 32F81205-ED2A-4D4C-B719-12F5A2D61012" ^
-d "{\"ReportFileName\":\"C:\\ProgramData\\Articles\\Reports\\Label_2x1.fr3\",\"Parameters\":{\"PrintOptions_Copies\":\"2\",\"PrintOptions_Printer\":\"Zebra ZT230\",\"StartDate\":\"2026-01-01\",\"CompanyName\":\"Acme Corp\"}}"
Note: All parameter values — including numeric ones like PrintOptions_Copies — must be sent as JSON strings, not numbers. Articles converts them internally.