# Quickstart (/quickstart)

This page takes you from a new account to a parsed address and a parcel match. You need an email address and a terminal.

<Steps>

<Step>

### Create an account [#create-an-account]

Go to [app.fieldgeist.com/sign-up](https://app.fieldgeist.com/sign-up) and enter your email. We email you a 6-digit code; enter it to sign in. There are no passwords.

The first time you sign in, the portal asks for your name and a team name. A team owns its API keys, usage and billing. Every new account starts with free credits.

</Step>

<Step>

### Create an API key [#create-an-api-key]

In the portal, open **API keys** and select **Create key**. Name it after where it will run, such as "Production server".

Copy the key when it appears. It starts with `fg_live_` and **is shown only once**. Store it in your secrets manager, then put it in an environment variable for this walkthrough:

```bash
export FIELDGEIST_API_KEY="fg_live_..."
```

</Step>

<Step>

### Parse an address [#parse-an-address]

<Tabs items={["cURL", "JavaScript", "Python"]}>
<Tab value="cURL">

```bash
curl https://api.fieldgeist.com/v1/verify/parse \
  -H "Authorization: Bearer $FIELDGEIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"line": "400 Broad St, Seattle, WA 98109"}'
```

</Tab>
<Tab value="JavaScript">

```js
const res = await fetch("https://api.fieldgeist.com/v1/verify/parse", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.FIELDGEIST_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    line: "400 Broad St, Seattle, WA 98109",
  }),
});
const parsed = await res.json();
console.log(parsed.components);
```

</Tab>
<Tab value="Python">

```python
import os
import requests

res = requests.post(
    "https://api.fieldgeist.com/v1/verify/parse",
    headers={"Authorization": f"Bearer {os.environ['FIELDGEIST_API_KEY']}"},
    json={"line": "400 Broad St, Seattle, WA 98109"},
    timeout=10,
)
parsed = res.json()
print(parsed["components"])
```

</Tab>
</Tabs>

The response splits the line into USPS Publication 28 components and renders the standardized delivery lines:

```json
{
  "input": "400 Broad St, Seattle, WA 98109",
  "type": "street",
  "components": {
    "city": "SEATTLE",
    "addressNumber": "400",
    "streetSuffix": "ST",
    "streetName": "BROAD",
    "state": "WA",
    "zip5": "98109"
  },
  "lines": ["400 BROAD ST", "SEATTLE WA  98109"],
  "warnings": [],
  "confidence": 0.9999376787822885,
  "model": { "name": "us-lex-1", "version": "0.1.0", "backend": "model" }
}
```

An empty `warnings` array and a confidence close to 1 mean the parse is clean. See [Confidence and warnings](/concepts/confidence-and-warnings) for what to do when they aren't.

</Step>

<Step>

### Match it to a parcel [#match-it-to-a-parcel]

Send the parse response, unchanged, to the lookup endpoint:

<Tabs items={["cURL", "JavaScript", "Python"]}>
<Tab value="cURL">

```bash
curl https://api.fieldgeist.com/v1/verify/parse \
  -H "Authorization: Bearer $FIELDGEIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"line": "400 Broad St, Seattle, WA 98109"}' \
| curl https://api.fieldgeist.com/v1/verify/lookup \
  -H "Authorization: Bearer $FIELDGEIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d @-
```

</Tab>
<Tab value="JavaScript">

```js
const match = await fetch("https://api.fieldgeist.com/v1/verify/lookup", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.FIELDGEIST_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(parsed),
}).then((r) => r.json());

console.log(match.status, match.fieldgeist_id);
```

</Tab>
<Tab value="Python">

```python
match = requests.post(
    "https://api.fieldgeist.com/v1/verify/lookup",
    headers={"Authorization": f"Bearer {os.environ['FIELDGEIST_API_KEY']}"},
    json=parsed,
    timeout=10,
).json()
print(match["status"], match["fieldgeist_id"])
```

</Tab>
</Tabs>

A `matched` answer carries one parcel:

```json
{
  "status": "matched",
  "fieldgeist_id": "adr_01JA2Z3Y4X5W6V7T8S9R0QPNMA",
  "building_id": null,
  "apn": "198520-0495",
  "fips": "53033",
  "lat": 47.620494,
  "lon": -122.349235,
  "matchConfidence": 1,
  "candidates": [],
  "searched": ["matchkey/v3.2/zip5=98109/part.parquet"],
  "readPath": "chunk",
  "fuzzy": false
}
```

<Callout type="info">
Parcel values in these docs are illustrative. Run the request to see the real parcel.
</Callout>

Store the `fieldgeist_id`. It's how you refer to this parcel later, and you can fetch it again with [Look up by Fieldgeist ID](/api-reference/lookup-by-id) at a lower price than a new lookup.

</Step>

</Steps>

## Next steps [#next-steps]

- [Handle every lookup status](/guides/parse-then-match): `ambiguous`, `unit_required` and `not_found` included.
- [Errors](/api-reference/errors): every error code the API returns.
- [Credits and billing](/billing): when a request is billed and how to control spend.
- Try addresses without writing code in the portal's **Verify** page. Its requests are billed like API requests.
