parseapi 1.6.0__tar.gz → 1.8.0__tar.gz

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 (28) hide show
  1. {parseapi-1.6.0 → parseapi-1.8.0}/CHANGELOG.md +11 -0
  2. {parseapi-1.6.0 → parseapi-1.8.0}/PKG-INFO +75 -14
  3. {parseapi-1.6.0 → parseapi-1.8.0}/README.md +74 -13
  4. {parseapi-1.6.0 → parseapi-1.8.0}/api/public.json +360 -0
  5. {parseapi-1.6.0 → parseapi-1.8.0}/pyproject.toml +1 -1
  6. {parseapi-1.6.0 → parseapi-1.8.0}/smoke/smoke.py +6 -6
  7. {parseapi-1.6.0 → parseapi-1.8.0}/src/parseapi/__init__.py +1 -1
  8. {parseapi-1.6.0 → parseapi-1.8.0}/src/parseapi/_client.py +123 -38
  9. parseapi-1.8.0/tests/bank-fixtures.json +92 -0
  10. parseapi-1.8.0/tests/test_bank.py +69 -0
  11. parseapi-1.8.0/tests/test_card_dx.py +120 -0
  12. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_client.py +33 -23
  13. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_language.py +1 -1
  14. parseapi-1.8.0/tests/test_tariff.py +92 -0
  15. {parseapi-1.6.0 → parseapi-1.8.0}/.github/workflows/publish.yml +0 -0
  16. {parseapi-1.6.0 → parseapi-1.8.0}/.github/workflows/test.yml +0 -0
  17. {parseapi-1.6.0 → parseapi-1.8.0}/.gitignore +0 -0
  18. {parseapi-1.6.0 → parseapi-1.8.0}/LICENSE +0 -0
  19. {parseapi-1.6.0 → parseapi-1.8.0}/scripts/public_api.py +0 -0
  20. {parseapi-1.6.0 → parseapi-1.8.0}/src/parseapi/py.typed +0 -0
  21. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_email_enrichment.py +0 -0
  22. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_name_formatting.py +0 -0
  23. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_postal_localities.py +0 -0
  24. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_public_api.py +0 -0
  25. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_stack.py +0 -0
  26. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_time_complete.py +0 -0
  27. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_time_gaps.py +0 -0
  28. {parseapi-1.6.0 → parseapi-1.8.0}/tests/test_version.py +0 -0
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.8.0 — 2026-09-25
4
+
5
+ - Add Bank diagnostics, POST requests, requirements and explicit US ACH helpers; Card Core and optional Deep; Provider; Industry; and Vehicle.
6
+ - Preserve published IBAN, BIN, NPI, NAICS and VIN methods and response types alongside the new names.
7
+ - Respect long Retry-After responses without retrying early and expose the raw header as optional error metadata.
8
+ - Retain released Time, Tariff, Postal and Elevation behavior. Expanded Company directory changes are deferred.
9
+
10
+ ## 1.7.0 - 2026-09-24
11
+
12
+ - Add exact Tariff edition/date selection, answering metadata, contextual search lineage and explanatory null reasons. Explicit selections reject unsupported or mismatched server responses.
13
+
3
14
  ## 1.6.0 - 2026-09-24
4
15
 
5
16
  Adds Time location inputs and explicit ambiguity candidates, filtered timezone discovery, multiple conversion targets, wall-time disambiguation, and standard/seasonal offset detail. Existing Timezone methods and API 2.0.0 selection remain unchanged.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parseapi
3
- Version: 1.6.0
3
+ Version: 1.8.0
4
4
  Summary: Official ParseAPI client for Python. One key, minimal JSON, fast.
5
5
  Project-URL: Homepage, https://parseapi.com
6
6
  Project-URL: Documentation, https://parseapi.com/docs
