Developers · API v1.0.0

API reference

Read your leads, companies, campaigns, conversations, deals, meetings and balances, add leads, and receive signed webhooks. JSON over HTTPS.

Getting started

  1. Sign in and open Developer API in your menu. API access is part of plans that list "Developer API access".
  2. Create a key with the read permission (add write to add leads or manage webhooks). Copy it: it is shown once.
  3. Call the API:
curl https://wigrow.widevelop.us/api/v1/me \
  -H "Authorization: Bearer wg_your_key"

Authentication

Every request needs Authorization: Bearer wg_…. A key belongs to one business and only ever sees that business's data. Keys are stored as a one-way hash; if you lose one, create a new one. A missing, wrong, revoked or expired key gets 401; a key without the needed permission gets 403 insufficient_scope.

Errors

Errors always look like this, with a stable code you can program against:

{"error": {"code": "validation_failed", "message": "Some fields are not valid.", "details": {"email": ["…"]}}}
StatusCodes
400bad_request, invalid_idempotency_key
401unauthenticated
403insufficient_scope, plan_required, account_suspended
404not_found (also for records of another business)
409duplicate, idempotency_mismatch, idempotency_in_progress
422validation_failed, suppressed
429rate_limited
5xxserver_error, api_disabled

Rate limits

Each key may make a set number of requests per minute (60 by default; the exact number is in X-RateLimit-Limit). Every response has X-RateLimit-Limit and X-RateLimit-Remaining. Over the limit you get 429 with Retry-After (seconds).

Pagination

Lists take page and per_page (1–100, default 25) and return data, meta (page, per_page, total, last_page) and links (next, prev). Follow links.next until it is null.

Idempotency

Send Idempotency-Key: <any unique string> with a POST to retry it safely. Within 24 hours, the same key with the same body returns the first response again (with Idempotent-Replayed: true); the same key with a different body is refused with 409.

Versioning

The version is part of the path: /api/v1. Within v1 we may add fields and endpoints; we never remove or rename them. Ignore fields you do not know.

Webhooks

