theleadrouter-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/.claude/skills/admin-guide/SKILL.md +351 -0
  2. package/.claude/skills/buyer-guide/SKILL.md +405 -0
  3. package/.claude/skills/partner-guide/SKILL.md +352 -0
  4. package/.claude/skills/welcome/SKILL.md +351 -0
  5. package/CLAUDE.md +238 -0
  6. package/LICENSE +21 -0
  7. package/README.md +166 -0
  8. package/dist/api-client.d.ts +10 -0
  9. package/dist/api-client.d.ts.map +1 -0
  10. package/dist/api-client.js +64 -0
  11. package/dist/api-client.js.map +1 -0
  12. package/dist/auth-adapter.d.ts +33 -0
  13. package/dist/auth-adapter.d.ts.map +1 -0
  14. package/dist/auth-adapter.js +87 -0
  15. package/dist/auth-adapter.js.map +1 -0
  16. package/dist/bin/iscale-mcp.d.ts +3 -0
  17. package/dist/bin/iscale-mcp.d.ts.map +1 -0
  18. package/dist/bin/iscale-mcp.js +7 -0
  19. package/dist/bin/iscale-mcp.js.map +1 -0
  20. package/dist/build-registry.d.ts +3 -0
  21. package/dist/build-registry.d.ts.map +1 -0
  22. package/dist/build-registry.js +15 -0
  23. package/dist/build-registry.js.map +1 -0
  24. package/dist/index.d.ts +12 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +34 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/register.d.ts +4 -0
  29. package/dist/register.d.ts.map +1 -0
  30. package/dist/register.js +23 -0
  31. package/dist/register.js.map +1 -0
  32. package/dist/registry.d.ts +50 -0
  33. package/dist/registry.d.ts.map +1 -0
  34. package/dist/registry.js +78 -0
  35. package/dist/registry.js.map +1 -0
  36. package/dist/tools/buyers.d.ts +4 -0
  37. package/dist/tools/buyers.d.ts.map +1 -0
  38. package/dist/tools/buyers.js +61 -0
  39. package/dist/tools/buyers.js.map +1 -0
  40. package/dist/tools/campaigns.d.ts +4 -0
  41. package/dist/tools/campaigns.d.ts.map +1 -0
  42. package/dist/tools/campaigns.js +45 -0
  43. package/dist/tools/campaigns.js.map +1 -0
  44. package/dist/tools/compliance.d.ts +4 -0
  45. package/dist/tools/compliance.d.ts.map +1 -0
  46. package/dist/tools/compliance.js +28 -0
  47. package/dist/tools/compliance.js.map +1 -0
  48. package/dist/tools/composite.d.ts +3 -0
  49. package/dist/tools/composite.d.ts.map +1 -0
  50. package/dist/tools/composite.js +337 -0
  51. package/dist/tools/composite.js.map +1 -0
  52. package/dist/tools/contracts.d.ts +4 -0
  53. package/dist/tools/contracts.d.ts.map +1 -0
  54. package/dist/tools/contracts.js +48 -0
  55. package/dist/tools/contracts.js.map +1 -0
  56. package/dist/tools/generated/api-keys.gen.d.ts +3 -0
  57. package/dist/tools/generated/api-keys.gen.d.ts.map +1 -0
  58. package/dist/tools/generated/api-keys.gen.js +49 -0
  59. package/dist/tools/generated/api-keys.gen.js.map +1 -0
  60. package/dist/tools/generated/audit-logs.gen.d.ts +3 -0
  61. package/dist/tools/generated/audit-logs.gen.d.ts.map +1 -0
  62. package/dist/tools/generated/audit-logs.gen.js +59 -0
  63. package/dist/tools/generated/audit-logs.gen.js.map +1 -0
  64. package/dist/tools/generated/auth.gen.d.ts +3 -0
  65. package/dist/tools/generated/auth.gen.d.ts.map +1 -0
  66. package/dist/tools/generated/auth.gen.js +195 -0
  67. package/dist/tools/generated/auth.gen.js.map +1 -0
  68. package/dist/tools/generated/blocked-lists.gen.d.ts +3 -0
  69. package/dist/tools/generated/blocked-lists.gen.d.ts.map +1 -0
  70. package/dist/tools/generated/blocked-lists.gen.js +146 -0
  71. package/dist/tools/generated/blocked-lists.gen.js.map +1 -0
  72. package/dist/tools/generated/buyers.gen.d.ts +3 -0
  73. package/dist/tools/generated/buyers.gen.d.ts.map +1 -0
  74. package/dist/tools/generated/buyers.gen.js +153 -0
  75. package/dist/tools/generated/buyers.gen.js.map +1 -0
  76. package/dist/tools/generated/calls.gen.d.ts +3 -0
  77. package/dist/tools/generated/calls.gen.d.ts.map +1 -0
  78. package/dist/tools/generated/calls.gen.js +106 -0
  79. package/dist/tools/generated/calls.gen.js.map +1 -0
  80. package/dist/tools/generated/campaigns.gen.d.ts +3 -0
  81. package/dist/tools/generated/campaigns.gen.d.ts.map +1 -0
  82. package/dist/tools/generated/campaigns.gen.js +274 -0
  83. package/dist/tools/generated/campaigns.gen.js.map +1 -0
  84. package/dist/tools/generated/catalog.json +7096 -0
  85. package/dist/tools/generated/compliance.gen.d.ts +3 -0
  86. package/dist/tools/generated/compliance.gen.d.ts.map +1 -0
  87. package/dist/tools/generated/compliance.gen.js +119 -0
  88. package/dist/tools/generated/compliance.gen.js.map +1 -0
  89. package/dist/tools/generated/consent.gen.d.ts +3 -0
  90. package/dist/tools/generated/consent.gen.d.ts.map +1 -0
  91. package/dist/tools/generated/consent.gen.js +109 -0
  92. package/dist/tools/generated/consent.gen.js.map +1 -0
  93. package/dist/tools/generated/contacts.gen.d.ts +3 -0
  94. package/dist/tools/generated/contacts.gen.d.ts.map +1 -0
  95. package/dist/tools/generated/contacts.gen.js +88 -0
  96. package/dist/tools/generated/contacts.gen.js.map +1 -0
  97. package/dist/tools/generated/contracts.gen.d.ts +3 -0
  98. package/dist/tools/generated/contracts.gen.d.ts.map +1 -0
  99. package/dist/tools/generated/contracts.gen.js +306 -0
  100. package/dist/tools/generated/contracts.gen.js.map +1 -0
  101. package/dist/tools/generated/delivery-test.gen.d.ts +3 -0
  102. package/dist/tools/generated/delivery-test.gen.d.ts.map +1 -0
  103. package/dist/tools/generated/delivery-test.gen.js +17 -0
  104. package/dist/tools/generated/delivery-test.gen.js.map +1 -0
  105. package/dist/tools/generated/discovery.gen.d.ts +3 -0
  106. package/dist/tools/generated/discovery.gen.d.ts.map +1 -0
  107. package/dist/tools/generated/discovery.gen.js +17 -0
  108. package/dist/tools/generated/discovery.gen.js.map +1 -0
  109. package/dist/tools/generated/disposition-codes.gen.d.ts +3 -0
  110. package/dist/tools/generated/disposition-codes.gen.d.ts.map +1 -0
  111. package/dist/tools/generated/disposition-codes.gen.js +30 -0
  112. package/dist/tools/generated/disposition-codes.gen.js.map +1 -0
  113. package/dist/tools/generated/email-templates.gen.d.ts +3 -0
  114. package/dist/tools/generated/email-templates.gen.d.ts.map +1 -0
  115. package/dist/tools/generated/email-templates.gen.js +108 -0
  116. package/dist/tools/generated/email-templates.gen.js.map +1 -0
  117. package/dist/tools/generated/engagements.gen.d.ts +3 -0
  118. package/dist/tools/generated/engagements.gen.d.ts.map +1 -0
  119. package/dist/tools/generated/engagements.gen.js +208 -0
  120. package/dist/tools/generated/engagements.gen.js.map +1 -0
  121. package/dist/tools/generated/enrollments.gen.d.ts +3 -0
  122. package/dist/tools/generated/enrollments.gen.d.ts.map +1 -0
  123. package/dist/tools/generated/enrollments.gen.js +82 -0
  124. package/dist/tools/generated/enrollments.gen.js.map +1 -0
  125. package/dist/tools/generated/events.gen.d.ts +3 -0
  126. package/dist/tools/generated/events.gen.d.ts.map +1 -0
  127. package/dist/tools/generated/events.gen.js +20 -0
  128. package/dist/tools/generated/events.gen.js.map +1 -0
  129. package/dist/tools/generated/index.d.ts +3 -0
  130. package/dist/tools/generated/index.d.ts.map +1 -0
  131. package/dist/tools/generated/index.js +86 -0
  132. package/dist/tools/generated/index.js.map +1 -0
  133. package/dist/tools/generated/intake-centers.gen.d.ts +3 -0
  134. package/dist/tools/generated/intake-centers.gen.d.ts.map +1 -0
  135. package/dist/tools/generated/intake-centers.gen.js +196 -0
  136. package/dist/tools/generated/intake-centers.gen.js.map +1 -0
  137. package/dist/tools/generated/integrations.gen.d.ts +3 -0
  138. package/dist/tools/generated/integrations.gen.d.ts.map +1 -0
  139. package/dist/tools/generated/integrations.gen.js +290 -0
  140. package/dist/tools/generated/integrations.gen.js.map +1 -0
  141. package/dist/tools/generated/ivr.gen.d.ts +3 -0
  142. package/dist/tools/generated/ivr.gen.d.ts.map +1 -0
  143. package/dist/tools/generated/ivr.gen.js +97 -0
  144. package/dist/tools/generated/ivr.gen.js.map +1 -0
  145. package/dist/tools/generated/leads.gen.d.ts +3 -0
  146. package/dist/tools/generated/leads.gen.d.ts.map +1 -0
  147. package/dist/tools/generated/leads.gen.js +592 -0
  148. package/dist/tools/generated/leads.gen.js.map +1 -0
  149. package/dist/tools/generated/number-pool.gen.d.ts +3 -0
  150. package/dist/tools/generated/number-pool.gen.d.ts.map +1 -0
  151. package/dist/tools/generated/number-pool.gen.js +62 -0
  152. package/dist/tools/generated/number-pool.gen.js.map +1 -0
  153. package/dist/tools/generated/offers.gen.d.ts +3 -0
  154. package/dist/tools/generated/offers.gen.d.ts.map +1 -0
  155. package/dist/tools/generated/offers.gen.js +407 -0
  156. package/dist/tools/generated/offers.gen.js.map +1 -0
  157. package/dist/tools/generated/organizations.gen.d.ts +3 -0
  158. package/dist/tools/generated/organizations.gen.d.ts.map +1 -0
  159. package/dist/tools/generated/organizations.gen.js +161 -0
  160. package/dist/tools/generated/organizations.gen.js.map +1 -0
  161. package/dist/tools/generated/partners.gen.d.ts +3 -0
  162. package/dist/tools/generated/partners.gen.d.ts.map +1 -0
  163. package/dist/tools/generated/partners.gen.js +121 -0
  164. package/dist/tools/generated/partners.gen.js.map +1 -0
  165. package/dist/tools/generated/payouts.gen.d.ts +3 -0
  166. package/dist/tools/generated/payouts.gen.d.ts.map +1 -0
  167. package/dist/tools/generated/payouts.gen.js +92 -0
  168. package/dist/tools/generated/payouts.gen.js.map +1 -0
  169. package/dist/tools/generated/people.gen.d.ts +3 -0
  170. package/dist/tools/generated/people.gen.d.ts.map +1 -0
  171. package/dist/tools/generated/people.gen.js +354 -0
  172. package/dist/tools/generated/people.gen.js.map +1 -0
  173. package/dist/tools/generated/posting-log.gen.d.ts +3 -0
  174. package/dist/tools/generated/posting-log.gen.d.ts.map +1 -0
  175. package/dist/tools/generated/posting-log.gen.js +150 -0
  176. package/dist/tools/generated/posting-log.gen.js.map +1 -0
  177. package/dist/tools/generated/refunds.gen.d.ts +3 -0
  178. package/dist/tools/generated/refunds.gen.d.ts.map +1 -0
  179. package/dist/tools/generated/refunds.gen.js +91 -0
  180. package/dist/tools/generated/refunds.gen.js.map +1 -0
  181. package/dist/tools/generated/reports.gen.d.ts +3 -0
  182. package/dist/tools/generated/reports.gen.d.ts.map +1 -0
  183. package/dist/tools/generated/reports.gen.js +38 -0
  184. package/dist/tools/generated/reports.gen.js.map +1 -0
  185. package/dist/tools/generated/sessions.gen.d.ts +3 -0
  186. package/dist/tools/generated/sessions.gen.d.ts.map +1 -0
  187. package/dist/tools/generated/sessions.gen.js +90 -0
  188. package/dist/tools/generated/sessions.gen.js.map +1 -0
  189. package/dist/tools/generated/settings.gen.d.ts +3 -0
  190. package/dist/tools/generated/settings.gen.d.ts.map +1 -0
  191. package/dist/tools/generated/settings.gen.js +473 -0
  192. package/dist/tools/generated/settings.gen.js.map +1 -0
  193. package/dist/tools/generated/telephony.gen.d.ts +3 -0
  194. package/dist/tools/generated/telephony.gen.d.ts.map +1 -0
  195. package/dist/tools/generated/telephony.gen.js +170 -0
  196. package/dist/tools/generated/telephony.gen.js.map +1 -0
  197. package/dist/tools/generated/tenants.gen.d.ts +3 -0
  198. package/dist/tools/generated/tenants.gen.d.ts.map +1 -0
  199. package/dist/tools/generated/tenants.gen.js +223 -0
  200. package/dist/tools/generated/tenants.gen.js.map +1 -0
  201. package/dist/tools/generated/tracking-numbers.gen.d.ts +3 -0
  202. package/dist/tools/generated/tracking-numbers.gen.d.ts.map +1 -0
  203. package/dist/tools/generated/tracking-numbers.gen.js +131 -0
  204. package/dist/tools/generated/tracking-numbers.gen.js.map +1 -0
  205. package/dist/tools/generated/transactions.gen.d.ts +3 -0
  206. package/dist/tools/generated/transactions.gen.d.ts.map +1 -0
  207. package/dist/tools/generated/transactions.gen.js +62 -0
  208. package/dist/tools/generated/transactions.gen.js.map +1 -0
  209. package/dist/tools/generated/users.gen.d.ts +3 -0
  210. package/dist/tools/generated/users.gen.d.ts.map +1 -0
  211. package/dist/tools/generated/users.gen.js +339 -0
  212. package/dist/tools/generated/users.gen.js.map +1 -0
  213. package/dist/tools/generated/vertical-groups.gen.d.ts +3 -0
  214. package/dist/tools/generated/vertical-groups.gen.d.ts.map +1 -0
  215. package/dist/tools/generated/vertical-groups.gen.js +243 -0
  216. package/dist/tools/generated/vertical-groups.gen.js.map +1 -0
  217. package/dist/tools/generated/verticals.gen.d.ts +3 -0
  218. package/dist/tools/generated/verticals.gen.d.ts.map +1 -0
  219. package/dist/tools/generated/verticals.gen.js +164 -0
  220. package/dist/tools/generated/verticals.gen.js.map +1 -0
  221. package/dist/tools/leads.d.ts +4 -0
  222. package/dist/tools/leads.d.ts.map +1 -0
  223. package/dist/tools/leads.js +69 -0
  224. package/dist/tools/leads.js.map +1 -0
  225. package/dist/tools/offers.d.ts +4 -0
  226. package/dist/tools/offers.d.ts.map +1 -0
  227. package/dist/tools/offers.js +33 -0
  228. package/dist/tools/offers.js.map +1 -0
  229. package/dist/tools/partners.d.ts +4 -0
  230. package/dist/tools/partners.d.ts.map +1 -0
  231. package/dist/tools/partners.js +30 -0
  232. package/dist/tools/partners.js.map +1 -0
  233. package/dist/tools/people.d.ts +4 -0
  234. package/dist/tools/people.d.ts.map +1 -0
  235. package/dist/tools/people.js +42 -0
  236. package/dist/tools/people.js.map +1 -0
  237. package/dist/tools/reports.d.ts +4 -0
  238. package/dist/tools/reports.d.ts.map +1 -0
  239. package/dist/tools/reports.js +67 -0
  240. package/dist/tools/reports.js.map +1 -0
  241. package/dist/tools/ui.d.ts +3 -0
  242. package/dist/tools/ui.d.ts.map +1 -0
  243. package/dist/tools/ui.js +108 -0
  244. package/dist/tools/ui.js.map +1 -0
  245. package/dist/tools/verticals.d.ts +4 -0
  246. package/dist/tools/verticals.d.ts.map +1 -0
  247. package/dist/tools/verticals.js +25 -0
  248. package/dist/tools/verticals.js.map +1 -0
  249. package/dist/types.d.ts +19 -0
  250. package/dist/types.d.ts.map +1 -0
  251. package/dist/types.js +2 -0
  252. package/dist/types.js.map +1 -0
  253. package/package.json +67 -0