@@ -36,7 +36,7 @@ Get a key at [parseapi.com](https://parseapi.com). The client also reads `PARSEA
36
36
 
37
37
  ## API versions
38
38
 
39
- Version 1.6.0 explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
39
+ Version 1.7.0 explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
40
40
 
41
41
  Upgrade the dependency in staging, review the [release notes](https://parseapi.com/docs/releases), and test the application before deploying the same code and dependency version to production. Commit your dependency lockfile so the tested package travels with your deployment. Future major SDK upgrades can select a newer API contract.
42
42
 
@@ -75,9 +75,9 @@ parse.ip("8.8.8.8")
75
75
  parse.ip.self()
76
76
  parse.email("hello@gmail.com")
77
77
  parse.vat("DE136695976")
78
- parse.iban("DE89370400440532013000")
79
- parse.bin("424242")
80
- parse.npi("1881018208")
78
+ parse.bank("DE89370400440532013000")
79
+ parse.card("424242")
80
+ parse.provider("1881018208")
81
81
  parse.phone("+14155552671")
82
82
  parse.carrier("+14155552671")
83
83
  parse.caller("+14155552671")
@@ -128,16 +128,18 @@ parse.mx("example.com")
128
128
  parse.dns("example.com")
129
129
  parse.dns("_dmarc.example.com", type="TXT")
130
130
  parse.useragent(ua_string)
131
- parse.vin("1HGCM82633A004352")
132
- parse.naics("541511")
133
- parse.naics.search("coffee shop", limit=5)
131
+ parse.vehicle("1HGCM82633A004352")
132
+ parse.industry("541511")
133
+ parse.industry.search("coffee shop", limit=5)
134
134
  parse.tariff("8471.30.01.00")
135
135
  parse.tariff.search("sunglasses")
136
136
  parse.emoji("rocket")
137
137
  parse.emoji.search("fire")
138
138
  ```
139
139
 
140
- NAICS paid deep records include classification `deep.exclusions`, each with a description and linked codes. Generic exclusions can have no linked codes. Omitted or null exclusions in older responses remain unknown. Search results also include `match`: the matched `field` (`name`, `term` or `naics`) and `text`, plus `corrections` with `from` and `to` tokens for typo fallback. Corrections are empty for exact, plural and prefix matches. Direct code lookups omit `match`. Older responses may omit it.
140
+ The existing NAICS lookup and search methods remain available as compatibility names for Industry.
141
+
142
+ Industry paid deep records include classification `deep.exclusions`, each with a description and linked codes. Generic exclusions can have no linked codes. Omitted or null exclusions in older responses remain unknown. Search results also include `match`: the matched `field` (`name`, `term` or `naics`) and `text`, plus `corrections` with `from` and `to` tokens for typo fallback. Corrections are empty for exact, plural and prefix matches. Direct code lookups omit `match`. Older responses may omit it.
141
143
 
142
144
  Responses are plain dicts, exactly the JSON the API returns. `country.states("US")` requests states directly; it does not fetch a country first. Required inputs are positional and optional behavior uses keyword arguments, leaving room for new options without changing existing calls. Reuse a client across calls. Use `with ParseAPI(...) as parse:` or call `parse.close()` when finished.
143
145
 
@@ -250,6 +252,12 @@ parse.weather(40.7128, -74.006, deep=True, date="2026-08-15")
250
252
 
251
253
  Tariff starts with the general schedule line. Paid deep adds units and the special and other schedule columns. An optional origin then resolves country-specific measures. The three calls below show those successive choices. Without origin, schedule detail is still returned and origin-dependent fields are null. A null effective rate is not a zero rate.
252
254
 
255
+ Tariff lookup and search accept an optional `edition` fingerprint and `date` (`YYYY-MM-DD`). The edition pins exact immutable source bytes. A date is accepted only when verified source coverage exists. An edition without a date returns undated schedule context (`date: null`). Default requests use today. Paid detail exposes an open-string `reason` when `effective_rate` is null, including `incomplete_coverage`. A null rate never means zero. Explicit selections fail with `tariff_selection_mismatch` if an older server ignores the requested scope.
256
+
257
+ Origin means where the goods originate, not where they ship from. The effective rate covers matched stored schedule measures only. It is not complete duty or landed cost.
258
+
259
+ Codes contain 4, 6, 8 or 10 ASCII digits; dots and whitespace are optional. Search returns up to 20 description matches with parent `lineage` so a result named "Other" has context. Search is not product classification. In deep, `measures: null` means origin-dependent measures were not resolved. `measures: []` means the resolved lookup found none.
260
+
253
261
  ```python
254
262
  parse.tariff("8471.30.01.00")
255
263
  parse.tariff("8471.30.01.00", deep=True)
@@ -260,6 +268,32 @@ Address search uses context from the form: prefer postal, or city and state. An
260
268
 
261
269
  HLR reports status at the last check. `live` means assigned and `connected` means reachable at that check. Cached results may be returned. Null means unconfirmed. Deep diagnostics stay within the same metered lookup.
262
270
 
271
+ Bank returns core `checks` for input, country, length, structure, checksum and national rules, plus an `issues` list. States are `passed`, `failed`, `not_checked` or `not_supported`. Unsupported national checking is not a failure. `valid` covers the implemented format and checksum rules, not account existence, ownership or payment reachability. Directory names and BICs may be null independently. Older responses may omit `checks` and `issues`, and future states and issue codes remain strings. Pass the original input unchanged so the API can report invalid characters. Deep `account` remains the BBAN remainder.
272
+
273
+ Bank inputs use `POST /bank` JSON bodies, keeping IBAN and account values out of request URLs. Pass original strings; the server owns normalization and validation. Avoid logging request bodies. IBAN deep can include `directory` with the immutable `edition`, resolved `country` and actual `match` grain (`bank`, `branch`, `prefix` or `none`); it is absent if no directory lookup ran. A match does not prove complete country coverage or payment reachability.
274
+
275
+ Use country requirements to build supported input fields. US ACH has an explicit helper with no deep option. It checks the routing format/ABA checksum and account-field syntax; `account_checksum` is `not_supported`. It preserves account characters and leading zeros. A nullable bank name is routing-directory identity, not account existence, ownership or ACH eligibility. The examples below are synthetic test inputs, not payment instructions.
276
+
277
+ ```python
278
+ parse.bank_requirements("US", format="us_ach")
279
+ parse.bank_us_ach(routing="011000015", account="0001234567")
280
+ ```
281
+
282
+ ## Provider lookup
283
+
284
+ ```python
285
+ provider = parse.provider("1881018208")
286
+ profile = parse.provider("1881018208", deep=True)
287
+ ```
288
+
289
+ Pass the original NPI as a string. `valid` checks its format and checksum; `registered` means a match in the stored NPPES snapshot. `active` reflects recorded NPI deactivation, not licensure. `excluded` is an NPI-only OIG LEIE match; `false` is not a complete exclusion clearance. These directory facts do not verify credentials, current practice contact or payment eligibility.
290
+
291
+ Invalid input returns `valid: false` with unknown provider fields. A checksum-valid number missing from the snapshot returns `registered: false`; unavailable storage remains an API error. Preserve `null` as unknown.
292
+
293
+ The default pooled lookup includes provider identity, specialty and practice contact where held. Paid `deep` adds `deactivated_at`, `medicare`, `opt_out` and `enrollments` from stored source files, with no separate check meter or live verification. `enrollments: null` means unavailable; `[]` means no enrollment rows are returned. The API omits unrequested `deep` and returns `{}` when requested on Free.
294
+
295
+ Paid Deep also returns `taxonomies` in published order, with taxonomy code, specialty label, primary flag and provider-reported license number/state, plus `enumerated_at`, `updated_at` and `reactivated_at` record dates. Reported licenses are not verified licenses. Null lists mean unavailable; empty lists mean the edition contains no entries. Core `sources` is available on every plan: NPPES, LEIE, PECOS and opt-out each have nullable edition metadata (`edition`, `published_at`, `through`, `imported_at`). Provider record dates are separate from source publication and completed import dates. Older responses may omit these additions. Edition details remain null until a verified source is served.
296
+
263
297
  ## Deep
264
298
 
265
299
  Choose enrichment for the question you need answered.
@@ -270,10 +304,11 @@ Choose enrichment for the question you need answered.
270
304
  | Domain | Registration dates, registrar, status and DNSSEC, included with a paid plan. Use `dns` for DNS records and `mx` for mail routing. |
271
305
  | Email | A metered mailbox check with deliverability, catch-all, status, reason and address hints, using included email checks or enabled on-demand usage. |
272
306
  | VAT | A metered registry check where supported, using included VAT checks or enabled on-demand usage. |
273
- | Phone, Time, Date, Currency, Language, Emoji, IBAN, Point | Optional detail in the same pooled request on every plan. |
307
+ | Phone, Time, Date, Currency, Language, Emoji, Bank, Point | Optional detail in the same pooled request on every plan. |
274
308
  | Country, State, District, City, Postal | The place profile on paid plans, including demographic and tax facts where held. |
275
- | Name, NAICS | Name evidence or the industry definition profile on paid plans. |
276
- | VIN, NPI, Tariff, Company | The complete product detail bag on paid plans. |
309
+ | Name, Industry | Name evidence or the industry definition profile on paid plans. |
310
+ | NPI | Deactivation date, Medicare enrollment, opt-out and enrollment rows from stored sources on paid plans. Exclusion evidence stays core. |
311
+ | Vehicle, Tariff, Company | The complete product detail bag on paid plans. |
277
312
  | Weather | Specialist current measurements and the existing forecast, alert, air and history bag on paid plans. |
278
313
  | Carrier, HLR | Optional diagnostic detail within the same metered core unit, including Free allowance units. No second gate or additional check. |
279
314
 
@@ -321,16 +356,40 @@ Ordinary lookups retry network failures, 429, and 500/502/503/504 responses twic
321
356
 
322
357
  An explicit client `retries` setting overrides those defaults; `retries=0` always makes one attempt. Another attempt can consume additional usage if the earlier response was lost. Cancelling an async task stops the call and any retry wait. Automatic redirects are disabled.
323
358
 
359
+ Automatic retries wait at most five seconds per attempt. A longer valid `Retry-After` returns the original API error immediately without retrying early. Read `retry_after` on the error for the original header, or null when absent.
360
+
324
361
  ## Docs
325
362
 
326
363
  Full field reference for every endpoint: [parseapi.com/docs](https://parseapi.com/docs)
327
364
 
328
- BIN lookup accepts 6-11 digits as a string, including leading zeros. Spaces and hyphens are accepted. `prefix` is the actual longest match and can be shorter than the input. Unknown reference fields are null. `deep` adds an empty object on every plan.
365
+ ## Card
329
366
 
367
+ Send 2–11 leading digits as a string. Core returns `bin`, `brand`, `brand_name`
368
+ and a CDN SVG `logo`. Brand detection uses reviewed network rules independently
369
+ of issuer records. Unknown or ambiguous prefixes return null brand fields and a
370
+ generic logo; a known network without reviewed artwork also uses the generic logo.
371
+
372
+ Optional Deep adds `prefix`, `issuer`, `country`, `type` and `prepaid`, included
373
+ in the same pooled request on every plan. Six or more digits enable directory
374
+ matching. Fewer digits return all-null Deep fields. Compare `deep.prefix` with
375
+ `bin`: equal is an exact recorded match; shorter is broader; null is no match.
376
+ The longest row wins, including null fields. `prepaid: null` means unknown, not
377
+ false. This is partial reference data, not card validity or payment acceptance.
378
+
379
+ ```python
380
+ card = parse.card("51")
381
+ print(card["brand"], card["logo"])
382
+ details = parse.card("43737400", deep=True)
383
+ print(details["deep"]["prefix"], details["deep"]["issuer"])
384
+ ```
385
+
386
+ Leading zeros are preserved. Only ASCII spaces, tabs, CR, LF and hyphens are
387
+ removed; raw input is limited to 64 characters. Invalid prefixes are rejected
388
+ before dispatch, accepted input is forwarded unchanged. Never send a full card number.
330
389
 
331
390
  ## Optional detail
332
391
 
333
- The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, NAICS and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep`; only the source has `deep.next_dst`.
392
+ The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Industry and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep`; only the source has `deep.next_dst`.
334
393
 
335
394
  ```python
336
395
  basic = parse.time("America/New_York")
@@ -352,3 +411,5 @@ Pass a public hostname without a scheme, path, port or IP address. Stack returns
352
411
  Successful checks may be reused for up to 24 hours. `pretty` optionally formats the wire JSON. Stack uses your plan's request allowance and API version 2.0.0 selected by this client.
353
412
 
354
413
  Stack defaults to a 35-second transport timeout so a first scan has time to finish. Other lookups retain their 10-second default. An explicit client timeout takes precedence.
414
+
415
+ Vehicle lookups use `vin` as the input and response field. Existing VIN methods remain available for compatibility.
@@ -17,7 +17,7 @@ Get a key at [parseapi.com](https://parseapi.com). The client also reads `PARSEA
17
17
 
18
18
  ## API versions
19
19
 
20
- Version 1.6.0 explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
20
+ Version 1.7.0 explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
21
21
 
22
22
  Upgrade the dependency in staging, review the [release notes](https://parseapi.com/docs/releases), and test the application before deploying the same code and dependency version to production. Commit your dependency lockfile so the tested package travels with your deployment. Future major SDK upgrades can select a newer API contract.
23
23
 
@@ -56,9 +56,9 @@ parse.ip("8.8.8.8")
56
56
  parse.ip.self()
57
57
  parse.email("hello@gmail.com")
58
58
  parse.vat("DE136695976")
59
- parse.iban("DE89370400440532013000")
60
- parse.bin("424242")
61
- parse.npi("1881018208")
59
+ parse.bank("DE89370400440532013000")
60
+ parse.card("424242")
61
+ parse.provider("1881018208")
62
62
  parse.phone("+14155552671")
63
63
  parse.carrier("+14155552671")
64
64
  parse.caller("+14155552671")
@@ -109,16 +109,18 @@ parse.mx("example.com")
109
109
  parse.dns("example.com")
110
110
  parse.dns("_dmarc.example.com", type="TXT")
111
111
  parse.useragent(ua_string)
112
- parse.vin("1HGCM82633A004352")
113
- parse.naics("541511")
114
- parse.naics.search("coffee shop", limit=5)
112
+ parse.vehicle("1HGCM82633A004352")
113
+ parse.industry("541511")
114
+ parse.industry.search("coffee shop", limit=5)
115
115
  parse.tariff("8471.30.01.00")
116
116
  parse.tariff.search("sunglasses")
117
117
  parse.emoji("rocket")
118
118
  parse.emoji.search("fire")
119
119
  ```
120
120
 
121
- NAICS paid deep records include classification `deep.exclusions`, each with a description and linked codes. Generic exclusions can have no linked codes. Omitted or null exclusions in older responses remain unknown. Search results also include `match`: the matched `field` (`name`, `term` or `naics`) and `text`, plus `corrections` with `from` and `to` tokens for typo fallback. Corrections are empty for exact, plural and prefix matches. Direct code lookups omit `match`. Older responses may omit it.
121
+ The existing NAICS lookup and search methods remain available as compatibility names for Industry.
122
+
123
+ Industry paid deep records include classification `deep.exclusions`, each with a description and linked codes. Generic exclusions can have no linked codes. Omitted or null exclusions in older responses remain unknown. Search results also include `match`: the matched `field` (`name`, `term` or `naics`) and `text`, plus `corrections` with `from` and `to` tokens for typo fallback. Corrections are empty for exact, plural and prefix matches. Direct code lookups omit `match`. Older responses may omit it.
122
124
 
123
125
  Responses are plain dicts, exactly the JSON the API returns. `country.states("US")` requests states directly; it does not fetch a country first. Required inputs are positional and optional behavior uses keyword arguments, leaving room for new options without changing existing calls. Reuse a client across calls. Use `with ParseAPI(...) as parse:` or call `parse.close()` when finished.
124
126
 
@@ -231,6 +233,12 @@ parse.weather(40.7128, -74.006, deep=True, date="2026-08-15")
231
233
 
232
234
  Tariff starts with the general schedule line. Paid deep adds units and the special and other schedule columns. An optional origin then resolves country-specific measures. The three calls below show those successive choices. Without origin, schedule detail is still returned and origin-dependent fields are null. A null effective rate is not a zero rate.
233
235
 
236
+ Tariff lookup and search accept an optional `edition` fingerprint and `date` (`YYYY-MM-DD`). The edition pins exact immutable source bytes. A date is accepted only when verified source coverage exists. An edition without a date returns undated schedule context (`date: null`). Default requests use today. Paid detail exposes an open-string `reason` when `effective_rate` is null, including `incomplete_coverage`. A null rate never means zero. Explicit selections fail with `tariff_selection_mismatch` if an older server ignores the requested scope.
237
+
238
+ Origin means where the goods originate, not where they ship from. The effective rate covers matched stored schedule measures only. It is not complete duty or landed cost.
239
+
240
+ Codes contain 4, 6, 8 or 10 ASCII digits; dots and whitespace are optional. Search returns up to 20 description matches with parent `lineage` so a result named "Other" has context. Search is not product classification. In deep, `measures: null` means origin-dependent measures were not resolved. `measures: []` means the resolved lookup found none.
241
+
234
242
  ```python
235
243
  parse.tariff("8471.30.01.00")
236
244
  parse.tariff("8471.30.01.00", deep=True)
@@ -241,6 +249,32 @@ Address search uses context from the form: prefer postal, or city and state. An
241
249
 
242
250
  HLR reports status at the last check. `live` means assigned and `connected` means reachable at that check. Cached results may be returned. Null means unconfirmed. Deep diagnostics stay within the same metered lookup.
243
251
 
252
+ Bank returns core `checks` for input, country, length, structure, checksum and national rules, plus an `issues` list. States are `passed`, `failed`, `not_checked` or `not_supported`. Unsupported national checking is not a failure. `valid` covers the implemented format and checksum rules, not account existence, ownership or payment reachability. Directory names and BICs may be null independently. Older responses may omit `checks` and `issues`, and future states and issue codes remain strings. Pass the original input unchanged so the API can report invalid characters. Deep `account` remains the BBAN remainder.
253
+
254
+ Bank inputs use `POST /bank` JSON bodies, keeping IBAN and account values out of request URLs. Pass original strings; the server owns normalization and validation. Avoid logging request bodies. IBAN deep can include `directory` with the immutable `edition`, resolved `country` and actual `match` grain (`bank`, `branch`, `prefix` or `none`); it is absent if no directory lookup ran. A match does not prove complete country coverage or payment reachability.
255
+
256
+ Use country requirements to build supported input fields. US ACH has an explicit helper with no deep option. It checks the routing format/ABA checksum and account-field syntax; `account_checksum` is `not_supported`. It preserves account characters and leading zeros. A nullable bank name is routing-directory identity, not account existence, ownership or ACH eligibility. The examples below are synthetic test inputs, not payment instructions.
257
+
258
+ ```python
259
+ parse.bank_requirements("US", format="us_ach")
260
+ parse.bank_us_ach(routing="011000015", account="0001234567")
261
+ ```
262
+
263
+ ## Provider lookup
264
+
265
+ ```python
266
+ provider = parse.provider("1881018208")
267
+ profile = parse.provider("1881018208", deep=True)
268
+ ```
269
+
270
+ Pass the original NPI as a string. `valid` checks its format and checksum; `registered` means a match in the stored NPPES snapshot. `active` reflects recorded NPI deactivation, not licensure. `excluded` is an NPI-only OIG LEIE match; `false` is not a complete exclusion clearance. These directory facts do not verify credentials, current practice contact or payment eligibility.
271
+
272
+ Invalid input returns `valid: false` with unknown provider fields. A checksum-valid number missing from the snapshot returns `registered: false`; unavailable storage remains an API error. Preserve `null` as unknown.
273
+
274
+ The default pooled lookup includes provider identity, specialty and practice contact where held. Paid `deep` adds `deactivated_at`, `medicare`, `opt_out` and `enrollments` from stored source files, with no separate check meter or live verification. `enrollments: null` means unavailable; `[]` means no enrollment rows are returned. The API omits unrequested `deep` and returns `{}` when requested on Free.
275
+
276
+ Paid Deep also returns `taxonomies` in published order, with taxonomy code, specialty label, primary flag and provider-reported license number/state, plus `enumerated_at`, `updated_at` and `reactivated_at` record dates. Reported licenses are not verified licenses. Null lists mean unavailable; empty lists mean the edition contains no entries. Core `sources` is available on every plan: NPPES, LEIE, PECOS and opt-out each have nullable edition metadata (`edition`, `published_at`, `through`, `imported_at`). Provider record dates are separate from source publication and completed import dates. Older responses may omit these additions. Edition details remain null until a verified source is served.
277
+
244
278
  ## Deep
245
279
 
246
280
  Choose enrichment for the question you need answered.
@@ -251,10 +285,11 @@ Choose enrichment for the question you need answered.
251
285
  | Domain | Registration dates, registrar, status and DNSSEC, included with a paid plan. Use `dns` for DNS records and `mx` for mail routing. |
252
286
  | Email | A metered mailbox check with deliverability, catch-all, status, reason and address hints, using included email checks or enabled on-demand usage. |
253
287
  | VAT | A metered registry check where supported, using included VAT checks or enabled on-demand usage. |
254
- | Phone, Time, Date, Currency, Language, Emoji, IBAN, Point | Optional detail in the same pooled request on every plan. |
288
+ | Phone, Time, Date, Currency, Language, Emoji, Bank, Point | Optional detail in the same pooled request on every plan. |
255
289
  | Country, State, District, City, Postal | The place profile on paid plans, including demographic and tax facts where held. |
256
- | Name, NAICS | Name evidence or the industry definition profile on paid plans. |
257
- | VIN, NPI, Tariff, Company | The complete product detail bag on paid plans. |
290
+ | Name, Industry | Name evidence or the industry definition profile on paid plans. |
291
+ | NPI | Deactivation date, Medicare enrollment, opt-out and enrollment rows from stored sources on paid plans. Exclusion evidence stays core. |
292
+ | Vehicle, Tariff, Company | The complete product detail bag on paid plans. |
258
293
  | Weather | Specialist current measurements and the existing forecast, alert, air and history bag on paid plans. |
259
294
  | Carrier, HLR | Optional diagnostic detail within the same metered core unit, including Free allowance units. No second gate or additional check. |
260
295
 
@@ -302,16 +337,40 @@ Ordinary lookups retry network failures, 429, and 500/502/503/504 responses twic
302
337
 
303
338
  An explicit client `retries` setting overrides those defaults; `retries=0` always makes one attempt. Another attempt can consume additional usage if the earlier response was lost. Cancelling an async task stops the call and any retry wait. Automatic redirects are disabled.
304
339
 
340
+ Automatic retries wait at most five seconds per attempt. A longer valid `Retry-After` returns the original API error immediately without retrying early. Read `retry_after` on the error for the original header, or null when absent.
341
+
305
342
  ## Docs
306
343
 
307
344
  Full field reference for every endpoint: [parseapi.com/docs](https://parseapi.com/docs)
308
345
 
309
- BIN lookup accepts 6-11 digits as a string, including leading zeros. Spaces and hyphens are accepted. `prefix` is the actual longest match and can be shorter than the input. Unknown reference fields are null. `deep` adds an empty object on every plan.
346
+ ## Card
310
347
 
348
+ Send 2–11 leading digits as a string. Core returns `bin`, `brand`, `brand_name`
349
+ and a CDN SVG `logo`. Brand detection uses reviewed network rules independently
350
+ of issuer records. Unknown or ambiguous prefixes return null brand fields and a
351
+ generic logo; a known network without reviewed artwork also uses the generic logo.
352
+
353
+ Optional Deep adds `prefix`, `issuer`, `country`, `type` and `prepaid`, included
354
+ in the same pooled request on every plan. Six or more digits enable directory
355
+ matching. Fewer digits return all-null Deep fields. Compare `deep.prefix` with
356
+ `bin`: equal is an exact recorded match; shorter is broader; null is no match.
357
+ The longest row wins, including null fields. `prepaid: null` means unknown, not
358
+ false. This is partial reference data, not card validity or payment acceptance.
359
+
360
+ ```python
361
+ card = parse.card("51")
362
+ print(card["brand"], card["logo"])
363
+ details = parse.card("43737400", deep=True)
364
+ print(details["deep"]["prefix"], details["deep"]["issuer"])
365
+ ```
366
+
367
+ Leading zeros are preserved. Only ASCII spaces, tabs, CR, LF and hyphens are
368
+ removed; raw input is limited to 64 characters. Invalid prefixes are rejected
369
+ before dispatch, accepted input is forwarded unchanged. Never send a full card number.
311
370
 
312
371
  ## Optional detail
313
372
 
314
- The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, NAICS and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep`; only the source has `deep.next_dst`.
373
+ The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Industry and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep`; only the source has `deep.next_dst`.
315
374
 
316
375
  ```python
317
376
  basic = parse.time("America/New_York")
@@ -333,3 +392,5 @@ Pass a public hostname without a scheme, path, port or IP address. Stack returns
333
392
  Successful checks may be reused for up to 24 hours. `pretty` optionally formats the wire JSON. Stack uses your plan's request allowance and API version 2.0.0 selected by this client.
334
393
 
335
394
  Stack defaults to a 35-second transport timeout so a first scan has time to finish. Other lookups retain their 10-second default. An explicit client timeout takes precedence.
395
+
396
+ Vehicle lookups use `vin` as the input and response field. Existing VIN methods remain available for compatibility.