parseapi 1.7.0__tar.gz → 1.9.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 (30) hide show
  1. {parseapi-1.7.0 → parseapi-1.9.0}/CHANGELOG.md +12 -0
  2. {parseapi-1.7.0 → parseapi-1.9.0}/PKG-INFO +105 -15
  3. {parseapi-1.7.0 → parseapi-1.9.0}/README.md +104 -14
  4. {parseapi-1.7.0 → parseapi-1.9.0}/api/public.json +512 -0
  5. {parseapi-1.7.0 → parseapi-1.9.0}/pyproject.toml +1 -1
  6. {parseapi-1.7.0 → parseapi-1.9.0}/smoke/smoke.py +6 -6
  7. {parseapi-1.7.0 → parseapi-1.9.0}/src/parseapi/__init__.py +1 -1
  8. {parseapi-1.7.0 → parseapi-1.9.0}/src/parseapi/_client.py +216 -30
  9. parseapi-1.9.0/tests/bank-fixtures.json +92 -0
  10. parseapi-1.9.0/tests/test_bank.py +69 -0
  11. parseapi-1.9.0/tests/test_card_dx.py +120 -0
  12. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_client.py +33 -23
  13. parseapi-1.9.0/tests/test_company_directory.py +160 -0
  14. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_language.py +1 -1
  15. parseapi-1.9.0/tests/typing_company_directory.py +32 -0
  16. {parseapi-1.7.0 → parseapi-1.9.0}/.github/workflows/publish.yml +0 -0
  17. {parseapi-1.7.0 → parseapi-1.9.0}/.github/workflows/test.yml +0 -0
  18. {parseapi-1.7.0 → parseapi-1.9.0}/.gitignore +0 -0
  19. {parseapi-1.7.0 → parseapi-1.9.0}/LICENSE +0 -0
  20. {parseapi-1.7.0 → parseapi-1.9.0}/scripts/public_api.py +0 -0
  21. {parseapi-1.7.0 → parseapi-1.9.0}/src/parseapi/py.typed +0 -0
  22. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_email_enrichment.py +0 -0
  23. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_name_formatting.py +0 -0
  24. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_postal_localities.py +0 -0
  25. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_public_api.py +0 -0
  26. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_stack.py +0 -0
  27. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_tariff.py +0 -0
  28. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_time_complete.py +0 -0
  29. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_time_gaps.py +0 -0
  30. {parseapi-1.7.0 → parseapi-1.9.0}/tests/test_version.py +0 -0
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.0 — 2026-09-29
4
+
5
+ - Add Company stable-ID lookup, candidate search and coverage for the current public-company cohort.
6
+ - Preserve existing Company calls and all published compatibility methods.
7
+
8
+ ## 1.8.0 — 2026-09-25
9
+
10
+ - Add Bank diagnostics, POST requests, requirements and explicit US ACH helpers; Card Core and optional Deep; Provider; Industry; and Vehicle.
11
+ - Preserve published IBAN, BIN, NPI, NAICS and VIN methods and response types alongside the new names.
12
+ - Respect long Retry-After responses without retrying early and expose the raw header as optional error metadata.
13
+ - Retain released Time, Tariff, Postal and Elevation behavior. Expanded Company directory changes are deferred.
14
+
3
15
  ## 1.7.0 - 2026-09-24
4
16
 
5
17
  - Add exact Tariff edition/date selection, answering metadata, contextual search lineage and explanatory null reasons. Explicit selections reject unsupported or mismatched server responses.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parseapi
3
- Version: 1.7.0
3
+ Version: 1.9.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.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.
39
+ This SDK 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
 
@@ -66,6 +66,36 @@ Results are plain data. Pass a returned code or coordinate to another operation
66
66
 
67
67
  Use `parse.postal("28202", country="US", deep=True)` for US ZIP tax references. `deep.tax` names the levy and `deep.tax_rate` is a percentage, so `7.9` means 7.9%. The state, county, city and special components explain that combined rate. An exact address can differ. Country and state lookups provide their own geographic reference rates, which should not be added to the ZIP rate. `None` means unknown and `0` means known zero. Country `deep.tax_id_format` and `deep.tax_id_regex` describe registration-number format only. Use `vat` for a metered registration check with `deep` explicitly enabled.
68
68
 
