Skip to content

Create an organization location

POST
/organizations/{oid}/locations
curl --request POST \
--url https://apisandbox.puurk.com/organizations/example/locations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "name": "example", "address_line_1": "example", "address_line_2": "example", "city": "example", "state": "TX", "zip": "78701", "phone_number": "example", "email_address": "example", "is_primary": true, "sales_tax_rate": 0.0825, "eid": "example" }'

Creates a location. The organization’s first location is always primary, so a turnkey setup needs one call rather than two. Creating a later one with is_primary true moves the flag off every other location.

oid
required
string

Organization ID

Location fields

Media typeapplication/json

Body for POST /organizations/{oid}/locations. The six required fields must each be a non-empty string; the rest are optional. oid and id come from the path, and every other field — including photo_url and email_verified — is silently ignored rather than rejected.

The organization’s first location is always primary, so is_primary can be omitted. Sending is_primary false on the first location is a 400 rather than a silent override.

object
name
required
string
address_line_1
required
string
address_line_2
string
nullable
city
required
string
state
required

Two-letter US state or territory code. Accepted in any case and stored upper-cased — ca is read back as CA.

string
Example
TX
zip
required

12345 or 12345-6789

string
Example
78701
phone_number
required
string
email_address
string
nullable
is_primary
boolean
nullable
sales_tax_rate

Decimal fraction between 0 and 1 — 0.0825 for 8.25%, not 8.25.

number format: double
nullable
Example
0.0825
eid
string
nullable

Location created

Media typeapplication/json

A physical location of an organization. Onboarding reads the primary location: business_profile_complete needs ein, a logo and a location with is_primary true, and sales_tax_set needs sales_tax_rate on that location.

Every property is nullable — a location written before these endpoints existed may be missing any of them.

object
id

Unique identifier for the location

string
nullable
oid

Organization ID

string
nullable
eid

External identifier

string
nullable
name
string
nullable
address_line_1
string
nullable
address_line_2
string
nullable
city
string
nullable
state

Two-letter US state or territory code. Accepted in any case on a write and stored upper-cased — ca is read back as CA.

string
nullable
zip

12345 or 12345-6789

string
nullable
phone_number
string
nullable
email_address
string
nullable
is_primary

Exactly one location per organization is primary. The first location created is primary automatically.

boolean
nullable
sales_tax_rate

Decimal fraction between 0 and 1 — 0.0825 for 8.25%, not 8.25.

number format: double
nullable
photo_url

Set by Puurk; never accepted from a request body.

string
nullable
email_verified

Set by Puurk; never accepted from a request body.

boolean
nullable
Example
{
"name": "Main Street",
"address_line_1": "1 Main St",
"address_line_2": "Suite 200",
"city": "Austin",
"state": "TX",
"zip": "78701",
"phone_number": "5125551234",
"email_address": "main@example.com",
"sales_tax_rate": 0.0825
}

bad_request. One of: a non-object body; a string field that is not a string; an invalid state, zip, sales_tax_rate or is_primary; a required field that is missing, null or blank (Missing required field: <field> — an empty body reports name); or is_primary false on the organization’s first location, which is rejected rather than silently overridden.

Media typeapplication/json

The standard error body. error is a stable, machine-readable code — branch on it rather than on message, which is for humans and may change.

object
error

Machine-readable error code.

string
message

Human-readable detail.

string
Example
{
"error": "merchant_account_missing",
"message": "The organization has no merchant account. Complete Stripe Connect onboarding for this organization before generating pricing."
}

Unauthorized

forbidden — the token lacks the write action on organizations for this organization. Scope is checked before existence, so an unauthorized caller gets this rather than a 404.

Media typeapplication/json

The standard error body. error is a stable, machine-readable code — branch on it rather than on message, which is for humans and may change.

object
error

Machine-readable error code.

string
message

Human-readable detail.

string
Example
{
"error": "merchant_account_missing",
"message": "The organization has no merchant account. Complete Stripe Connect onboarding for this organization before generating pricing."
}

not_found — the organization does not exist.

Media typeapplication/json

The standard error body. error is a stable, machine-readable code — branch on it rather than on message, which is for humans and may change.

object
error

Machine-readable error code.

string
message

Human-readable detail.

string
Example
{
"error": "merchant_account_missing",
"message": "The organization has no merchant account. Complete Stripe Connect onboarding for this organization before generating pricing."
}