Usage examples for every resource live in the README. This page covers what the README doesn’t: what the SDK does on your behalf and the details worth knowing before you ship.
Install and verify
me() is free, so it is the quickest way to confirm your key works. It returns your credit balance and the capabilities of your plan.
What the SDK handles for you
Good to know
Responses are plain arrays
Methods return associative arrays with the API’s own field names, such as$page['nextCursor']. Optional fields can be absent or null, so read them with ??.
Arguments can be passed by name, such as pageSize: 25. Arrays you pass in, such as filter or semantic, use the API’s field names.
API key resolution
The API key is read from theCOMPANYENRICH_API_KEY environment variable, through getenv() first and $_ENV second. If your secrets come from somewhere else, such as a framework config, pass the key explicitly:
CompanyEnrichException immediately if no key is found, so a missing key fails at startup and not on the first request.
Retry timing
- Failed requests are retried up to twice by default.
- Backoff starts at about 0.5 seconds, doubles on each attempt, and is capped at 8 seconds.
- On a 429, the SDK waits for the period the API specifies instead of guessing.
- If the API asks for a wait longer than 60 seconds, the SDK throws
RateLimitExceptionright away so your process isn’t left hanging. Catch it and reschedule the work. - GET requests, and POST requests that cost nothing, are retried after a 408, a 5xx, a timeout, or a dropped connection.
- POST requests that consume credits or start a job are retried only on a 429. They are not repeated after a 5xx, timeout, or dropped connection, because the first attempt may already have been charged.
maxRetriescan be overridden per call, not only on the client. Passoptions: ['maxRetries' => 0]to turn retries off for a single request.
waitForCompletion() sleep inside the current process. In a web request, keep timeout and maxRetries low, and run bulk jobs from a queue worker or CLI command.
Timeouts and large downloads
timeout is in seconds and defaults to 120. For regular requests it covers the whole request. For stream() and csvChunks() downloads it only applies when no data arrives, so large exports are not cut off partway, and time your own code spends on each record does not count. Pass timeout: null to disable it.
A download that fails partway through throws ApiConnectionException or ApiTimeoutException and is never restarted, so you won’t receive duplicate records. If you break out of a stream() loop early, the SDK aborts the transfer once the generator is released.
For large exports, prefer stream() and csvChunks() over results() and csv(), which load the whole result into memory.
Waiting for bulk jobs
batches->waitForCompletion() checks the batch every 2 seconds and waits indefinitely by default. In production, set a ceiling:
batches->get($id). To stop the job itself, call batches->cancel($id). Results that were already charged stay downloadable.
Pagination and credits
The*All methods return generators that request pages as you consume them. Search credits are charged for every result on a fetched page, even if you stop iterating partway through it. Set pageSize close to the number of results you plan to use.
Person IDs
people->get() and people->findEmail() accept a person ID as an int or a string. If you store IDs as strings or receive them from another system, pass them through unchanged.
Proxies and tracing
baseUrlpoints the client at your own proxy or gateway. It is also the simplest way to aim the client at a stub server in tests.defaultHeaders(client) andoptions: ['headers' => [...]](per request) let you attach your own correlation IDs.- Requests identify themselves as
companyenrich-php/<version>. The same version string is available asCompanyEnrich\Version::VERSION.
Support
- Bugs and feature requests: GitHub issues
- When reporting a failed request, include the
traceIdfrom the exception. It lets us find the exact call in our logs.