The people and companies you bill, and how to add one.
2 endpoints, each with the fields it takes and the fields it gives back.
GET/customers
Lists the customers in your account, the billing contacts invoices go to.
- A key limited to certain businesses still sees every customer: customers belong to your account, not to one business.
- In
search,%and_are wildcards, because the match runs as a SQLilike. - To read the next page, pass the previous response's
nextCursor. Anullthere means you already have everything.
Needs the customers:read permission. A Read only key has it.
Query parameters
search
Typestring
RequiredOptional
Details
- up to 200 characters
includeArchived
Typestring
RequiredOptional
Details
- one of: true, false
cursor
Typestring
RequiredOptional
Details
- an opaque value from a previous response
limit
Typeinteger
RequiredOptional
Details
- 1 to 100, default 50
| Field | Type | Required | Details |
|---|---|---|---|
| search | string | Optional |
|
| includeArchived | string | Optional |
|
| cursor | string | Optional |
|
| limit | integer | Optional |
|
Request
curl "https://www.numm.io/api/v1/customers?search=Acme" \
-H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"Response 200
{
"customers": [
{
"id": "0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1005",
"name": "Acme Co",
"email": "ap@acme.example",
"currency": "USD",
"paymentTermsDays": 30
}
],
"nextCursor": null
}Response fields
customers
Typearray of object
PresentAlways
customers[].id
Typestring
PresentAlways
Details
- a uuid
customers[].name
Typestring
PresentAlways
customers[].email
Typestring or null
PresentAlways
customers[].currency
Typestring
PresentAlways
Details
- one of: USD, CAD, EUR, GBP, MXN
customers[].paymentTermsDays
Typeinteger or null
PresentAlways
nextCursor
Typestring or null
PresentAlways
Details
- an opaque value from a previous response
| Field | Type | Present | Details |
|---|---|---|---|
| customers | array of object | Always | |
| customers[].id | string | Always |
|
| customers[].name | string | Always | |
| customers[].email | string or null | Always | |
| customers[].currency | string | Always |
|
| customers[].paymentTermsDays | integer or null | Always | |
| nextCursor | string or null | Always |
|
Errors
This call can return:
invalid_key
Status401
MeaningYour key is missing, malformed, revoked, or expired.
insufficient_scope
Status403
MeaningYour key does not carry the scope this endpoint needs.
rate_limited
Status429
MeaningYou've made too many requests for this key. The retry-after header says how long to wait.
validation_failed
Status422
MeaningSomething in the path, the query, or the body did not pass validation.
internal_error
Status500
MeaningSomething went wrong on our side. Try again.
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_key | Your key is missing, malformed, revoked, or expired. |
| 403 | insufficient_scope | Your key does not carry the scope this endpoint needs. |
| 429 | rate_limited | You've made too many requests for this key. The retry-after header says how long to wait. |
| 422 | validation_failed | Something in the path, the query, or the body did not pass validation. |
| 500 | internal_error | Something went wrong on our side. Try again. |
POST/customers
Creates a customer, a billing contact invoices go to.
- If a customer with this name already exists, that one is returned and nothing is changed:
createdisfalseand the other fields you sent are ignored. - The match ignores case and skips archived customers.
- A customer that was created answers 201. One that already existed answers 200.
Needs the customers:write permission. Only a Read and write key has it.
Body fields
name
Typestring
RequiredRequired
Details
- up to 200 characters
email
Typestring
RequiredOptional
Details
- an email address
- up to 320 characters
phone
Typestring
RequiredOptional
Details
- up to 40 characters
addressLine1
Typestring
RequiredOptional
Details
- up to 200 characters
addressLine2
Typestring
RequiredOptional
Details
- up to 200 characters
city
Typestring
RequiredOptional
Details
- up to 200 characters
state
Typestring
RequiredOptional
Details
- up to 200 characters
postalCode
Typestring
RequiredOptional
Details
- up to 200 characters
currency
Typestring
RequiredOptional
Details
- one of: USD, CAD, EUR, GBP, MXN
paymentTermsDays
Typeinteger
RequiredOptional
Details
- 0 to 365
remindersEnabled
Typeboolean
RequiredOptional
| Field | Type | Required | Details |
|---|---|---|---|
| name | string | Required |
|
| string | Optional |
| |
| phone | string | Optional |
|
| addressLine1 | string | Optional |
|
| addressLine2 | string | Optional |
|
| city | string | Optional |
|
| state | string | Optional |
|
| postalCode | string | Optional |
|
| currency | string | Optional |
|
| paymentTermsDays | integer | Optional |
|
| remindersEnabled | boolean | Optional |
Request
curl -X POST "https://www.numm.io/api/v1/customers" \
-H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 0190a1b2-c3d4-7e5f-8a9b-0c1d2e3fee00" \
-d '{
"name": "Acme Co",
"email": "ap@acme.example"
}'Response 201
{
"id": "0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1005",
"created": true
}- 200 A customer with this name already exists, so nothing was created.
- 201 A customer was created.
Response fields
id
Typestring
PresentAlways
Details
- a uuid
created
Typeboolean
PresentAlways
| Field | Type | Present | Details |
|---|---|---|---|
| id | string | Always |
|
| created | boolean | Always |
This call takes an optional Idempotency-Key header. Repeat the same request with the same key within 24 hours and you get the first response back, with an idempotent-replayed: true header, and the work does not run twice. The same key with a different request is refused. See Idempotency and safe retries.
Errors
conflict
Status409
MeaningThe request clashed with something that already happened.
| Status | Code | Meaning |
|---|---|---|
| 409 | conflict | The request clashed with something that already happened. |
Every endpoint can also return:
invalid_key
Status401
MeaningYour key is missing, malformed, revoked, or expired.
insufficient_scope
Status403
MeaningYour key does not carry the scope this endpoint needs.
rate_limited
Status429
MeaningYou've made too many requests for this key. The retry-after header says how long to wait.
validation_failed
Status422
MeaningSomething in the path, the query, or the body did not pass validation.
internal_error
Status500
MeaningSomething went wrong on our side. Try again.
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_key | Your key is missing, malformed, revoked, or expired. |
| 403 | insufficient_scope | Your key does not carry the scope this endpoint needs. |
| 429 | rate_limited | You've made too many requests for this key. The retry-after header says how long to wait. |
| 422 | validation_failed | Something in the path, the query, or the body did not pass validation. |
| 500 | internal_error | Something went wrong on our side. Try again. |