@@ -0,0 +1,405 @@
1
+ ---
2
+ name: buyer-guide
3
+ description: "Buyer guide for iSCALE lead routing — managing contracts, filters, caps, delivery, dedup, balance, returns, dispositions, the buyer portal. Use when configuring how you receive leads, troubleshooting delivery, or managing your buyer account."
4
+ user_invocable: true
5
+ allowed_tools:
6
+ - Bash
7
+ - Read
8
+ - Grep
9
+ - Glob
10
+ ---
11
+
12
+ # iSCALE Buyer Guide
13
+
14
+ Guide for buyers (advertisers, clients, law firms, agencies) who purchase leads from iSCALE. Covers contracts, filters, delivery, dedup, billing, returns, and the buyer portal.
15
+
16
+ ## When to use
17
+ - Setting up or modifying how you receive leads
18
+ - Configuring filters (geo, demographic, custom)
19
+ - Setting caps and schedules
20
+ - Configuring delivery to your CRM or endpoint
21
+ - Understanding dedup and how duplicates are handled
22
+ - Managing balance and billing
23
+ - Returning leads or handling dispositions
24
+ - Using the buyer portal
25
+ - Troubleshooting delivery issues
26
+
27
+ ## How You Receive Leads
28
+
29
+ Partners submit leads → the routing engine evaluates your contracts → if your filters match, the lead is delivered to your endpoint.
30
+
31
+ ```
32
+ Lead submitted → Routing Engine checks your contract → Filters pass? → Caps ok? → No dupe? → Delivered to you
33
+ ```
34
+
35
+ You only pay for leads that pass all checks and are successfully delivered.
36
+
37
+ ## Contracts — Your Lead Agreements
38
+
39
+ A contract defines exactly what leads you want, how many, at what price, and where to deliver them. You can have multiple contracts for different verticals or different criteria within the same vertical.
40
+
41
+ ### Key Contract Settings
42
+
43
+ **What leads you want:**
44
+
45
+ | Setting | Purpose | Example |
46
+ |---------|---------|---------|
47
+ | verticalId | Lead category | Solar, Medicare, Auto Insurance |
48
+ | geoFilters | Geographic restrictions | Only leads from CA, TX, FL |
49
+ | demographicFilters | Age/gender requirements | Age 25-65 |
50
+ | customFilters | Vertical-specific criteria | homeOwner = true, utilityBill > $100 |
51
+
52
+ **How many:**
53
+
54
+ | Setting | Purpose |
55
+ |---------|---------|
56
+ | dailyLeadCap | Max leads per day |
57
+ | weeklyLeadCap | Max leads per week |
58
+ | monthlyLeadCap | Max leads per month |
59
+ | dailySpendCap | Max spend per day |
60
+ | weeklySpendCap | Max spend per week |
61
+ | monthlySpendCap | Max spend per month |
62
+
63
+ **At what price:**
64
+
65
+ | Setting | Purpose |
66
+ |---------|---------|
67
+ | pricingModel | `fixed` (set price) or `ping_post` (bid per lead) |
68
+ | pricePerLead | Amount you pay per lead |
69
+ | exclusiveMultiplier | Price multiplier for exclusive leads (default: 1.0) |
70
+ | allowMultiSale | Whether you accept shared/multisell leads |
71
+
72
+ **When:**
73
+
74
+ | Setting | Purpose |
75
+ |---------|---------|
76
+ | scheduleTimezone | Your timezone (default: America/Los_Angeles) |
77
+ | scheduleHours | Operating hours per day of week |
78
+ | expiresAt | Contract end date |
79
+
80
+ Empty scheduleHours = leads delivered 24/7. If hours are set, leads outside your hours are rejected (not queued for later).
81
+
82
+ ## Filters — Controlling What You Receive
83
+
84
+ ### Geographic Filters
85
+
86
+ ```json
87
+ {
88
+ "states": ["CA", "TX", "FL"],
89
+ "zipCodes": ["902*", "100*", "330*"]
90
+ }
91
+ ```
92
+
93
+ - States use 2-letter abbreviations ("CA" not "California")
94
+ - Zip codes support wildcards ("902*" matches 90201-90299)
95
+ - Leave empty to accept all locations
96
+
97
+ ### Demographic Filters
98
+
99
+ ```json
100
+ {
101
+ "minAge": 25,
102
+ "maxAge": 65
103
+ }
104
+ ```
105
+
106
+ ### Custom Filters (Vertical-Specific)
107
+
108
+ These depend on the vertical. Examples for Solar:
109
+
110
+ ```json
111
+ {
112
+ "homeOwner": true,
113
+ "utilityBill": { "min": 100 }
114
+ }
115
+ ```
116
+
117
+ ### How Filters Are Evaluated
118
+
119
+ All filters must pass for a lead to reach you. If any filter fails, the lead is rejected for your contract (but may still go to other buyers).
120
+
121
+ Order of evaluation:
122
+ 1. Contract status active?
123
+ 2. Your account status active?
124
+ 3. Your balance within credit limit?
125
+ 4. Within your schedule hours?
126
+ 5. Geo filters match?
127
+ 6. Demographic filters match?
128
+ 7. Custom filters match?
129
+ 8. Caps not exceeded?
130
+ 9. Dedup check passed?
131
+
132
+ ## Delivery — How Leads Reach You
133
+
134
+ Leads are delivered to your system via the method configured on your contract or intake center.
135
+
136
+ ### Delivery Methods
137
+
138
+ | Method | Description |
139
+ |--------|-------------|
140
+ | `http_post` | POST JSON to your endpoint |
141
+ | `http_get` | GET request with data as query params |
142
+ | `email` | Lead data sent via email |
143
+
144
+ ### Delivery Configuration
145
+
146
+ **On the contract directly:**
147
+ - `deliveryUrlOverride` — your endpoint URL
148
+ - `deliveryMethodOverride` — POST, GET, or email
149
+ - `deliveryConfig` — field mapping, custom headers, auth
150
+
151
+ **Via Intake Center (recommended for CRM integration):**
152
+ - Link your contract to an intake center
153
+ - Intake center defines delivery URL, auth, field mapping
154
+ - Multiple contracts can share the same intake center
155
+
156
+ ### Delivery Config Example
157
+
158
+ ```json
159
+ {
160
+ "url": "https://your-crm.com/api/leads",
161
+ "method": "POST",
162
+ "headers": {
163
+ "X-API-Key": "your-key"
164
+ },
165
+ "fieldMapping": {
166
+ "first_name": "{{firstName}}",
167
+ "last_name": "{{lastName}}",
168
+ "email_address": "{{email}}",
169
+ "phone_number": "{{phone}}"
170
+ }
171
+ }
172
+ ```
173
+
174
+ ### Delivery Statuses
175
+
176
+ | Status | Meaning |
177
+ |--------|---------|
178
+ | `pending` | Waiting to be delivered |
179
+ | `delivering` | Delivery in progress |
180
+ | `delivered` | Successfully delivered to your endpoint |
181
+ | `failed` | Delivery failed (will retry) |
182
+ | `returned` | Lead was returned (refunded) |
183
+
184
+ ## Dedup — Duplicate Prevention
185
+
186
+ Dedup prevents you from receiving the same person twice within a time window.
187
+
188
+ ### How It Works
189
+
190
+ 1. When a lead is routed to you, iSCALE hashes the dedup fields (default: email + phone)
191
+ 2. Checks if that hash exists in your dedup history within the window
192
+ 3. If found → lead is rejected as duplicate for your contract
193
+ 4. If not found → lead is delivered, hash is stored
194
+
195
+ ### Settings
196
+
197
+ | Setting | Default | Purpose |
198
+ |---------|---------|---------|
199
+ | dedupEnabled | false | Turn on duplicate checking |
200
+ | dedupFields | ["email", "phone"] | Which fields to check |
201
+ | dedupWindowDays | 30 | How many days to remember |
202
+
203
+ ### Important Notes
204
+
205
+ - Dedup is **per-buyer** — if you and another buyer both have contracts, you can both receive the same person
206
+ - Cross-partner dedup (same person from different partners) is configured at the **offer level**, not the buyer level
207
+ - Dedup records expire after `dedupWindowDays` — after that, the same person can be sent again
208
+
209
+ ## Balance & Billing
210
+
211
+ ### How Balance Works
212
+
213
+ - Your **balance** increases each time you receive a lead (you owe more)
214
+ - Your **creditLimit** is the maximum you can owe before leads stop routing to you
215
+ - When balance >= creditLimit, all your contracts are skipped during routing
216
+
217
+ ### Balance Fields
218
+
219
+ | Field | Purpose |
220
+ |-------|---------|
221
+ | balance | Current amount owed |
222
+ | creditLimit | Max allowed balance |
223
+ | autoRecharge | Automatically add funds? |
224
+ | autoRechargeAmount | How much to add |
225
+ | autoRechargeThreshold | Balance level that triggers recharge |
226
+
227
+ ### If Leads Stop Coming
228
+
229
+ Check your balance — if it's at or near your credit limit, that's why. Either make a payment (reduces balance) or ask your admin to increase the credit limit.
230
+
231
+ ## Returns
232
+
233
+ You can return leads within the return window if they don't meet quality standards.
234
+
235
+ ### How Returns Work
236
+
237
+ 1. You identify a low-quality lead
238
+ 2. Submit a return request with the lead ID and reason
239
+ 3. If within the return window, the lead is refunded
240
+ 4. Your balance is reduced by the lead's price
241
+ 5. The partner's balance is also adjusted
242
+
243
+ ### Return via API
244
+
245
+ ```
246
+ POST /api/buyer/leads/{leadId}/return
247
+ Authorization: Bearer lr_your_buyer_api_key
248
+
249
+ {
250
+ "reason": "Invalid phone number"
251
+ }
252
+ ```
253
+
254
+ ## Dispositions
255
+
256
+ Dispositions track what happened to a lead after delivery — did the buyer close the deal? Did the lead answer the phone?
257
+
258
+ ### How Dispositions Work
259
+
260
+ 1. Lead is delivered to you
261
+ 2. You process the lead in your CRM
262
+ 3. You send back a disposition (status update) via postback or API
263
+ 4. iSCALE records the disposition and may trigger CPA payments
264
+
265
+ ### Common Dispositions
266
+
267
+ | Disposition | Meaning |
268
+ |-------------|---------|
269
+ | contacted | Lead was contacted |
270
+ | qualified | Lead is qualified |
271
+ | converted | Lead became a customer (triggers CPA if configured) |
272
+ | not_interested | Lead declined |
273
+ | bad_data | Data was incorrect |
274
+ | duplicate | You already had this person |
275
+
276
+ ### CPA (Cost Per Acquisition)
277
+
278
+ If your contract has CPA configured:
279
+ - **cpaAmount:** Bonus payment triggered when lead converts
280
+ - **cpaWindowDays:** Days to wait for conversion before expiring
281
+ - When you send a "converted" disposition within the window, the CPA payment is processed
282
+
283
+ ## Intake Centers — CRM Integration
284
+
285
+ An intake center represents your CRM or backend system. It centralizes delivery config so multiple contracts can share it.
286
+
287
+ ### What Intake Centers Provide
288
+
289
+ | Feature | Purpose |
290
+ |---------|---------|
291
+ | Delivery config | URL, auth, method — shared across contracts |
292
+ | Disposition mapping | Your CRM status codes → iSCALE dispositions |
293
+ | Program cascades | Your program codes → specific contracts |
294
+
295
+ ### Disposition Mapping Example
296
+
297
+ Your CRM returns status codes like "SOLD", "DNC", "CALLBACK". The intake center maps these:
298
+
299
+ | Your CRM Code | iSCALE Disposition |
300
+ |---------------|-------------------|
301
+ | SOLD | converted |
302
+ | DNC | not_interested |
303
+ | CALLBACK | contacted |
304
+ | BAD_NUM | bad_data |
305
+
306
+ ## Buyer Portal
307
+
308
+ The buyer portal gives you a dashboard to view your leads, track spending, and manage settings.
309
+
310
+ ### Accessing the Portal
311
+
312
+ - **URL:** Your iSCALE instance URL + `/buyer` (e.g., `https://leads.iscale.com/buyer`)
313
+ - **Auth:** Login with your buyer account credentials
314
+
315
+ ### What You Can See
316
+
317
+ | Section | Information |
318
+ |---------|-------------|
319
+ | Dashboard | Today's leads, spending, cap utilization |
320
+ | Leads | All leads received, with status and delivery info |
321
+ | Contracts | Your active contracts and their settings |
322
+ | Transactions | Financial history — charges, credits, payments |
323
+ | Settings | Account profile, API keys |
324
+
325
+ ### Buyer API Keys
326
+
327
+ Create API keys in Settings to access the buyer API programmatically.
328
+
329
+ ```
330
+ GET /api/buyer/leads
331
+ Authorization: Bearer lr_your_buyer_api_key
332
+ ```
333
+
334
+ ## Ping-Post (Auction Model)
335
+
336
+ If your contract uses ping-post pricing, here's how it works:
337
+
338
+ 1. **Ping:** iSCALE sends you lead attributes (no PII — just vertical data, geo, demographics)
339
+ 2. **You bid:** Return a bid price (or decline)
340
+ 3. **Post:** If you win the auction, iSCALE delivers the full lead with PII
341
+ 4. **You pay:** The bid price, not the contract's fixed price
342
+
343
+ ### Ping Request (What You Receive)
344
+
345
+ ```json
346
+ {
347
+ "pingId": "abc-123",
348
+ "vertical": "solar",
349
+ "state": "CA",
350
+ "zipCode": "90210",
351
+ "homeOwner": true,
352
+ "utilityBill": 150
353
+ }
354
+ ```
355
+
356
+ ### Your Bid Response
357
+
358
+ ```json
359
+ {
360
+ "pingId": "abc-123",
361
+ "bid": 25.00,
362
+ "accepted": true
363
+ }
364
+ ```
365
+
366
+ Or to decline:
367
+ ```json
368
+ {
369
+ "pingId": "abc-123",
370
+ "accepted": false
371
+ }
372
+ ```
373
+
374
+ ## Troubleshooting
375
+
376
+ ### Not receiving any leads
377
+ 1. Check your account status is `active`
378
+ 2. Check your balance hasn't exceeded creditLimit
379
+ 3. Check your contracts are `active`
380
+ 4. Check your contracts are linked to an offer
381
+ 5. Check filter settings aren't too restrictive
382
+ 6. Check schedule — are you within operating hours?
383
+
384
+ ### Receiving leads you don't want
385
+ 1. Tighten your geo filters (add specific states/zips)
386
+ 2. Add demographic filters
387
+ 3. Add custom filters for vertical-specific criteria
388
+ 4. Contact your admin to adjust contract settings
389
+
390
+ ### Delivery failures
391
+ 1. Check your delivery URL is correct and accepting requests
392
+ 2. Check auth configuration matches your endpoint
393
+ 3. Check your endpoint is returning 200 status codes
394
+ 4. Review delivery response in lead detail for error messages
395
+
396
+ ### Duplicate leads
397
+ 1. Enable dedupEnabled on your buyer account
398
+ 2. Set dedupFields to the fields you want to check (default: email + phone)
399
+ 3. Set dedupWindowDays to your preferred lookback window
400
+ 4. Note: dedup only prevents duplicates to YOUR account — other buyers may still get the same person
401
+
402
+ ### Balance too high
403
+ 1. Make a payment to reduce your balance
404
+ 2. Ask your admin to increase your creditLimit
405
+ 3. Consider enabling autoRecharge to automatically fund your account