Back to Developer Home

Storepoint Location Management API

Our Location Management API provides a simple way to programmatically create, update, and manage your Storepoint locator locations. Use it to sync your location data from existing systems, automate updates, or build custom integrations.

Get Started →

Important Security Note

This is a private management API intended for server-side integrations. Never expose your authentication token in frontend applications.

Overview

The Store Locator Management API provides programmatic access to manage your location data for custom location sync workflows and server-side integrations. This API enables you to:

  • Retrieve paginated lists of locations
  • Get detailed information for specific locations
  • Create new locations programmatically
  • Update existing location data
  • Delete locations
  • Access custom field configurations

Authentication

All endpoints require authentication via a private API token in the Authorization header:

Authorization: Bearer YOUR_PRIVATE_API_TOKEN

You can obtain your private API token from the Developer area in your Storepoint Dashboard. This token grants full administrative access to manage your locator configuration and locations - keep it strictly secure and never expose it in frontend code, public repositories, or client-side applications.

You can rotate or revoke API tokens in the Developer area of your dashboard. This is recommended if a token has been compromised or accidentally exposed.

Base URL

The base URL for all API endpoints is:

https://api.storepoint.co/admin/v1

List Locations

Retrieves a paginated list of all active locations for the authenticated locator.

GET /locations

Query Parameters

  • limit optional

    Number of results per page

    Default: 10 Maximum: 500
  • page optional

    Page number

    Default: 1

Example Response

{
    "success": true,
    "locations": [
        {
            "id": "loc_abc123",
            "name": "Store Name",
            "address": "123 Main St",
            "coordinates": {
                "lat": 12.345678,
                "lng": -12.345678
            },
            "description": "Store description",
            "tags": ["tag1", "tag2"],
            "contact": {
                "phone": "555-1234",
                "email": "[email protected]",
                "website": "https://example.com"
            },
            "hours": {
                "monday": "9:00-17:00",
                "tuesday": "9:00-17:00",
                "wednesday": "9:00-17:00",
                "thursday": "9:00-17:00",
                "friday": "9:00-17:00",
                "saturday": "10:00-15:00",
                "sunday": "closed"
            },
            "custom_fields": {},
            "image_url": "https://example.com/image.jpg"
        }
    ],
    "pagination": {
        "page": 1,
        "limit": 10,
        "total": 100,
        "total_pages": 10,
        "next": "/admin/v1/locations?page=2",
        "previous": null
    }
}

Get Single Location

Retrieves detailed information for a specific location.

GET /locations/{id}

Example Response

{
    "success": true,
    "location": {
        "id": "loc_abc123",
        "name": "Store Name",
        "address": "123 Main St",
        "coordinates": {
            "lat": 12.345678,
            "lng": -12.345678
        },
        "description": "Store description",
        "tags": ["tag1", "tag2"],
        "contact": {
            "phone": "555-1234",
            "email": "[email protected]",
            "website": "https://example.com"
        },
        "hours": {
            "monday": "9:00-17:00",
            "tuesday": "9:00-17:00",
            "wednesday": "9:00-17:00",
            "thursday": "9:00-17:00",
            "friday": "9:00-17:00",
            "saturday": "10:00-15:00",
            "sunday": "closed"
        },
        "custom_fields": {},
        "image_url": "https://example.com/image.jpg"
    }
}

Create Location

Creates a new location with the provided details.

POST /locations

Request Body

{
    "name": "Store Name",                    // Required: Location name
    "address": "123 Main St",                // Required: Full street address
    "coordinates": {                         // Required
        "lat": 12.345678,                   // Required: Latitude
        "lng": -12.345678                   // Required: Longitude
    },
    "description": "Store description",      // Optional: HTML allowed
    "tags": ["tag1", "tag2"],               // Optional: Array of strings
    "contact": {                            // Optional
        "phone": "555-1234",                // Optional: Phone number
        "email": "[email protected]",       // Optional: Valid email
        "website": "https://example.com"    // Optional: Valid URL
    },
    "hours": {                              // Optional
        "monday": "9:00-17:00",             // Optional: Format "HH:MM-HH:MM" or "closed"
        "tuesday": "9:00-17:00",
        "wednesday": "9:00-17:00",
        "thursday": "9:00-17:00",
        "friday": "9:00-17:00",
        "saturday": "10:00-15:00",
        "sunday": "closed"
    },
    "custom_fields": {                      // Optional: Key-value pairs matching configured fields
        "cf812sj12": "Free parking",          // Example: Field ID -> Field Value
        "feu3hsw32": "yes",
        "hs2372a42": "Available"
    },
    "image_url": "https://example.com/store-photo.jpg"  // Optional: Direct link to image file
}

Example Response