69
+ ## Company directory
70
+
71
+ Find candidates, then fetch the profile you selected.
72
+
73
+ ```python
74
+ candidates = parse.company.search(query="GitLab", country="US", limit=5)
75
+ selected_id = "co_caczn6wf36hj" # Explicitly chosen after reviewing candidates.
76
+ profile = parse.company.id(selected_id, deep=True)
77
+ if candidates["next"] is not None:
78
+ next_page = parse.company.search(
79
+ query="GitLab", country="US", limit=5, cursor=candidates["next"]
80
+ )
81
+ coverage = parse.company.coverage()
82
+ ```
83
+
84
+ Use at most one selector: `query` for a name, `domain`, `ticker`, or `identifier`; country or exact industry filters also allow discovery without a selector. The API validates selectors and filters. Use `country` to scope candidates, `exchange` with a ticker, and `authority` with an identifier. Search returns `companies` and an opaque `next` cursor. Review candidate identity and match details before choosing a stable Company ID. Pass `next` as `cursor` with the same selector, filters and limit to continue that result set.
85
+
86
+ Directory profiles are plain JSON data. `deep` belongs to each company in search results and adds legal/reference detail plus nullable `description`, `logo`, `founded`, and the `social_profiles`, `phone_numbers`, `email_addresses`, `domains` and `sources` collections. A logo is a reported URL. `founded` has `value` and `precision`, distinct from incorporation. Sources identify the website, filing or business register, supported fields and observation/update timestamps. Employee observations retain count, measurement date, organization scope and approximation; null means unknown. Missing, null, empty and unknown fields retain their response values. An empty search is a successful result. Invalid inputs and unknown IDs raise the existing API error.
87
+
88
+ Company directory social profiles contain `platform`, `url` and `handle`; unknown metadata stays null. Phone and email records use `type` for the source-reported purpose. Earlier response fields remain readable by the client.
89
+
90
+ The recipe requests one candidate page, one explicitly chosen profile and directory coverage, plus a second page when a cursor is returned. Each operation uses the existing retry settings. The number-validation call remains unchanged. `lang` applies to national company-number lookup, while directory calls use the source labels.
91
+
92
+ `AsyncParseAPI` exposes the same `company`, `company.id`, `company.search` and `company.coverage` calls with `await`.
93
+
94
+ Discovery example: `parse.company.search(country="US", industry="0700", industry_type="sic")`
95
+
96
+ Supply `industry` and `industry_type` together. The supported namespace is `sic`, with an exact four-digit string such as `0700`; leading zeros are meaningful. Country-only discovery is also supported. Filters intersect and may narrow an existing selector. Country matches the profile country, not a headquarters or operating-presence claim. Unknown values do not match a requested filter. Filter-only candidates use `match.field: "filters"` and `match.value: null`; reuse the same filters and limit with a returned cursor. Counts describe this directory edition, not complete country coverage.
97
+
98
+
69
99
  ## Calls
70
100
 
71
101
  One method per endpoint, named after the route.
@@ -75,9 +105,9 @@ parse.ip("8.8.8.8")
75
105
  parse.ip.self()
76
106
  parse.email("hello@gmail.com")
77
107
  parse.vat("DE136695976")
78
- parse.iban("DE89370400440532013000")
79
- parse.bin("424242")
80
- parse.npi("1881018208")
108
+ parse.bank("DE89370400440532013000")
109
+ parse.card("424242")
110
+ parse.provider("1881018208")
81
111
  parse.phone("+14155552671")
82
112
  parse.carrier("+14155552671")
83
113
  parse.caller("+14155552671")
@@ -89,6 +119,11 @@ parse.postal.distance("28202", "10001", country="US")
89
119
  parse.address("1600 Pennsylvania Ave NW, Washington DC", country="US")
90
120
  parse.address.search("1600 Pennsylvania", country="US", postal="20500")
91
121
  parse.company("51 824 753 556", country="AU")
122
+ parse.company.id("co_caczn6wf36hj", deep=True)
123
+ parse.company.search(domain="about.gitlab.com")
124
+ parse.company.search(ticker="GTLB", exchange="Nasdaq")
125
+ parse.company.search(identifier="0001653482", authority="sec")
126
+ parse.company.coverage()
92
127
  parse.city("charlotte", country="US")
93
128
  parse.city.id("city_mb8mbqrkz8zb")
