API Limits & Constraints
Know the limits before you build.
Rate Limits
| Authentication | Requests | Window | Best For |
|---|---|---|---|
| OAuth Client (Bot User) | 600 | per minute | Production sync |
| Personal Access Token | 60 | per minute | Testing |
See Errors & Rate Limiting Guide for handling 429 responses.
Pagination
| Parameter | Limit | Default |
|---|---|---|
page_size |
500 max | 500 |
For large networks, you'll make multiple requests. At 500 contacts per page:
| Network Size | Pages Required |
|---|---|
| 10,000 | 20 |
| 50,000 | 100 |
| 100,000 | 200 |
Request Limits
| Limit | Value | Notes |
|---|---|---|
| Request body size | 10 MB | For POST/PUT/PATCH |
| Batch operation size | 100 IDs | For batch endpoints |
| URL length | 8,000 chars | Including query params |
File Uploads
| Limit | Value |
|---|---|
| Max file size | 100 MB |
| Allowed types | Common documents and images |
Pictures
A contact's photo, a company's logo and a project's cover are stored first, then set on the record. Upload the picture with POST /api/v1/images (multipart: file and purpose = contact, company or project), or fetch it from a public address with POST /api/v1/images:import ({ "url": "https://...", "purpose": "company" }). Both answer 201 Created with { id, width, height, contentType, url }. Pass the id as profilePictureId when you create or PATCH a contact or company, as coverImageId on a project, or as pictureId on PUT /api/v1/comps/{id}/property/picture for the picture of a deal's property (purpose = project, the cover size); null removes the picture.
curl -X POST "https://app.propstreet.com/api/v1/images" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@logo.png" \
-F "purpose=company"
| Limit | Value |
|---|---|
| Max size | 10 MB and 50 megapixels; a larger upload is answered 413, a larger import 400 |
| Allowed types | PNG, JPEG, GIF and WebP, checked by content; SVG is not accepted |
| Stored form | Resized to the size the Propstreet app uses for the purpose and re-encoded; the answer gives the stored size and type |
| Import | https on the standard port, at most three redirects, url at most 2,000 characters; a limited number per minute (429) |
When too many pictures are being processed at once, the answer is 503 with a Retry-After header.
Field Limits
| Field | Limit |
|---|---|
| Contact/Company name | 500 characters |
| Email addresses | 254 characters each |
| Phone numbers | 50 characters each |
| Notes content | 50,000 characters |
| Deal (comp) note | 4,000 characters |
| Comp source note | 10,000 characters |
| Comp parties / sources per create | 50 each |
| Tags per entity | 100 |
| External refs per entity | 50 |
Response Times
Typical response times under normal load:
| Operation | Typical | 95th percentile |
|---|---|---|
| GET single entity | < 100ms | < 300ms |
| GET list (500 items) | < 500ms | < 1s |
| POST/PUT/PATCH | < 200ms | < 500ms |
| DELETE | < 100ms | < 300ms |
| Search | < 500ms | < 2s |
Timeouts
| Timeout | Value |
|---|---|
| Request timeout | 30 seconds |
| Connection timeout | 10 seconds |
If you hit timeouts on large operations, try:
- Reducing page size
- Using delta sync instead of full sync
- Contacting support for optimization advice
Need Higher Limits?
For large-scale integrations or initial migrations, contact feedback@propstreet.com. We can temporarily increase limits for:
- Initial data migrations (100k+ contacts)
- Bulk import operations
- Time-sensitive sync requirements