Skip to main content
POST
/
companies
Create company
curl --request POST \
  --url https://api.routera.io/companies \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "fields": {
    "external_id": "ext-001",
    "company_name": "Acme Corp",
    "description": "Example company",
    "industry": "Technology"
  }
}
'
{
  "id": "<string>",
  "external_id": "<string>",
  "company_name": "<string>",
  "description": "<string>",
  "industry": "<string>",
  "company_owner": "jane@example.com",
  "created_at": "2023-11-07T05:31:56Z",
  "updated_at": "2023-11-07T05:31:56Z",
  "archived": true,
  "archived_by": "<string>"
}

Endpoint

POST https://api.routera.io/companies
Route: /companies
Authentication: Bearer JWT

Request body

The body is a JSON object with a single fields property. Each key inside fields is a field internal_name (the same names returned in GET responses, not nested under fields in the response). Include every field you want to set on the new record.
{
  "fields": {
    "external_id": "ext-001",
    "company_name": "Acme Corp",
    "description": "Example company",
    "industry": "Technology"
  }
}
KeyDescription
fieldsRequired. Map of internal_name → value for this object type.
fields.external_idOptional. External identifier for sync with outside systems.
Custom fields configured in your account use the same key names inside fields.
Required on create: At least one of company_name or website_url. See API introduction for field types and validation rules.

Default response fields

201 returns a flat object with these properties:
PropertyDescription
idInternal object ID
company_nameCustom or system field (flat on the object)
descriptionCustom or system field (flat on the object)
industryCustom or system field (flat on the object)
company_ownerAssigned owner email
external_idExternal identifier (nullable)
archivedfalse when active; ISO timestamp when archived
created_at and updated_at are always included in every response (ISO 8601 UTC), even when not listed above. When an object is archived, archived_by is also included automatically.

Response example

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "external_id": "ext-001",
  "created_at": "2026-05-01T10:00:00.000Z",
  "updated_at": "2026-05-28T12:00:00.000Z",
  "archived": false,
  "company_name": "Acme Corp",
  "description": "Example company",
  "industry": "Technology",
  "company_owner": "jane@example.com"
}

Errors

StatusWhen
400Invalid JSON body, unknown field name, validation failure, or forbidden system field
401Missing account context
409Duplicate active record (email, website_url, or external_id)
500Internal server error

Authorizations

Authorization
string
header
required

Bearer JWT with valid account context.

Body

application/json

Write payload for POST create and PATCH update. Keys inside fields match field internal names returned in GET responses.

fields
object
required

Field values keyed by internal_name. Custom account fields use the same key names.

Response

Created

id
string
external_id
string | null
company_name
string | null
description
string | null
industry
string | null
company_owner
string | null

Assigned owner email

Example:

"jane@example.com"

created_at
string<date-time>
updated_at
string<date-time>
archived

false when active, or ISO timestamp when archived

archived_by
string