94
129
  parse.city.search("char", country="US", limit=10)
@@ -128,16 +163,18 @@ parse.mx("example.com")
128
163
  parse.dns("example.com")
129
164
  parse.dns("_dmarc.example.com", type="TXT")
130
165
  parse.useragent(ua_string)
131
- parse.vin("1HGCM82633A004352")
132
- parse.naics("541511")
133
- parse.naics.search("coffee shop", limit=5)
166
+ parse.vehicle("1HGCM82633A004352")
167
+ parse.industry("541511")
168
+ parse.industry.search("coffee shop", limit=5)
134
169
  parse.tariff("8471.30.01.00")
135
170
  parse.tariff.search("sunglasses")
136
171
  parse.emoji("rocket")
137
172
  parse.emoji.search("fire")
138
173
  ```
139
174
 
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.
175
+ The existing NAICS lookup and search methods remain available as compatibility names for Industry.
176
+
177
+ 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
178
 
142
179
  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
180
 
@@ -164,7 +201,7 @@ Choose display names for one request:
164
201
  parse.country("DE", lang="fr")
165
202
  ```
166
203
 
167
- `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, Company and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
204
+ `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, national Company number lookup and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
168
205
 
169
206
  The next call keeps its usual default unless it also supplies `lang`. Existing `deep` rules still apply. Date `format` and measurement `locale` remain explicit input-parsing controls.
170
207
 
@@ -266,6 +303,32 @@ Address search uses context from the form: prefer postal, or city and state. An
266
303
 
267
304
  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.
268
305
 
306
+ 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.
307
+
308
+ 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.
309
+
310
+ 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.
311
+
312
+ ```python
313
+ parse.bank_requirements("US", format="us_ach")
314
+ parse.bank_us_ach(routing="011000015", account="0001234567")
315
+ ```
316
+
317
+ ## Provider lookup
318
+
319
+ ```python
320
+ provider = parse.provider("1881018208")
321
+ profile = parse.provider("1881018208", deep=True)
322
+ ```
323
+
324
+ 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.
325
+
326
+ 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.
327
+
328
+ 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.
329
+
330
+ 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.
331
+
269
332
  ## Deep
270
333
 
271
334
  Choose enrichment for the question you need answered.
@@ -276,10 +339,11 @@ Choose enrichment for the question you need answered.
276
339
  | Domain | Registration dates, registrar, status and DNSSEC, included with a paid plan. Use `dns` for DNS records and `mx` for mail routing. |
277
340
  | Email | A metered mailbox check with deliverability, catch-all, status, reason and address hints, using included email checks or enabled on-demand usage. |
278
341
  | VAT | A metered registry check where supported, using included VAT checks or enabled on-demand usage. |
279
- | Phone, Time, Date, Currency, Language, Emoji, IBAN, Point | Optional detail in the same pooled request on every plan. |
342
+ | Phone, Time, Date, Currency, Language, Emoji, Bank, Point | Optional detail in the same pooled request on every plan. |
280
343
  | Country, State, District, City, Postal | The place profile on paid plans, including demographic and tax facts where held. |
281
- | Name, NAICS | Name evidence or the industry definition profile on paid plans. |
282
- | VIN, NPI, Tariff, Company | The complete product detail bag on paid plans. |
344
+ | Name, Industry | Name evidence or the industry definition profile on paid plans. |
345
+ | NPI | Deactivation date, Medicare enrollment, opt-out and enrollment rows from stored sources on paid plans. Exclusion evidence stays core. |
346
+ | Vehicle, Tariff, Company | The complete product detail bag on paid plans. |
283
347
  | Weather | Specialist current measurements and the existing forecast, alert, air and history bag on paid plans. |
284
348
  | Carrier, HLR | Optional diagnostic detail within the same metered core unit, including Free allowance units. No second gate or additional check. |
285
349
 
@@ -327,16 +391,40 @@ Ordinary lookups retry network failures, 429, and 500/502/503/504 responses twic
327
391
 
328
392
  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.
329
393
 
394
+ 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.
395
+
330
396
  ## Docs
331
397
 