{
    "success": true,
    "location": {
        "id": "loc_abc123",
        "name": "Store Name",
        "address": "123 Main St",
        "coordinates": {
            "lat": 12.345678,
            "lng": -12.345678
        },
        "description": "Store description",
        "tags": ["tag1", "tag2"],
        "contact": {
            "phone": "555-1234",
            "email": "[email protected]",
            "website": "https://example.com"
        },
        "hours": {
            "monday": "9:00-17:00",
            "tuesday": "9:00-17:00",
            "wednesday": "9:00-17:00",
            "thursday": "9:00-17:00",
            "friday": "9:00-17:00",
            "saturday": "10:00-15:00",
            "sunday": "closed"
        },
        "custom_fields": {
            "cf812sj12": "Free parking",
            "feu3hsw32": "yes",
            "hs2372a42": "Available"
        },
        "image_url": "https://example.com/store-photo.jpg"
    }
}

Update Location

Updates an existing location. All fields are optional - only provided fields will be updated.

POST /locations/{id}

Request Body

{
    "name": "Updated Store Name",            // Optional: New location name
    "address": "123 Main St",                // Optional: New street address
    "coordinates": {                         // Optional
        "lat": 12.345678,                   // Optional: New latitude
        "lng": -12.345678                   // Optional: New longitude
    },
    "description": "Updated description",    // Optional: HTML allowed
    "tags": ["updated_tag"],                // Optional: New array of strings
    "contact": {                            // Optional
        "phone": "555-5678",                // Optional: New phone number
        "email": "[email protected]",      // Optional: New valid email
        "website": "https://updated.com"     // Optional: New valid URL
    },
    "hours": {                              // Optional
        "monday": "9:00-18:00",             // Optional: Format "HH:MM-HH:MM" or "closed"
        "tuesday": "9:00-18:00",
        "wednesday": "9:00-18:00",
        "thursday": "9:00-18:00",
        "friday": "9:00-18:00",
        "saturday": "10:00-16:00",
        "sunday": "closed"
    },
    "custom_fields": {                      // Optional: Key-value pairs matching configured fields
        "parking": "Updated parking info",   // Example: Field ID -> New Field Value
        "wheelchair": "no",
        "delivery": "Not available"
    },
    "image_url": "https://example.com/updated-photo.jpg"  // Optional: New direct link to image file
}

Example Response

{
    "success": true,
    "location": {
        "id": "loc_abc123",
        "name": "Updated Store Name",
        "address": "123 Main St",
        "coordinates": {
            "lat": 12.345678,
            "lng": -12.345678
        },
        "description": "Updated store description",
        "tags": ["updated_tag"],
        "contact": {
            "phone": "555-5678",
            "email": "[email protected]",
            "website": "https://updated-example.com"
        },
        "hours": {
            "monday": "9:00-18:00",
            "tuesday": "9:00-18:00",
            "wednesday": "9:00-18:00",
            "thursday": "9:00-18:00",
            "friday": "9:00-18:00",
            "saturday": "10:00-16:00",
            "sunday": "closed"
        },
        "custom_fields": {
            "parking": "Updated parking info",
            "wheelchair": "no",
            "delivery": "Not available"
        },
        "image_url": "https://example.com/updated-store-photo.jpg"
    }
}

Delete Location

Deletes a location.

POST /locations/{id}/delete

Example Response

{
    "success": true,
    "message": "Location deleted successfully"
}

Get Custom Fields

Retrieves the list of custom fields configured for the locator.

GET /custom_fields

Example Response

{
    "success": true,
    "custom_fields": [
        {
            "id": "field_token",
            "name": "Field Name",
            "type": "text"
        }
    ]
}

Security Best Practices

  • Never use this management API in frontend applications or expose the token in client-side code
  • Store the API token securely in backend environment variables
  • Rotate your API token immediately if it's ever exposed
  • Only share API token access with trusted administrators
  • Monitor API usage in your Developer dashboard for suspicious activity

Error Responses

All endpoints may return the following error responses:

Authentication Error (401)

{
    "error": "error",
    "message": "No locator found"
}

Validation Error (422)

{
    "error": "validation_error",
    "message": "Invalid input data",
    "details": {
        "field_name": ["Error message"]
    }
}

Not Found Error (404)

{
    "error": "not_found",
    "message": "Location not found"
}

Server Error (500)

{
    "error": "error",
    "message": "Error message"
}

Technical Notes

  • All location IDs are prefixed with loc_ followed by random lowercase alphanumeric characters
  • Coordinates should be provided in decimal degrees format
  • Hours can be provided as any text string. Common formats like "24-hour time ranges (HH:MM-HH:MM)" or "closed" are recommended for consistency but not required
  • Tags are case-insensitive and will be stored in lowercase
  • You can adjust tag display case and organize tags into filters/groups in the Tags & Filters area of your dashboard
  • Custom fields must match the fields configured in the locator settings
  • All URLs (website, image_url) must include the protocol (https://) unless you are using a relative path