Fetch a signal and what it triggered
curl https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK \ --header 'Authorization: Bearer <token>'requests.get( "https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK", headers={ "Authorization": "Bearer <token>" })fetch('https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK', { headers: { Authorization: 'Bearer <token>' }})using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK");request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
using var response = await client.SendAsync(request);$ch = curl_init("https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer <token>']);
curl_exec($ch);
curl_close($ch);package main
import ( "fmt" "io" "net/http")
func main() { requestUrl := "https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK"
req, _ := http.NewRequest("GET", requestUrl, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://api.pacepayments.ai/v1/signals/sig_01J40FQ2ZK") .get() .addHeader("Authorization", "Bearer <token>") .build();
Response response = client.newCall(request).execute();Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”Successful Response
object
object
A stable person key ON YOUR SIDE. It carries the suppression check, sequence deduplication and access/erasure requests - it MUST denote the same person across every order. An empty or reused value silently merges two people into one.
Everything the agent needs for this conversation.
object
object
object
An exact decimal, as a string - no float drift.
ISO 4217.
Itemisation of the claim.
object
The CREDITOR on whose behalf you are collecting - not your own name. Named to the debtor on first contact and whenever asked.
True when the claim carries an enforcement title (Mahnbescheid, Vollstreckungsbescheid, judgment). It changes what the agent may say about consequences and it extends the limitation period, so it is NEVER inferred.
The written statutory notice you have already sent.
It lets the agent REFER to that notice instead of improvising the disclosure. Whether your calls must carry the disclosure as well is your determination - this field is the record that you have provided it.
Earlier touches, newest last. Capped - send what matters, not half your CRM.
An earlier touch, on ANY channel.
The asymmetry with contacts is deliberate: sms, letter and whatsapp
are allowed here because they record what YOU have already done. contacts
does not know them, because Pace only makes calls. The agent uses the
history for tone and continuity (“we have already written to you twice”).
Your own opaque key-value pairs; mirrored on resources and in every event. CONTRACTUALLY free of personal data - Pace does not inspect the values. Whatever you put here falls outside the deletion and retention machinery that protects the rest of the order.
object
True when dedupe_key matched an earlier signal. This is then the ORIGINAL signal - the repeat triggered nothing again.
Enrollments this signal created, and exit conditions it satisfied.
What this signal set in motion.
While sequence execution is not yet enabled the list is ALWAYS empty. That is not a placeholder but the state of things: with no ladders running, a signal can trigger nothing. It lets you wire up your producer completely and check deduplication against real duplicates BEFORE any of it calls anyone.
Example
{ "subject": { "reference": "CUST-88213", "locale": "de-DE", "timezone": "Europe/Berlin" }, "contacts": [ { "channel": "phone" } ], "context": { "claim": { "outstanding": { "value": "129.90", "currency": "EUR" }, "original": { "value": "129.90", "currency": "EUR" }, "breakdown": { "principal": { "value": "129.90", "currency": "EUR" }, "interest": { "value": "129.90", "currency": "EUR" }, "dunning_fees": { "value": "129.90", "currency": "EUR" }, "collection_fees": { "value": "129.90", "currency": "EUR" }, "expenses": { "value": "129.90", "currency": "EUR" }, "already_paid": { "value": "129.90", "currency": "EUR" } }, "creditor_name": "Truman Textilien GmbH", "basis": { "description": "Jahresabo Textilpflege Premium, abgeschlossen am 12.06.2025" }, "titled": false }, "history": [ { "direction": "outbound" } ] }, "metadata": { "campaign": "q3-onboarding", "cost_center": "77" }, "id": "sig_01J40FQ2ZK", "duplicate": false}No valid access token. Client action: request a new token from the token endpoint and retry once. Repeated 401 with a fresh token means the client registration is disabled - contact Pace, do not retry in a loop.
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "trace_id": "example", "errors": [ { "pointer": "example", "code": "example", "message": "example" } ]}Authenticated but not permitted. insufficient_scope names the missing scope in detail; feature_not_enabled means the tenant lacks the feature; ip_not_allowlisted means the source IP is not on the client registration’s allowlist; simulate_not_allowed means a sandbox-only simulate block was sent to the live host. None of these are retryable.
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "trace_id": "example", "errors": [ { "pointer": "example", "code": "example", "message": "example" } ]}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}HTTP rate limit (rate_limited) or execution capacity refusal (quota_exceeded, backlog_full) - two distinct layers. Wait for Retry-After, then retry the identical request with the same Idempotency-Key. backlog_full will not clear in seconds; back off to minutes.
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "trace_id": "example", "errors": [ { "pointer": "example", "code": "example", "message": "example" } ]}Headers
Section titled “Headers”Seconds until the next attempt is permitted.
default
Section titled “default”Error (RFC 9457). Branch on code, never on title or detail.
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "trace_id": "example", "errors": [ { "pointer": "example", "code": "example", "message": "example" } ]}