332
398
  Full field reference for every endpoint: [parseapi.com/docs](https://parseapi.com/docs)
333
399
 
334
- 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.
400
+ ## Card
401
+
402
+ Send 2–11 leading digits as a string. Core returns `bin`, `brand`, `brand_name`
403
+ and a CDN SVG `logo`. Brand detection uses reviewed network rules independently
404
+ of issuer records. Unknown or ambiguous prefixes return null brand fields and a
405
+ generic logo; a known network without reviewed artwork also uses the generic logo.
406
+
407
+ Optional Deep adds `prefix`, `issuer`, `country`, `type` and `prepaid`, included
408
+ in the same pooled request on every plan. Six or more digits enable directory
409
+ matching. Fewer digits return all-null Deep fields. Compare `deep.prefix` with
410
+ `bin`: equal is an exact recorded match; shorter is broader; null is no match.
411
+ The longest row wins, including null fields. `prepaid: null` means unknown, not
412
+ false. This is partial reference data, not card validity or payment acceptance.
335
413
 
414
+ ```python
415
+ card = parse.card("51")
416
+ print(card["brand"], card["logo"])
417
+ details = parse.card("43737400", deep=True)
418
+ print(details["deep"]["prefix"], details["deep"]["issuer"])
419
+ ```
420
+
421
+ Leading zeros are preserved. Only ASCII spaces, tabs, CR, LF and hyphens are
422
+ removed; raw input is limited to 64 characters. Invalid prefixes are rejected
423
+ before dispatch, accepted input is forwarded unchanged. Never send a full card number.
336
424
 
337
425
  ## Optional detail
338
426
 
339
- 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`.
427
+ The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Company directory, 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` or each `targets` item; only the source has `deep.next_dst`.
340
428
 
341
429
  ```python
342
430
  basic = parse.time("America/New_York")
@@ -358,3 +446,5 @@ Pass a public hostname without a scheme, path, port or IP address. Stack returns
358
446
  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.
359
447
 
360
448
  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.
449
+
450
+ 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.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.
20
+ This SDK 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
 
@@ -47,6 +47,36 @@ Results are plain data. Pass a returned code or coordinate to another operation
47
47
 
48
48
  Use `parse.postal("28202", country="US", deep=True)` for US ZIP tax references. `deep.tax` names the levy and `deep.tax_rate` is a percentage, so `7.9` means 7.9%. The state, county, city and special components explain that combined rate. An exact address can differ. Country and state lookups provide their own geographic reference rates, which should not be added to the ZIP rate. `None` means unknown and `0` means known zero. Country `deep.tax_id_format` and `deep.tax_id_regex` describe registration-number format only. Use `vat` for a metered registration check with `deep` explicitly enabled.
49
49
 
50
+ ## Company directory
51
+
52
+ Find candidates, then fetch the profile you selected.
53
+
54
+ ```python
55
+ candidates = parse.company.search(query="GitLab", country="US", limit=5)
56
+ selected_id = "co_caczn6wf36hj" # Explicitly chosen after reviewing candidates.
57
+ profile = parse.company.id(selected_id, deep=True)
58
+ if candidates["next"] is not None:
59
+ next_page = parse.company.search(
60
+ query="GitLab", country="US", limit=5, cursor=candidates["next"]
61
+ )
62
+ coverage = parse.company.coverage()
63
+ ```
64
+
65
+ Use at most one selector: `query` for a name, `domain`, `ticker`, or `identifier`; country or exact industry filters also allow discovery without a selector. The API validates selectors and filters. Use `country` to scope candidates, `exchange` with a ticker, and `authority` with an identifier. Search returns `companies` and an opaque `next` cursor. Review candidate identity and match details before choosing a stable Company ID. Pass `next` as `cursor` with the same selector, filters and limit to continue that result set.
66
+
67
+ Directory profiles are plain JSON data. `deep` belongs to each company in search results and adds legal/reference detail plus nullable `description`, `logo`, `founded`, and the `social_profiles`, `phone_numbers`, `email_addresses`, `domains` and `sources` collections. A logo is a reported URL. `founded` has `value` and `precision`, distinct from incorporation. Sources identify the website, filing or business register, supported fields and observation/update timestamps. Employee observations retain count, measurement date, organization scope and approximation; null means unknown. Missing, null, empty and unknown fields retain their response values. An empty search is a successful result. Invalid inputs and unknown IDs raise the existing API error.
68
+
69
+ Company directory social profiles contain `platform`, `url` and `handle`; unknown metadata stays null. Phone and email records use `type` for the source-reported purpose. Earlier response fields remain readable by the client.
70
+
71
+ The recipe requests one candidate page, one explicitly chosen profile and directory coverage, plus a second page when a cursor is returned. Each operation uses the existing retry settings. The number-validation call remains unchanged. `lang` applies to national company-number lookup, while directory calls use the source labels.
72
+
73
+ `AsyncParseAPI` exposes the same `company`, `company.id`, `company.search` and `company.coverage` calls with `await`.
74
+
75
+ Discovery example: `parse.company.search(country="US", industry="0700", industry_type="sic")`
76
+
77
+ Supply `industry` and `industry_type` together. The supported namespace is `sic`, with an exact four-digit string such as `0700`; leading zeros are meaningful. Country-only discovery is also supported. Filters intersect and may narrow an existing selector. Country matches the profile country, not a headquarters or operating-presence claim. Unknown values do not match a requested filter. Filter-only candidates use `match.field: "filters"` and `match.value: null`; reuse the same filters and limit with a returned cursor. Counts describe this directory edition, not complete country coverage.
78
+
79
+
50
80
  ## Calls
51
81
 
52
82
  One method per endpoint, named after the route.
@@ -56,9 +86,9 @@ parse.ip("8.8.8.8")
56
86
  parse.ip.self()
57
87
  parse.email("hello@gmail.com")
58
88
  parse.vat("DE136695976")
59
- parse.iban("DE89370400440532013000")
60
- parse.bin("424242")
61
- parse.npi("1881018208")
89
+ parse.bank("DE89370400440532013000")
90
+ parse.card("424242")
91
+ parse.provider("1881018208")
62
92
  parse.phone("+14155552671")
63
93
  parse.carrier("+14155552671")
64
94
  parse.caller("+14155552671")
@@ -70,6 +100,11 @@ parse.postal.distance("28202", "10001", country="US")
70
100
  parse.address("1600 Pennsylvania Ave NW, Washington DC", country="US")
71
101
  parse.address.search("1600 Pennsylvania", country="US", postal="20500")
72
102
  parse.company("51 824 753 556", country="AU")
103
+ parse.company.id("co_caczn6wf36hj", deep=True)
104
+ parse.company.search(domain="about.gitlab.com")
105
+ parse.company.search(ticker="GTLB", exchange="Nasdaq")
106
+ parse.company.search(identifier="0001653482", authority="sec")
107
+ parse.company.coverage()
73
108
  parse.city("charlotte", country="US")
74
109
  parse.city.id("city_mb8mbqrkz8zb")
75
110
  parse.city.search("char", country="US", limit=10)
@@ -109,16 +144,18 @@ parse.mx("example.com")
109
144
  parse.dns("example.com")
110
145
  parse.dns("_dmarc.example.com", type="TXT")
111
146
  parse.useragent(ua_string)
112
- parse.vin("1HGCM82633A004352")
113
- parse.naics("541511")
114
- parse.naics.search("coffee shop", limit=5)
147
+ parse.vehicle("1HGCM82633A004352")
148
+ parse.industry("541511")
149
+ parse.industry.search("coffee shop", limit=5)
115
150
  parse.tariff("8471.30.01.00")
116
151
  parse.tariff.search("sunglasses")
117
152
  parse.emoji("rocket")
118
153
  parse.emoji.search("fire")
119
154
  ```
120
155
 
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.
156
+ The existing NAICS lookup and search methods remain available as compatibility names for Industry.
157
+
158
+ 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
159
 
123
160
  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
161
 
@@ -145,7 +182,7 @@ Choose display names for one request:
145
182
  parse.country("DE", lang="fr")
146
183
  ```
147
184
 
148
- `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, Company and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
185
+ `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, national Company number lookup and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
149
186
 
150
187
  The next call keeps its usual default unless it also supplies `lang`. Existing `deep` rules still apply. Date `format` and measurement `locale` remain explicit input-parsing controls.
151
188
 
@@ -247,6 +284,32 @@ Address search uses context from the form: prefer postal, or city and state. An
247
284
 
248
285
  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.
249
286
 
287
+ 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.
288
+
289
+ 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.
290
+
291
+ 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.
292
+
293
+ ```python
294
+ parse.bank_requirements("US", format="us_ach")
295
+ parse.bank_us_ach(routing="011000015", account="0001234567")
296
+ ```
297
+
298
+ ## Provider lookup
299
+
300
+ ```python
301
+ provider = parse.provider("1881018208")
302
+ profile = parse.provider("1881018208", deep=True)
303
+ ```
304
+
305
+ 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.
306
+
307
+ 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.
308
+
309
+ 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.
310
+
311
+ 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.
312
+
250
313
  ## Deep
251
314
 
252
315
  Choose enrichment for the question you need answered.
@@ -257,10 +320,11 @@ Choose enrichment for the question you need answered.
257
320
  | Domain | Registration dates, registrar, status and DNSSEC, included with a paid plan. Use `dns` for DNS records and `mx` for mail routing. |
258
321
  | Email | A metered mailbox check with deliverability, catch-all, status, reason and address hints, using included email checks or enabled on-demand usage. |
259
322
  | VAT | A metered registry check where supported, using included VAT checks or enabled on-demand usage. |
260
- | Phone, Time, Date, Currency, Language, Emoji, IBAN, Point | Optional detail in the same pooled request on every plan. |
323
+ | Phone, Time, Date, Currency, Language, Emoji, Bank, Point | Optional detail in the same pooled request on every plan. |
261
324
  | Country, State, District, City, Postal | The place profile on paid plans, including demographic and tax facts where held. |
262
- | Name, NAICS | Name evidence or the industry definition profile on paid plans. |
263
- | VIN, NPI, Tariff, Company | The complete product detail bag on paid plans. |
325
+ | Name, Industry | Name evidence or the industry definition profile on paid plans. |
326
+ | NPI | Deactivation date, Medicare enrollment, opt-out and enrollment rows from stored sources on paid plans. Exclusion evidence stays core. |
327
+ | Vehicle, Tariff, Company | The complete product detail bag on paid plans. |
264
328
  | Weather | Specialist current measurements and the existing forecast, alert, air and history bag on paid plans. |
265
329
  | Carrier, HLR | Optional diagnostic detail within the same metered core unit, including Free allowance units. No second gate or additional check. |
266
330
 
@@ -308,16 +372,40 @@ Ordinary lookups retry network failures, 429, and 500/502/503/504 responses twic
308
372
 
309
373
  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.
310
374
 
375
+ 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.
376
+
311
377
  ## Docs
312
378
 
313
379
  Full field reference for every endpoint: [parseapi.com/docs](https://parseapi.com/docs)
314
380
 
315
- 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.
381
+ ## Card
382
+
383
+ Send 2–11 leading digits as a string. Core returns `bin`, `brand`, `brand_name`
384
+ and a CDN SVG `logo`. Brand detection uses reviewed network rules independently
385
+ of issuer records. Unknown or ambiguous prefixes return null brand fields and a
386
+ generic logo; a known network without reviewed artwork also uses the generic logo.
387
+
388
+ Optional Deep adds `prefix`, `issuer`, `country`, `type` and `prepaid`, included
389
+ in the same pooled request on every plan. Six or more digits enable directory
390
+ matching. Fewer digits return all-null Deep fields. Compare `deep.prefix` with
391
+ `bin`: equal is an exact recorded match; shorter is broader; null is no match.
392
+ The longest row wins, including null fields. `prepaid: null` means unknown, not
393
+ false. This is partial reference data, not card validity or payment acceptance.
316
394
 
395
+ ```python
396
+ card = parse.card("51")
397
+ print(card["brand"], card["logo"])
398
+ details = parse.card("43737400", deep=True)
399
+ print(details["deep"]["prefix"], details["deep"]["issuer"])
400
+ ```
401
+
402
+ Leading zeros are preserved. Only ASCII spaces, tabs, CR, LF and hyphens are
403
+ removed; raw input is limited to 64 characters. Invalid prefixes are rejected
404
+ before dispatch, accepted input is forwarded unchanged. Never send a full card number.
317
405
 
318
406
  ## Optional detail
319
407
 
320
- 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`.
408
+ The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Company directory, 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` or each `targets` item; only the source has `deep.next_dst`.
321
409
 
322
410
  ```python
323
411
  basic = parse.time("America/New_York")
@@ -339,3 +427,5 @@ Pass a public hostname without a scheme, path, port or IP address. Stack returns
339
427
  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.
340
428
 
341
429
  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.
430
+
431
+ Vehicle lookups use `vin` as the input and response field. Existing VIN methods remain available for compatibility.