Draft: Addrexy is not live yet. It will run at https://addrexy.com as a tenant of the white-label developer portal. In version 1 the portal and its documentation are those of the existing white-label tenant at https://intodq2.devapicloud.com; the API and the documentation are the same. TBD marks something not yet decided. Not documented marks something the white-label documentation does not say.

Build: call the APIs

Base URL: https://api.devapicloud.com/v1. All calls are POST with Content-Type: application/json, Basic authentication, and an X-Session-Token. See /agent/start. The full contract is /openapi.json.

In this page, "API documentation says" means the white-label API's own documentation. "Addrexy guidance" is our advice for software. The API itself returns only the fields shown.

CallEndpointOperation idPlanned MCP tool
Suggest addresses as someone typesPOST /autocomplete/suggestsuggestAddressesautocomplete_address
Verify one addressPOST /address/verifyverifyAddressverify_address
Address to latitude and longitudePOST /address/geocodegeocodeAddressgeocode_address
Latitude and longitude to addressPOST /address/reverse-geocodereverseGeocodereverse_geocode

MCP (planned, not built). A thin pass-through MCP server is planned. It will forward your key and secret to the endpoints above, create the X-Session-Token for you, and return the API's JSON unchanged. It adds no fields and no state. Its address is TBD. Until it exists, call the REST API.

If your caller is a browser. The key and secret must stay on a server, so a browser cannot call the API directly. Put a small proxy on your server that holds the credentials and forwards each request. The proxy sends the X-Session-Token (create it when the field gets focus and pass it from the browser to the proxy) and should rate-limit and authenticate its own callers, or anyone can spend your credits.

Autocomplete

Call it as someone types. Debounce at 200 ms, start at 3 characters, and reuse one X-Session-Token for the whole search session.

Request:

{
  "query": { "addressInput": "20 W 34th", "countryCode": "USA" },
  "settings": { "candidateLimit": 5, "includeDetails": true, "language": "en_US" }
}
FieldRequiredNotes
query.addressInputyesWhat has been typed. A plain string, 3 to 200 characters.
query.countryCodeyesISO 3166-1 alpha-3, for example USA. Case-insensitive (usa is accepted).
settings.candidateLimitno1 to 50. Default 5.
settings.includeDetailsnotrue returns addressComponents and suggestedAddressLines. They are null otherwise. Use true when you fill a form. Default false.
settings.languagenoA locale code in the format the API's examples use, such as en_US or fr_FR. Defaults to the country's locale.
settings.searchTypenoADDRESS (default) or PLACES for named places such as landmarks.
settings.originCoordinatesno[longitude, latitude]. Ranks nearby results first.
settings.searchRadiusno{ "value": 5000, "unit": "METER" }. Needs originCoordinates, or you get INVALID_PARAMETER.
settings.searchScopenoFilter or bias results by city and postcode. type is filter or bias. exclude is only valid with filter.

Response:

{
  "requestId": "req_03kz2p8qxy",
  "result": {
    "status": "OK",
    "message": "",
    "meta": { "language": "en_US", "candidateLimit": 5, "countryCode": "USA", "enrichmentFields": { "requested": [], "granted": [] } },
    "suggestions": [
      {
        "displayText": "20 W 34th St, New York, NY 10118, United States",
        "suggestedAddressLines": ["20 W 34th St", "New York, NY 10118", "United States"],
        "postalDeliverable": true,
        "addressComponents": { "houseNumber": "20", "thoroughfare": "W 34th St", "city": "New York", "district": "New York County", "region": "New York", "neighborhood": "", "postcode": "10118", "postcodeExtension": "", "unit": "", "unitType": "", "countryCode": "USA" },
        "enrichment": null,
        "places": null
      }
    ]
  }
}

Verify

One address in, one answer out. Synchronous. Addrexy guidance: with the Option 1 data behind Addrexy, verify checks that an address *could* exist. It does not confirm that it does. Treat a high matchScore and deliverable: true as plausible, not proven. Check country coverage first.

Request:

{
  "query": { "address": "20 W 34th St, New York NY 10118", "countryCode": "USA" },
  "settings": { "language": "en_US", "matchLevel": "STANDARD" }
}
FieldRequiredNotes
query.addressyesThe whole address as one string, up to 500 characters.
query.countryCodeyesISO 3166-1 alpha-3. Accepted in any case.
query.referenceIdnoYour own id for this record, up to 100 characters. It comes back in result.meta.referenceId.
query.houseNumber (20), thoroughfare (150), placeName (100), unitType (10), unit (20), suburb (100), city (100), district (100), postcode (20), region (100)noStructured parts, with their maximum lengths. When you have them, send them as well as address: they take precedence over the same part parsed from address.
settings.languagenoA locale code such as en_US.
settings.matchLevelnoEXACT (tight match, fewest candidates, fewest false positives), STANDARD (default), or RELAXED (loose match: finds more but returns more multiple matches and is slower).
settings.includeComponentDetailnoDefault true. If false, componentMatches is empty and only matchType is returned. Then you cannot apply the rules below that read component values (scores 2 and 4). Set false only if you branch on matchScore alone.
settings.returnParsedInputnoDefault false. Returns how your input was tokenised. Use it only to diagnose a score of 0.

Response:

{
  "result": {
    "status": "OK",
    "message": "",
    "meta": { "requestId": "req_03kz2p8qxy", "referenceId": null, "language": "en_US", "countryCode": "USA" },
    "matchScore": 4,
    "deliverable": true,
    "addressType": "COMMERCIAL",
    "address": {
      "formatted": "20 W 34th St, New York, NY 10118",
      "addressLines": ["20 W 34th St", "New York, NY 10118", "United States"],
      "components": { "houseNumber": "20", "thoroughfare": "W 34th St", "placeName": "", "unitType": "", "unit": "", "city": "New York", "suburb": "", "district": "New York County", "postcode": "10118", "postcodeExt": "", "region": "New York", "adminAreaCode": "US-NY", "countryCode": "USA" },
      "nationalId": null
    },
    "matchDetails": {
      "matchType": "ADDRESS",
      "componentMatches": {
        "houseNumber": { "value": 4, "meaning": "Verified without changes" },
        "thoroughfare": { "value": 4, "meaning": "Verified without changes" },
        "city": { "value": 4, "meaning": "Verified without changes" },
        "district": { "value": 6, "meaning": "Appended using reference data" },
        "postcode": { "value": 4, "meaning": "Verified without changes" },
        "region": { "value": 3, "meaning": "Verified and corrected" },
        "countryCode": { "value": 4, "meaning": "Verified without changes" }
      }
    },
    "parsed": null
  }
}

This example has a matchScore of 4: the address matched, and region was corrected (NY became New York) and district was filled in.

FieldMeaning
result.matchScoreInteger 0 to 5. The signal to branch on. A score of 0 is still HTTP 200.
result.deliverabletrue: confirmed as a postal delivery point. false: cannot be confirmed deliverable.
result.addressTypeRESIDENTIAL, COMMERCIAL, INDUSTRIAL, PO_BOX, UNKNOWN, or null where classification data is unavailable.
result.addressThe standardised address. Use this, not your input. It may be corrected. Components that do not apply are "", never null.
result.matchDetailsHow the score was reached. See below.

What address, deliverable and addressType contain at matchScore 0 is not documented. Do not rely on them at that score.

There is no confidence percentage. Do not turn matchScore into one.

What to do for each matchScore

Use the middle column when a person is present in your application (for example a customer at a checkout). Use the right column when no person is available while your task runs.

ScoreAPI documentation says (a person is present)Addrexy guidance (no person available)
5Proceed. Use result.address downstream. No user interaction needed.Proceed. Store result.address and the request id.
4Proceed. Minor normalisation; silent acceptance is fine.Proceed. Log the components with value 3 (corrected).
3Review. Show the user the corrected address and ask for confirmation.Do not treat it as verified. Queue it for human review. Do not wait for an answer.
2Flag to the user. Show which components were not found. Allow manual override with confirmation.Do not use it. Queue it for human review, with the components whose value is 0.
1Prompt for re-entry. Do not use for delivery without manual verification.Reject. Ask the source for a fuller address.
0Block submission and prompt for re-entry. Never block silently.Reject and report that no match was found. Do not retry with guessed variations.

