Seal Docs

Contacts API

Manage your workspace contact directory via the Seal REST API

Contacts API

The Contacts API provides full CRUD access to your workspace's contact directory. Contacts represent people you frequently send documents to — storing their details centrally so you don't need to re-enter them for every document.

The Contact Object

Attributes

AttributeTypeDescription
idstringUnique contact identifier
first_namestringFirst name
last_namestringLast name
full_namestringFull name (first + last)
emailstringEmail address
phonestringPhone number (optional)
companystringCompany or organization (optional)
titlestringJob title (optional)
statusstringContact status: active, inactive, or lead
notesstringFree-form notes (optional)
tagsstring[]Tags for categorization (optional)
last_contacted_atstringISO 8601 timestamp of last contact (optional)
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last update timestamp

Example Object

{
  "id": "con_abc123",
  "first_name": "Jane",
  "last_name": "Smith",
  "full_name": "Jane Smith",
  "email": "jane@acme.com",
  "phone": "+1-555-0100",
  "company": "ACME Corp",
  "title": "VP Operations",
  "status": "active",
  "notes": "Met at legal tech conference 2024",
  "tags": ["vip", "enterprise"],
  "last_contacted_at": "2024-01-20T09:00:00Z",
  "created_at": "2023-09-01T14:00:00Z",
  "updated_at": "2024-01-20T09:00:00Z"
}

Contact Status

StatusDescription
activeCurrent contact you send documents to regularly
inactiveFormer contact, kept for historical reference
leadProspect you haven't yet sent a document to

List Contacts

Retrieve a paginated list of contacts in your workspace.

Endpoint

GET /api/v1/contacts

Required Scope

seal:contacts:read

Query Parameters

ParameterTypeDescription
limitnumberNumber of results (max 100, default 20)
cursorstringPagination cursor from previous response
statusstringFilter by status: active, inactive, or lead
searchstringSearch by name or email (case-insensitive, partial match)

TypeScript Example

// Search for active contacts at a specific company
const response = await fetch(
  "https://seal.convex.site/api/v1/contacts?status=active&search=acme&limit=50",
  {
    headers: {
      Authorization: "Bearer ak_your_api_key_here",
    },
  },
);

const { contacts, has_more, next_cursor } = await response.json();

cURL Example

curl -X GET "https://seal.convex.site/api/v1/contacts?status=active&limit=20" \
  -H "Authorization: Bearer ak_your_api_key_here"

Response

{
  "contacts": [
    {
      "id": "con_abc123",
      "first_name": "Jane",
      "last_name": "Smith",
      "full_name": "Jane Smith",
      "email": "jane@acme.com",
      "company": "ACME Corp",
      "title": "VP Operations",
      "status": "active",
      "created_at": "2023-09-01T14:00:00Z",
      "updated_at": "2024-01-20T09:00:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Get Contact

Retrieve a single contact by ID.

Endpoint

GET /api/v1/contacts/get?id={id}

Required Scope

seal:contacts:read

Query Parameters

ParameterTypeDescription
idstringRequired. Contact ID

TypeScript Example

const response = await fetch(
  "https://seal.convex.site/api/v1/contacts/get?id=con_abc123",
  {
    headers: {
      Authorization: "Bearer ak_your_api_key_here",
    },
  },
);

const contact = await response.json();

cURL Example

curl -X GET "https://seal.convex.site/api/v1/contacts/get?id=con_abc123" \
  -H "Authorization: Bearer ak_your_api_key_here"

Create Contact

Add a new contact to the workspace directory.

Endpoint

POST /api/v1/contacts

Required Scope

seal:contacts:write

Request Body

FieldTypeRequiredDescription
first_namestringYesFirst name
last_namestringYesLast name
emailstringYesEmail address
phonestringNoPhone number
companystringNoCompany or organization
titlestringNoJob title
statusstringNoactive, inactive, or lead (default: active)
notesstringNoFree-form notes
tagsstring[]NoTags for categorization

TypeScript Example

const response = await fetch("https://seal.convex.site/api/v1/contacts", {
  method: "POST",
  headers: {
    Authorization: "Bearer ak_your_api_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    first_name: "Jane",
    last_name: "Smith",
    email: "jane@acme.com",
    company: "ACME Corp",
    title: "VP Operations",
    tags: ["enterprise"],
  }),
});

const { id } = await response.json();

cURL Example

curl -X POST "https://seal.convex.site/api/v1/contacts" \
  -H "Authorization: Bearer ak_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Jane",
    "last_name": "Smith",
    "email": "jane@acme.com",
    "company": "ACME Corp",
    "title": "VP Operations"
  }'

Response

{
  "id": "con_abc123"
}

Delete Contact

Permanently remove a contact from the workspace directory.

Endpoint

DELETE /api/v1/contacts/delete?id={id}

Required Scope

seal:contacts:write

Query Parameters

ParameterTypeDescription
idstringRequired. Contact ID

TypeScript Example

const response = await fetch(
  "https://seal.convex.site/api/v1/contacts/delete?id=con_abc123",
  {
    method: "DELETE",
    headers: {
      Authorization: "Bearer ak_your_api_key_here",
    },
  },
);

const result = await response.json();
// { "success": true }

cURL Example

curl -X DELETE "https://seal.convex.site/api/v1/contacts/delete?id=con_abc123" \
  -H "Authorization: Bearer ak_your_api_key_here"

Response

{
  "success": true
}

Warning: Deleting a contact is permanent. Historical documents that referenced this contact's email are not affected — only the contact directory entry is removed.

Next Steps

Last updated on

On this page