Properties API
Store your listing inventory once — geocoded, jurisdiction-mapped, with tax-driver defaults — so bookings can reference a property_id instead of repeating every field.
Why properties
A managed property is a durable, org-scoped record of one listing: its address, the jurisdiction TaxLens resolved for it, mapping confidence, and tax-driver defaults (property type, classification, star rating, tax postal code) plus optional default legal issuers for invoicing. When a booking passes property_id, TaxLens fills any omitted calculation and issuer fields from the property. Remapping a property affects future bookings only — persisted booking and invoice snapshots stay frozen. See the dashboard view in Properties and the getting-started walk-through in Add your first property.
Create a property
POST /v1/properties geocodes the address, resolves the closest jurisdiction, and stores the mapping. The most useful fields:
| Field | Type | Description |
|---|---|---|
| namerequired | string | Display name for the property. |
| address_line1required | string | Street address used for geocoding. |
| country_coderequired | string | ISO 3166-1 alpha-2 country code. |
| city / region / postal_code | string | Locality detail that sharpens geocoding. |
| jurisdiction_code | string | Pin the jurisdiction deterministically when you already know the exact local code, instead of relying on the geocoder. |
| external_reference | string | Your PMS / channel-manager listing ID, for reconciliation. |
| property_type / star_rating / property_postal_code | mixed | Tax-driver defaults that prefill future bookings from this property. |
| default_legal_issuer_id | integer | Org-owned legal issuer used as the property default seller when a booking omits legal_issuer_id. Setting or changing it requires org-admin permissions. |
| default_supplier_legal_issuer_id | integer | Org-owned host/owner issuer used as the property default supplier for self-billed (389) flows. Org-admin gated. |
curl -X POST https://api.taxlens.getdynamiq.ai/v1/properties \
-H "X-API-Key: $TAXLENS_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_reference": "PMS-HOTEL-42",
"name": "Downtown Hotel",
"address_line1": "350 5th Ave",
"city": "New York",
"region": "NY",
"postal_code": "10118",
"country_code": "US",
"jurisdiction_code": "US-NY-NYC",
"property_type": "hotel",
"star_rating": 4,
"default_legal_issuer_id": 7
}'{
"id": 42,
"external_reference": "PMS-HOTEL-42",
"name": "Downtown Hotel",
"jurisdiction_code": "US-NY-NYC",
"jurisdiction_confidence": "high",
"mapping_status": "mapped",
"tax_driver_status": "complete",
"property_type": "hotel",
"star_rating": 4,
"default_legal_issuer_id": 7
}mapping_status (mapped / unresolved / stale) and jurisdiction_confidence after create. An unresolved property won't prefill a jurisdiction, so bookings against it must supply their own.Bulk import
Importing a whole portfolio? POST /v1/properties/bulk-map creates up to 500 properties in one request — the recommended path for a PMS or channel-manager listing sync. Each row supports the same fields as a single create, and org-admin permissions are required only when a row sets a non-null legal issuer default.
curl -X POST https://api.taxlens.getdynamiq.ai/v1/properties/bulk-map \
-H "X-API-Key: $TAXLENS_KEY" \
-H "Content-Type: application/json" \
-d '{
"properties": [
{ "external_reference": "LIST-ROME-1", "name": "Rome Host Unit",
"address_line1": "Via del Corso 1", "city": "Rome", "country_code": "IT",
"property_type": "vacation_rental" },
{ "external_reference": "LIST-BCN-1", "name": "Barcelona Loft",
"address_line1": "Carrer de Mallorca 200", "city": "Barcelona", "country_code": "ES",
"property_type": "apartment" }
]
}'Fetch one property
GET /v1/properties/{property_id} returns a single property with richer detail than the list: alongside every list field it adds the resolved jurisdiction, its full ancestors chain (country → state → city → …), and the tax_driver_hints — the tax-driver fields that prefill bookings from this property. Use it to confirm a tricky address resolved to the place you expected.
curl https://api.taxlens.getdynamiq.ai/v1/properties/42 \
-H "X-API-Key: $TAXLENS_KEY"Update a property
PATCH /v1/properties/{property_id} partially updates a stored property — this is the right way to correct an address, fix a tax driver, or pin a jurisdiction. Send only the fields you want to change; every field is optional and omitted fields are left untouched. When you change an address field (address_line1, city, region, postal_code, country_code) or jurisdiction_code, TaxLens re-maps the property automatically as part of the same request — you don't need a separate remap call after an address fix.
| Field | Type | Description |
|---|---|---|
| address_line1 / city / region / postal_code / country_code | string | Address fields. Changing any of them re-geocodes and re-maps the property in place. |
| jurisdiction_code | string | Re-pin the jurisdiction deterministically; sending null clears the pin and falls back to the geocoder. |
| property_type / property_classification / star_rating / property_postal_code | mixed | Tax-driver defaults that prefill future bookings. |
| external_reference / name / metadata | mixed | Identity and reconciliation fields. |
| default_legal_issuer_id / default_supplier_legal_issuer_id | integer | Property issuer defaults. Setting or changing either to a non-null value is fiscal configuration and requires org-admin permissions. |
# Correct the address — this re-maps the property in the same call
curl -X PATCH https://api.taxlens.getdynamiq.ai/v1/properties/42 \
-H "X-API-Key: $TAXLENS_KEY" \
-H "Content-Type: application/json" \
-d '{
"address_line1": "20 W 34th St",
"postal_code": "10001"
}'remap endpoint below is for re-running geocoding when the address is unchanged — e.g. clearing a stale mapping. Either way the refreshed mapping applies to future bookings only; persisted booking and invoice snapshots stay frozen.List & remap
List your inventory with GET /v1/properties (filter by mapping_status, country_code, and more — paginated with items + total). Re-run geocoding for one property with POST /v1/properties/{property_id}/remap when its address is already correct but the mapping needs a refresh; the refreshed mapping applies to future bookings while existing snapshots remain frozen.
# List mapped US properties
curl "https://api.taxlens.getdynamiq.ai/v1/properties?mapping_status=mapped&country_code=US" \
-H "X-API-Key: $TAXLENS_KEY"
# Re-run geocoding for one property whose address is already current
curl -X POST https://api.taxlens.getdynamiq.ai/v1/properties/42/remap \
-H "X-API-Key: $TAXLENS_KEY"List your organization's managed properties (read-only).
Sign in to run this against the live API. Read-only — nothing is saved.
{ property_id, calculation: { stay_date, nightly_rate, currency, nights } } — the property supplies the jurisdiction and tax drivers. Continue to Bookings API.