"Queue for human review" means: put the record, its request id and the reason in a list a person will look at. You choose where it lives. The service has no review queue.

Reading matchDetails

matchType is the deepest level the match reached. The score is how confident the match is; the type is how deep that confidence goes. The ranges below are the API documentation's "typical" ranges, not guarantees.

matchTypeMeaningTypical matchScore
ADDRESSConfirmed to building or door level. Usable for delivery.4 to 5
STREETThe street exists, but the delivery point could not be resolved.2 to 3
LOCALITYConfirmed only to city or suburb. The street could not be verified.1 to 2
POSTAL_CODEConfirmed only to the postcode area.0 to 1

Each entry in componentMatches has a value. There are four, and no others:

valueMeaning
0Not found or empty.
3Verified and corrected: the API changed what you sent. result.address holds the right value.
4Verified without changes: an exact match.
6Appended: you did not send it; it was filled in from reference data. Reliable, but not yours.

Which components appear in componentMatches is not documented beyond the example. The API does not return your original value, so compare against your input to see what changed.

From a suggestion to a verified address

After the user picks a suggestion, call verify. Send the suggestion's displayText as query.address and query.countryCode, and add the structured parts from addressComponents where they map. The names differ between the two APIs:

Autocomplete addressComponentsVerify query
houseNumber, thoroughfare, city, district, region, postcode, unit, unitTypethe same names
neighborhoodsuburb (Addrexy mapping, not documented)
postcodeExtensioninclude it in postcode (verify returns it as postcodeExt)

Store result.address from verify, not the suggestion. If you also need coordinates, pass the verified result.address.components (plus countryCode) into forward geocode.

Forward geocode

Address in, coordinates out. Synchronous. The query fields are the same as verify, so you can pass the verified address.components straight in. For best results run verify first.

Request:

{
  "query": {
    "address": "20 W 34th St, New York NY 10118",
    "houseNumber": "20",
    "thoroughfare": "W 34th St",
    "city": "New York",
    "region": "NY",
    "countryCode": "USA"
  },
  "settings": { "language": "en_US", "matchLevel": "STANDARD" }
}
FieldRequiredNotes
query.address, query.countryCodeyesAs for verify.
query.referenceId and the structured parts (houseNumber, thoroughfare, placeName, unitType, unit, suburb, city, district, postcode, region)noAs for verify. Structured parts take precedence over the same part parsed from address.
settings.matchLevelnoEXACT, STANDARD (default) or RELAXED (more candidates; useful for ambiguous input).
settings.searchTypenoHow deep to resolve. ADDRESS (default): a delivery point. POSTAL: a postcode centroid. GEOGRAPHIC: a city or region centroid.
settings.maxCandidatesno1 to 10. Default 1.
settings.geohashPrecisionno1 to 12. Default 9. Length of coordinates.geohash.
settings.h3Resolutionno0 to 15. Default 9. Resolution of coordinates.h3Index.
settings.languagenoA locale code such as en_US.

Response shape (the documentation gives no sample response, so none is shown here): result.status, result.meta (requestId, referenceId, language, countryCode) and result.candidates, an array ordered by matchScore, highest first. An empty array means no match. It is HTTP 200, not an error. Each candidate has:

FieldMeaning
matchScore0 to 5, the same scale as verify.
matchPrecision0 to 100. A finer score for your own accept or reject threshold.
addressThe standardised address (formatted, addressLines, components), the same structure as verify. Use this, not your input.
coordinates.latitude, coordinates.longitudeDecimal degrees, WGS 84 (EPSG:4326). No other coordinate system is offered.
coordinates.geohash, coordinates.h3IndexThe same point as a geohash and an H3 cell.
coordinates.locationTypeHow precise the point is. See below.
coordinates.locationDescriptionWhere the point sits: POSTAL_BUILDING, BUILDING, FRONT_DOOR, DRIVEWAY, PARCEL, POINT_OF_INTEREST, STREET_BLOCK or POSTAL_CODE.
matchDetailsmatchType (ADDRESS, STREET, LOCALITY, POSTAL_CODE) and componentMatches, as for verify.

