Make the next decision clearer.
- Start with a single business workflow and a written API contract.
- Keep credentials on your server and grant only the scopes the integration needs.
- Treat record identity, pagination and update conflicts as explicit design decisions.
- Prove recovery from a timeout before trusting a repeated write.
What is a CRM API?
A CRM API is a defined interface that lets another application read or change CRM information. A website might submit an enquiry, a reporting service might retrieve opportunities, or an internal tool might update a record. The interface specifies the accepted requests, authentication, data formats and responses. It does not decide your business rules for you.
An API is different from a finished integration. The API supplies the permitted operations; the integration decides when to call them, which records correspond, what to do with failures and who owns the resulting work. An endpoint that creates a contact is useful, but a contact without the right owner or next action can still disappear from the team’s process.
Write the outcome first: “A validated website enquiry creates traceable work for our team.” Then identify the minimum operations needed. Meibo has a dedicated enquiries endpoint for that workflow. Using a general record-writing API to rebuild an existing atomic operation creates more failure points than the task needs.
Specify the contract before writing the connector
For each operation, record the source, destination, required permission, accepted fields and success condition. Include the identity rule: are you creating a genuinely new item or updating a known record? A company name is a display label, not a reliable integration key. Preserve the destination ID and the source system’s ID in an integration-owned mapping where necessary.
Keep transport success separate from business success. A successful HTTP response may mean one record was saved, while your workflow needs a linked task as well. Define the final state and a way to reconcile it. If several requests are necessary, record which steps have completed so a retry resumes the workflow instead of starting every step again.
Inspect the actual response body rather than assuming the destination echoes your request. Server-generated identifiers, versions and normalised values become inputs to the next operation. Store those values with a correlation ID so support can investigate one workflow without searching unrelated customer data.
An integration contract in five decisions
| Decision | Record the answer | Why it matters |
|---|---|---|
| Outcome | An enquiry becomes owned work | Defines completion beyond an HTTP response |
| Identity | Submission ID + destination record IDs | Separates a retry from new work |
| Access | Workspace + required scope | Limits what this connection can do |
| Failure | Retry, correct or review | Prevents endless unsuccessful requests |
| Evidence | Correlation ID + confirmed result | Makes one handoff traceable |
Use scoped access and a server-side boundary
An integration credential belongs in the service making the authorised request. For a public website, that normally means your server route calls the CRM while the browser calls your server. Putting a secret in browser JavaScript, a public environment variable or a form action exposes it to visitors. Hiding the button does not hide the credential.
Meibo API keys are workspace-bound and sent in the Authorization header using the Bearer scheme. The implementation checks the requested scope, expiry, revocation and whether the creator still has an owner or admin membership. Reading records requires records:read; writing them requires records:write; the enquiry workflow uses enquiries:write. Grant the narrowest combination needed [1].
Name the operational owner of the key and document replacement. Test revocation with a non-production credential: the old connection should stop working visibly, not quietly continue with a fallback key. Keep secrets out of screenshots, worksheets and request logs. Log the key identifier or integration name rather than the credential itself.
Read every page without mistaking a list for a change feed
Meibo’s record list accepts an optional kind, a limit from 1 to 100 and a cursor. The response contains data and next_cursor. Continue using the returned cursor until it is null. Fetching the first successful page does not establish that you retrieved every matching record [1].
The current cursor follows record IDs. It is not an updated-since cursor or a promise of a consistent snapshot while other people are editing. Design a repeated export or reconciliation with that limitation in mind. Do not use the last ID from yesterday’s listing as a way to find every record changed today.
For a large initial load, save progress after the destination has accepted the relevant batch. If your process stops halfway through, restarting should recognise records already applied. Reconcile identifiers and selected field values as well as totals: two lists can have the same count while containing different records.
curl --fail-with-body \
"https://app.meibolabs.com/api/v1/records?limit=50" \
-H "Authorization: Bearer $MEIBO_API_KEY"Handle updates, conflicts and ambiguous timeouts
A record update must target a known identity. In Meibo, updating an existing record uses its id and version; a conflicting version produces a 409 response. Read the current state and decide whether the intended change is still valid. Blindly retrying an old payload with a newer version can overwrite work that a teammate just completed [1].
A timeout is ambiguous: the server may have saved a write before the response was lost. Repeating a create request without a documented retry contract can create a second record. Idempotency means repeating an operation has the same intended effect, not that every POST endpoint automatically provides that behaviour [2].
Use an endpoint’s explicit idempotency mechanism where available. Meibo’s enquiry endpoint requires an Idempotency-Key; its general records endpoint should not be assumed to share that contract. For multi-step integrations, design identity mapping, read-back checks and a durable operation log before deciding which failed requests can safely be retried.
Respond to the cause, not just the status
| Response | Likely action | Avoid |
|---|---|---|
| 401 / 403 | Check key, scope and membership | Repeating an unauthorised request |
| Validation error | Correct the request against the schema | Dropping required data to force success |
| 409 conflict | Read current state; apply the conflict rule | Overwriting a newer edit blindly |
| 429 rate limit | Respect Retry-After; slow the queue | Adding more traffic immediately |
| Timeout / 5xx | Check retry safety; recover with backoff | Assuming the write never happened |
Classify errors instead of retrying everything
Authentication failures need a credential check. Permission failures need a scope or membership check. A validation error needs a corrected request. A conflict needs a decision about current state. None becomes a successful operation merely because the worker repeats it quickly. Preserve a useful error category and a redacted explanation for the person responsible.
Rate limiting is different. Meibo currently limits a key to 120 requests per minute and returns 429 with Retry-After: 60 when that limit is exceeded. Slow the integration and honour the response rather than spreading the same work across more keys. Keep a bounded queue so an outage does not trigger an uncontrolled burst when service returns [1].
For transient failures, use a limited retry policy with backoff and jitter, then surface unresolved work. A dashboard saying “connected” is insufficient. The operator needs the age of the oldest pending item, the last confirmed success and a way to identify the records requiring attention.
Prove the complete workflow before launch
Run a representative create, read and update in a test workspace. Verify the resulting links, owner and visible next action in the CRM. Then repeat with invalid fields, an expired credential, insufficient permissions and an old record version. Record the expected outcome before each test and the observed outcome afterwards.
Test an ambiguous timeout deliberately in a controlled environment. Establish whether the write happened, then exercise your recovery path. Test more than one page of records and a worker restart midway through a batch. These cases reveal whether the connector is robust beyond its first successful request.
The worksheet below separates an API response from a business acceptance check. Assign an owner to each unresolved case. Ship a narrow, observable workflow first; add more objects and directions once that workflow can recover without someone editing the database by hand.
CRM API acceptance checklist.
Test permissions, pagination, conflicts and recovery. Record the expected business result alongside the response and the evidence.
Download CSVOpens in spreadsheet software. Planning worksheet, not a direct CRM import file. All example rows are illustrative.Common questions.
What is the difference between an API and an integration?+
An API defines the operations another system can request. An integration uses those operations to complete a workflow, including mapping, scheduling, error handling and recovery.
Can I call a CRM API from a public website?+
Route requests that need a secret key through your server. Validate and protect the public endpoint separately; never embed a workspace API key in browser code.
Does a successful request mean the integration works?+
It proves that request succeeded. Verify the resulting records, relationships, ownership and downstream action, then test failure and retry paths.
How do I avoid duplicates when retrying a request?+
Use the endpoint’s documented idempotency mechanism or an identity-based recovery design. Do not assume adding an Idempotency-Key header changes an endpoint that does not implement it.
What should happen after a 409 conflict?+
Read the current record and compare it with the intended change. Apply an agreed conflict rule or request review; do not overwrite a newer version automatically.
Do I need polling if I have webhooks?+
Often you still need an initial load and periodic reconciliation. Events can make updates faster, while reconciliation checks whether the systems agree. Verify the provider’s delivery and history capabilities.
Sources & methodology.
Meibo’s recommended framework, with primary documentation for the specific product facts cited above. This is AI-assisted editorial content. Examples, diagrams and calculations are illustrative; they are not customer results or independent research findings.
- Meibo developer documentation
The Meibo-specific contract. Examples were checked against the API and webhook implementation; they are not a claim that every external integration has been deployed or verified.
- MDN — Idempotent
Defines idempotency in terms of the intended server effect of repeated requests. Endpoint-specific guarantees still need their own contract.
Sources checked 7 October 2026. Read the editorial policy or suggest a correction.