Add an endpoint (a public https:// address) in the app or with POST /webhooks. We send a JSON POST for each event you chose:

  • contact.created — A lead was added (research, import, the API or by hand).
  • reply.received — A lead replied to an email.
  • meeting.scheduled — A meeting was confirmed in the calendar.
  • opportunity.won — A deal was marked won.

Each delivery has Wi-Grow-Event, Wi-Grow-Delivery (also the id in the body; it stays the same on retries) and Wi-Grow-Signature: t=<unix time>,v1=<signature>. Verify it before trusting the body:

// PHP
[$t, $v1] = sscanf($_SERVER['HTTP_WI_GROW_SIGNATURE'], 't=%d,v1=%s');
$expected = hash_hmac('sha256', $t.'.'.file_get_contents('php://input'), $secret);
$valid = hash_equals($expected, $v1) && abs(time() - $t) < 300;

Answer with any 2xx within 10 seconds. Otherwise we retry after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours. After 15 failed deliveries in a row the endpoint is switched off; you can switch it back on in the app.

Revoking and rotating keys

In Developer API, Revoke stops a key at once. Rotate creates a new secret with the same name and permissions and stops the old one at once, so update your systems first. Key changes appear in your account's security history.

Troubleshooting

  • 401: check the header spelling (Bearer, one space) and that the key was not revoked or expired.
  • 403 plan_required: your plan does not include the API; see Billing in the app.
  • 404 for a record you can see in the app: contacts and companies use numbers; campaigns, conversations, deals, meetings and webhooks use the long ids from the API.
  • Webhooks not arriving: open the endpoint in the app to see each delivery's status and the answer your server gave.

Account

GET /me read permission

The key and its workspace

200401403429
curl https://wigrow.widevelop.us/api/v1/me \
  -H "Authorization: Bearer wg_your_key"
GET /balances read permission

Lead, credit and pay-as-you-go balances

200401403429
curl https://wigrow.widevelop.us/api/v1/balances \
  -H "Authorization: Bearer wg_your_key"
GET /usage read permission

Usage transactions (balance history)

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
kindquerystring: leads, credits, balanceOnly leads, credits or the pay-as-you-go balance (amounts in minor units).
sincequerystring (date-time)Entries on or after this time.
200401403429422
curl https://wigrow.widevelop.us/api/v1/usage \
  -H "Authorization: Bearer wg_your_key"
GET /business-profile read permission

Your business profile

200401403429
curl https://wigrow.widevelop.us/api/v1/business-profile \
  -H "Authorization: Bearer wg_your_key"

Leads

GET /customer-profiles read permission

Ideal customer profiles

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
200401403429422
curl https://wigrow.widevelop.us/api/v1/customer-profiles \
  -H "Authorization: Bearer wg_your_key"
GET /contacts read permission

Leads (contacts)

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
lead_statusquerystring: new, qualified, needs_review, disqualifiedFilter by lead status.
company_idqueryintegerOnly leads at this company.
qquerystringSearch name or email.
updated_sincequerystring (date-time)Changed on or after this time (for syncing).
200401403429422
curl https://wigrow.widevelop.us/api/v1/contacts \
  -H "Authorization: Bearer wg_your_key"
POST /contacts write permission

Add a lead

Same checks as a CSV import: email format, your do-not-contact list and duplicates. No leads or credits are charged. Send an Idempotency-Key header to retry safely.

ParameterInTypeDescription
Idempotency-KeyheaderstringAny unique string (1–120 visible ASCII characters) to make retries safe.
JSON body
first_namestring
last_namestring
full_namestring
emailstring
job_titlestring
company_namestring
websitestring
industrystring
company_sizestring
countrystring
linkedinstring
icp_idintegerScore the lead against this customer profile.
201202409422401403429
curl -X POST https://wigrow.widevelop.us/api/v1/contacts \
  -H "Authorization: Bearer wg_your_key" \
  -H "Content-Type: application/json" -H "Idempotency-Key: 6f1c…" \
  -d '{"full_name":"Ana Ramdial","email":"ana@example.tt","company_name":"Coral Bay Foods","country":"TT"}'
GET /contacts/{contact} read permission

One lead

ParameterInTypeDescription
contact *pathinteger
200401403429404422
curl https://wigrow.widevelop.us/api/v1/contacts/{contact} \
  -H "Authorization: Bearer wg_your_key"
GET /companies read permission

Companies

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
qquerystringSearch by name.
domainquerystringExact domain, e.g. acme.com.
200401403429422
curl https://wigrow.widevelop.us/api/v1/companies \
  -H "Authorization: Bearer wg_your_key"
GET /companies/{company} read permission

One company

ParameterInTypeDescription
company *pathinteger
200401403429404422
curl https://wigrow.widevelop.us/api/v1/companies/{company} \
  -H "Authorization: Bearer wg_your_key"

Email

GET /campaigns read permission

Campaigns

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
statusquerystring: draft, active, paused, completed, cancelledFilter by status.
200401403429422
curl https://wigrow.widevelop.us/api/v1/campaigns \
  -H "Authorization: Bearer wg_your_key"
GET /campaigns/{campaign} read permission

One campaign

ParameterInTypeDescription
campaign *pathstring (uuid)
200401403429404422
curl https://wigrow.widevelop.us/api/v1/campaigns/{campaign} \
  -H "Authorization: Bearer wg_your_key"
GET /conversations read permission

Conversations (sales inbox)

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
needs_replyquerybooleanOnly conversations waiting for your answer.
contact_idqueryintegerOnly this lead.
200401403429422
curl https://wigrow.widevelop.us/api/v1/conversations \
  -H "Authorization: Bearer wg_your_key"
GET /conversations/{conversation} read permission

One conversation with its messages

ParameterInTypeDescription
conversation *pathstring (uuid)
200401403429404422
curl https://wigrow.widevelop.us/api/v1/conversations/{conversation} \
  -H "Authorization: Bearer wg_your_key"

CRM

GET /opportunities read permission

Opportunities (deals)

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
statusquerystring: open, won, lostFilter by status.
200401403429422
curl https://wigrow.widevelop.us/api/v1/opportunities \
  -H "Authorization: Bearer wg_your_key"
GET /opportunities/{opportunity} read permission

One opportunity

ParameterInTypeDescription
opportunity *pathstring (uuid)
200401403429404422
curl https://wigrow.widevelop.us/api/v1/opportunities/{opportunity} \
  -H "Authorization: Bearer wg_your_key"
GET /meetings read permission

Meetings

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
fromquerystring (date-time)Starting on or after.
toquerystring (date-time)Starting before.
200401403429422
curl https://wigrow.widevelop.us/api/v1/meetings \
  -H "Authorization: Bearer wg_your_key"
GET /meetings/{meeting} read permission

One meeting

ParameterInTypeDescription
meeting *pathstring (uuid)
200401403429404422
curl https://wigrow.widevelop.us/api/v1/meetings/{meeting} \
  -H "Authorization: Bearer wg_your_key"

Webhooks

GET /webhooks read permission

Webhook endpoints

ParameterInTypeDescription
pagequeryinteger
per_pagequeryinteger
200401403429422
curl https://wigrow.widevelop.us/api/v1/webhooks \
  -H "Authorization: Bearer wg_your_key"
POST /webhooks write permission

Add a webhook endpoint

The URL must be a public https address. The response contains the signing secret, shown only this once.

ParameterInTypeDescription
Idempotency-KeyheaderstringAny unique string (1–120 visible ASCII characters) to make retries safe.
JSON body
urlstring (uri)
eventsarray of string: contact.created, reply.received, meeting.scheduled, opportunity.won
201409422401403429
curl -X POST https://wigrow.widevelop.us/api/v1/webhooks \
  -H "Authorization: Bearer wg_your_key" \
  -H "Content-Type: application/json" -H "Idempotency-Key: 6f1c…" \
  -d '{"url":"https://example.com/hooks/wigrow","events":["contact.created"]}'
GET /webhooks/{webhook} read permission

One endpoint with its last 20 deliveries

ParameterInTypeDescription
webhook *pathstring (uuid)
200401403429404422
curl https://wigrow.widevelop.us/api/v1/webhooks/{webhook} \
  -H "Authorization: Bearer wg_your_key"
DELETE /webhooks/{webhook} write permission

Remove a webhook endpoint

ParameterInTypeDescription
webhook *pathstring (uuid)
204404401403429
curl -X DELETE https://wigrow.widevelop.us/api/v1/webhooks/{webhook} \
  -H "Authorization: Bearer wg_your_key"

Objects

UsageEntry

idinteger
kindstring: leads, credits, balance
typestring: grant, consume, reserve, release, expire, revoke, adjust
quantityintegerPositive adds to the balance, negative spends.
balance_afterinteger
reference_typestring | null
reasonstring | null
created_atstring | null (date-time)

Company

idinteger
namestring
domainstring | null
websitestring | null
industrystring | null
size_rangestring | null
country_codestring | null
locationstring | null
linkedin_urlstring | null
created_atstring | null (date-time)
updated_atstring | null (date-time)

Contact

idinteger
full_namestring
first_namestring | null
last_namestring | null
job_titlestring | null
senioritystring | null
emailstring | null
linkedin_urlstring | null
locationstring | null
stagestring | null
email_statusstring | null: verified, accept_all, unverified, invalid, unknown, none
lead_statusstring: new, qualified, needs_review, disqualified
scoreinteger | null
acquisitionstring: research, credits, import, manual, duplicate_review, api
companyobject
last_interaction_atstring | null (date-time)
created_atstring | null (date-time)
updated_atstring | null (date-time)

Campaign

idstring (uuid)
namestring
objectivestring | null
statusstring: draft, active, paused, completed, cancelled
timezonestring
send_daysarray of integer
window_startstring
window_endstring
daily_limitinteger
paused_reasonstring | null
launched_atstring | null (date-time)
completed_atstring | null (date-time)
created_atstring | null (date-time)

Conversation

idstring (uuid)
subjectstring | null
statusstring
labelstring | null
needs_replyboolean
unreadboolean
contact_idinteger | null
campaign_idstring | null (uuid)
last_message_atstring | null (date-time)
created_atstring | null (date-time)

Opportunity

idstring (uuid)
namestring
statusstring: open, won, lost
stagestring | null
currencystring
estimated_valueinteger | nullMinor units (cents).
actual_valueinteger | nullAgreed amount in minor units, won deals only.
expected_close_datestring | null (date)
company_idinteger | null
contact_idinteger | null
closed_atstring | null (date-time)
lost_reasonstring | null
created_atstring | null (date-time)
updated_atstring | null (date-time)

Meeting

idstring (uuid)
titlestring
statusstring: pending, scheduled, unknown, failed, cancelled, logged
starts_atstring | null (date-time)
ends_atstring | null (date-time)
timezonestring
locationstring | null
conference_urlstring | null
contact_idinteger | null
opportunity_idstring | null (uuid)
attendeesarray of object
created_atstring | null (date-time)

Webhook

idstring (uuid)
urlstring (uri)
eventsarray of string: contact.created, reply.received, meeting.scheduled, opportunity.won
activeboolean
disabled_reasonstring | null
last_delivery_atstring | null (date-time)
created_atstring | null (date-time)