locationType values: ADDRESS_POINT, INTERSECTION, ADDRESS_INTERPOLATED, NEAR_BY_ADDRESS, STREET, POSTAL, POSTAL_CENTROID, TOWN_CENTROID, CITY, COUNTRY, NO_LOCATION, POI. The first is the most precise. POSTAL_CENTROID, TOWN_CENTROID, CITY and COUNTRY are the middle of an area, not an address.

Read three things together: matchScore, matchDetails.matchType and coordinates.locationType. The documentation warns that a high score at POSTAL_CODE depth is not building-level accuracy.

What to do for each geocode matchScore

The middle column is the API documentation's guidance. The right column is Addrexy guidance for software with no person available.

ScorematchPrecisionAPI documentation saysAddrexy guidance (no person available)
585 to 100Reliable for navigation and last-mile delivery.Use the coordinates. Still check locationType is a point, not a centroid.
465 to 84Suitable for most operational use.Use the coordinates for operations. Check locationType.
345 to 64Usable for general mapping; review before critical workflows.Use for display only. Do not route or dispatch on it. Queue for review.
225 to 44Street or locality level. Do not use for delivery without manual verification.Do not use. Queue for human review.
11 to 24A postcode or region centroid. Flag for manual review.Do not use as a location. Report it.
00No match. Discard the candidate. Do not use the coordinates.Discard. Do not retry with guessed variations.

Reverse geocode

Coordinates in, address out. Synchronous.

Request:

{
  "query": { "latitude": 40.7484, "longitude": -73.9857, "countryCode": "USA" },
  "settings": { "searchRadius": { "value": 150, "unit": "METER" }, "maxCandidates": 1, "language": "en_US" }
}
FieldRequiredNotes
query.latitudeyesDecimal degrees, WGS 84, from -90 to 90.
query.longitudeyesDecimal degrees, WGS 84, from -180 to 180.
query.countryCodenoISO 3166-1 alpha-3. Recommended: it constrains the search and helps near borders. If omitted, the country is resolved from the coordinates.
query.referenceIdnoYour own id, up to 100 characters. It comes back in result.meta.referenceId.
settings.searchRadiusno{ "value": 150, "unit": "METER" } is the default. Units: METER, KILOMETER, FOOT, MILE. Needs both value and unit.
settings.maxCandidatesno1 to 5. Default 1.
settings.languagenoA locale code such as en_US.

The response uses the same envelope as forward geocode: result.status, result.meta and result.candidates (the documentation gives no sample response). Each candidate has address (the same structure as above) and coordinates, which has everything forward geocode returns plus:

FieldMeaning
coordinates.designationWhere the matched point sits relative to the address footprint: ROOFTOP, CENTROID, RANGE_INTERPOLATED, GEOMETRIC_CENTER or APPROXIMATE. ROOFTOP is the most precise.
coordinates.distanceMetersMetres between your point and the matched address point.

coordinates.latitude and longitude are the matched address point, which may differ slightly from the point you sent. Decide your own tolerance for distanceMeters and reject candidates beyond it. The documentation does not say whether reverse geocode returns matchScore, matchPrecision or matchDetails, so do not rely on them.

Where the API documentation contradicts itself

These are the places an agent could be misled. Follow the right-hand column.

The documentation saysWhat to do
"requestId is in the response header, not the body."Its own examples show requestId in the autocomplete body and result.meta.requestId in the verify body. Read the X-Request-Id header, which is always sent; use the body value as a fallback.
The verify field table lists result.candidates[].matchPrecision, and a places object.Neither appears in the verify example. They look copied from other APIs. Do not expect them from verify.
The error envelope says "See Part 5 for the full catalogue".The catalogue is in the Error Reference (Part 7). See /agent/operate.
The autocomplete path was /address/suggest in the June 2026 documentation.The August 2026 documentation says /autocomplete/suggest. Use that. If it returns 404, try the old path and report it.

Rules while building

Next

Errors, retries, limits: /agent/operate.